You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/01/05 10:34:19 UTC

[incubator-plc4x] branch refactoring/java_generify updated (71fecb8 -> cead5c1)

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

sruehl pushed a change to branch refactoring/java_generify
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git.


    from 71fecb8  added unchecked variants of plc requests.
     add b3d4564  Test extension: - added Tests for Plc4XS7Protocol - added basic test implementation for S7Protocol
     new d7730f0  Merge branch 'master' into refactoring/java_generify
     new cead5c1  split plcRequest into single and bulk plc request

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


Summary of changes:
 .../java/org/apache/plc4x/camel/PLC4XProducer.java | 32 ++++++++---
 .../apache/plc4x/edgent/PlcConnectionAdapter.java  | 19 +++---
 .../plc4x/edgent/PlcConnectionAdapterTest.java     | 43 +++++++-------
 .../apache/plc4x/edgent/mock/MockConnection.java   | 39 ++++++++-----
 .../plc4x/java/api/connection/PlcReader.java       | 26 ++++++++-
 .../plc4x/java/api/connection/PlcWriter.java       | 27 ++++++++-
 ...PlcReadRequest.java => BulkPlcReadRequest.java} | 31 ++++++----
 ...cReadResponse.java => BulkPlcReadResponse.java} | 10 ++--
 ...cWriteRequest.java => BulkPlcWriteRequest.java} | 33 +++++++----
 ...riteResponse.java => BulkPlcWriteResponse.java} | 12 ++--
 .../apache/plc4x/java/api/messages/PlcMessage.java |  4 +-
 .../plc4x/java/api/messages/PlcReadRequest.java    | 38 ++----------
 .../plc4x/java/api/messages/PlcReadResponse.java   | 20 +------
 .../apache/plc4x/java/api/messages/PlcRequest.java |  2 +-
 .../plc4x/java/api/messages/PlcWriteRequest.java   | 38 ++----------
 .../plc4x/java/api/messages/PlcWriteResponse.java  | 20 +------
 .../java/api/messages/SinglePlcReadRequest.java    | 67 ++++++++++++++++++++++
 ...eadResponse.java => SinglePlcReadResponse.java} | 20 ++++---
 ...riteRequest.java => SinglePlcWriteRequest.java} | 40 +++++++------
 ...teResponse.java => SinglePlcWriteResponse.java} | 21 ++++---
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       | 41 +++++++------
 .../apache/plc4x/java/s7/S7PlcReaderSample.java    |  9 ++-
 .../org/apache/plc4x/java/s7/S7PlcScanner.java     | 10 ++--
 .../org/apache/plc4x/java/s7/S7PlcTestConsole.java |  8 +--
 .../apache/plc4x/java/s7/S7PlcWriterSample.java    | 10 ++--
 .../plc4x/java/s7/netty/Plc4XS7ProtocolTest.java   | 25 ++++----
 26 files changed, 367 insertions(+), 278 deletions(-)
 rename plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/{UncheckedPlcReadRequest.java => BulkPlcReadRequest.java} (58%)
 copy plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/{PlcReadResponse.java => BulkPlcReadResponse.java} (77%)
 rename plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/{UncheckedPlcWriteRequest.java => BulkPlcWriteRequest.java} (54%)
 copy plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/{PlcWriteResponse.java => BulkPlcWriteResponse.java} (73%)
 create mode 100644 plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcReadRequest.java
 copy plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/{PlcReadResponse.java => SinglePlcReadResponse.java} (62%)
 copy plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/{PlcWriteRequest.java => SinglePlcWriteRequest.java} (50%)
 copy plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/{PlcWriteResponse.java => SinglePlcWriteResponse.java} (62%)

-- 
To stop receiving notification emails like this one, please contact
['"commits@plc4x.apache.org" <co...@plc4x.apache.org>'].

[incubator-plc4x] 01/02: Merge branch 'master' into refactoring/java_generify

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

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

commit d7730f07f80177e84c0cd7a88645bb586970f178
Merge: 71fecb8 b3d4564
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Thu Jan 4 17:42:41 2018 +0100

    Merge branch 'master' into refactoring/java_generify
    
    # Conflicts:
    #	plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java

 .../org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java    | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)


-- 
To stop receiving notification emails like this one, please contact
"commits@plc4x.apache.org" <co...@plc4x.apache.org>.

[incubator-plc4x] 02/02: split plcRequest into single and bulk plc request

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

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

commit cead5c1486e7b694ea1c9fe0abe3f2263f6126b1
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Jan 5 11:34:15 2018 +0100

    split plcRequest into single and bulk plc request
---
 .../java/org/apache/plc4x/camel/PLC4XProducer.java | 32 ++++++++---
 .../apache/plc4x/edgent/PlcConnectionAdapter.java  | 19 +++---
 .../plc4x/edgent/PlcConnectionAdapterTest.java     | 43 +++++++-------
 .../apache/plc4x/edgent/mock/MockConnection.java   | 39 ++++++++-----
 .../plc4x/java/api/connection/PlcReader.java       | 26 ++++++++-
 .../plc4x/java/api/connection/PlcWriter.java       | 27 ++++++++-
 ...PlcReadRequest.java => BulkPlcReadRequest.java} | 31 ++++++----
 ...cReadResponse.java => BulkPlcReadResponse.java} | 10 ++--
 ...cWriteRequest.java => BulkPlcWriteRequest.java} | 33 +++++++----
 ...riteResponse.java => BulkPlcWriteResponse.java} | 12 ++--
 .../apache/plc4x/java/api/messages/PlcMessage.java |  4 +-
 .../plc4x/java/api/messages/PlcReadRequest.java    | 38 ++----------
 .../plc4x/java/api/messages/PlcReadResponse.java   | 20 +------
 .../apache/plc4x/java/api/messages/PlcRequest.java |  2 +-
 .../plc4x/java/api/messages/PlcWriteRequest.java   | 38 ++----------
 .../plc4x/java/api/messages/PlcWriteResponse.java  | 20 +------
 .../java/api/messages/SinglePlcReadRequest.java    | 67 ++++++++++++++++++++++
 ...eadResponse.java => SinglePlcReadResponse.java} | 20 ++++---
 ...riteRequest.java => SinglePlcWriteRequest.java} | 40 +++++++------
 ...teResponse.java => SinglePlcWriteResponse.java} | 21 ++++---
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       | 41 +++++++------
 .../apache/plc4x/java/s7/S7PlcReaderSample.java    |  9 ++-
 .../org/apache/plc4x/java/s7/S7PlcScanner.java     | 10 ++--
 .../org/apache/plc4x/java/s7/S7PlcTestConsole.java |  8 +--
 .../apache/plc4x/java/s7/S7PlcWriterSample.java    | 10 ++--
 .../plc4x/java/s7/netty/Plc4XS7ProtocolTest.java   | 17 +++---
 26 files changed, 363 insertions(+), 274 deletions(-)

diff --git a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/PLC4XProducer.java b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/PLC4XProducer.java
index e11d1e5..aca485c 100644
--- a/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/PLC4XProducer.java
+++ b/integrations/apache-camel/src/main/java/org/apache/plc4x/camel/PLC4XProducer.java
@@ -25,12 +25,15 @@ import org.apache.camel.impl.DefaultAsyncProducer;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcWriter;
 import org.apache.plc4x.java.api.exceptions.PlcException;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.messages.BulkPlcWriteRequest;
+import org.apache.plc4x.java.api.messages.SinglePlcWriteRequest;
+import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
 import org.apache.plc4x.java.api.model.Address;
 
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 public class PLC4XProducer extends DefaultAsyncProducer {
     @SuppressWarnings("unused")
@@ -54,15 +57,28 @@ public class PLC4XProducer extends DefaultAsyncProducer {
     public void process(Exchange exchange) throws Exception {
         Message in = exchange.getIn();
         Address address = in.getHeader(Constants.ADDRESS_HEADER, Address.class);
-        Class<?> datatype = in.getHeader(Constants.DATATYPE_HEADER, Class.class);
-        Object value = in.getBody(Object.class);
-        PlcWriteRequest plcSimpleWriteRequest = new PlcWriteRequest(datatype, address, value);
-        PlcWriter plcWriter = plcConnection.getWriter().orElseThrow(() -> new IllegalArgumentException("Writer for driver not found"));
-        CompletableFuture<PlcWriteResponse> completableFuture = plcWriter.write(plcSimpleWriteRequest);
+        Object body = in.getBody();
+        CompletableFuture<?> completableFuture;
+        if (body instanceof List) {
+            List<?> bodyList = in.getBody(List.class);
+            List<WriteRequestItem> collect = bodyList
+                .stream()
+                .map(o -> new WriteRequestItem(o.getClass(), address, o))
+                .collect(Collectors.toList());
+            BulkPlcWriteRequest bulkPlcWriteRequest = new BulkPlcWriteRequest(collect);
+            PlcWriter plcWriter = plcConnection.getWriter().orElseThrow(() -> new IllegalArgumentException("Writer for driver not found"));
+            completableFuture = plcWriter.write(bulkPlcWriteRequest);
+        } else {
+            Class<?> datatype = in.getHeader(Constants.DATATYPE_HEADER, Class.class);
+            Object value = in.getBody(Object.class);
+            SinglePlcWriteRequest plcSimpleWriteRequest = new SinglePlcWriteRequest(datatype, address, value);
+            PlcWriter plcWriter = plcConnection.getWriter().orElseThrow(() -> new IllegalArgumentException("Writer for driver not found"));
+            completableFuture = plcWriter.write(plcSimpleWriteRequest);
+        }
         int currentlyOpenRequests = openRequests.incrementAndGet();
         try {
             log.debug("Currently open requests including {}:{}", exchange, currentlyOpenRequests);
-            PlcWriteResponse plcWriteResponse = completableFuture.get();
+            Object plcWriteResponse = completableFuture.get();
             if (exchange.getPattern().isOutCapable()) {
                 Message out = exchange.getOut();
                 out.copyFrom(exchange.getIn());
diff --git a/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java b/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java
index ab55af8..3021ed6 100644
--- a/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java
+++ b/integrations/apache-edgent/src/main/java/org/apache/plc4x/edgent/PlcConnectionAdapter.java
@@ -27,8 +27,9 @@ import org.apache.plc4x.java.api.connection.PlcConnection;
 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.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.SinglePlcReadRequest;
+import org.apache.plc4x.java.api.messages.SinglePlcWriteRequest;
 import org.apache.plc4x.java.api.model.Address;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -111,9 +112,8 @@ public class PlcConnectionAdapter implements AutoCloseable {
                     connection = getConnection();
                     address = connection.parseAddress(addressStr);
                     PlcReader reader = connection.getReader().get();
-                    PlcReadRequest<T> readRequest = PlcConnectionAdapter.newPlcReadRequest(datatype, address);
-                    T value = (T) reader.read(readRequest).get().getResponseItems().get(0).getValues().get(0);
-                    return value;
+                    SinglePlcReadRequest<T> readRequest = PlcConnectionAdapter.newPlcReadRequest(datatype, address);
+                    return reader.read(readRequest).get().getResponseItems().get(0).getValues().get(0);
                 } catch (Exception e) {
                     logger.error("reading from plc device {} {} failed", connection, address, e);
                     return null;
@@ -183,15 +183,14 @@ public class PlcConnectionAdapter implements AutoCloseable {
         throw new IllegalArgumentException("Not a legal plc data type: " + cls.getSimpleName());
     }
 
-    @SuppressWarnings("unchecked")
-    static <T> PlcWriteRequest<T> newPlcWriteRequest(Address address, T value) {
+    static <T> SinglePlcWriteRequest<T> newPlcWriteRequest(Address address, T value) {
+        @SuppressWarnings("unchecked")
         Class<T> cls = (Class<T>) value.getClass();
-        return new PlcWriteRequest<>(cls, address, value);
+        return new SinglePlcWriteRequest<>(cls, address, value);
     }
 
-    @SuppressWarnings("unchecked")
-    static <T> PlcReadRequest<T> newPlcReadRequest(Class<T> datatype, Address address) {
-        return new PlcReadRequest<>(datatype, address);
+    static <T> SinglePlcReadRequest<T> newPlcReadRequest(Class<T> datatype, Address address) {
+        return new SinglePlcReadRequest<>(datatype, address);
     }
 
 }
diff --git a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java
index 36e4d1c..c78e231 100644
--- a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java
+++ b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java
@@ -26,10 +26,7 @@ import org.apache.plc4x.edgent.mock.MockAddress;
 import org.apache.plc4x.edgent.mock.MockConnection;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.messages.items.ReadRequestItem;
 import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
 import org.apache.plc4x.java.api.model.Address;
@@ -112,25 +109,25 @@ public class PlcConnectionAdapterTest {
             () -> PlcConnectionAdapter.checkDatatype(Double.class));
     }
 
-    private <T> void checkRead(MockConnection connection, PlcReadRequest<T> request, T value) throws InterruptedException, ExecutionException {
+    private <T> void checkRead(MockConnection connection, SinglePlcReadRequest<T> request, T value) throws InterruptedException, ExecutionException {
         // this is really a tests of our mock tooling but knowing it's behaving as expected
         // will help identify problems in the adapter/supplier/consumer
         connection.setDataValue(request.getReadRequestItems().get(0).getAddress(), value);
 
-        CompletableFuture<PlcReadResponse<T>> cf = connection.read(request);
+        CompletableFuture<SinglePlcReadResponse<T>> cf = connection.read(request);
 
         Assertions.assertTrue(cf.isDone());
-        PlcReadResponse<T> response = cf.get();
+        SinglePlcReadResponse<T> response = cf.get();
         Assertions.assertEquals(value, response.getResponseItems().get(0).getValues().get(0));
     }
 
     @SuppressWarnings("unchecked")
-    private <T> void checkWrite(MockConnection connection, PlcWriteRequest<T> request, T value) throws InterruptedException, ExecutionException {
+    private <T> void checkWrite(MockConnection connection, SinglePlcWriteRequest<T> request, T value) throws InterruptedException, ExecutionException {
         // this is really a tests of our mock tooling but knowing it's behaving as expected
         // will help identify problems in the adapter/supplier/consumer
         connection.setDataValue(request.getRequestItems().get(0).getAddress(), value);
 
-        CompletableFuture<PlcWriteResponse<T>> cf = connection.write(request);
+        CompletableFuture<SinglePlcWriteResponse<T>> cf = connection.write(request);
 
         Assertions.assertTrue(cf.isDone());
         PlcWriteResponse response = cf.get();
@@ -155,7 +152,7 @@ public class PlcConnectionAdapterTest {
         MockConnection connection = (MockConnection) adapter.getConnection();
 
         {
-            PlcReadRequest<Boolean> request = PlcConnectionAdapter.newPlcReadRequest(Boolean.class, address);
+            SinglePlcReadRequest<Boolean> request = PlcConnectionAdapter.newPlcReadRequest(Boolean.class, address);
             ReadRequestItem<Boolean> requestItem = request.getReadRequestItems().get(0);
             Class<Boolean> dataType = requestItem.getDatatype();
             Assertions.assertTrue(dataType == Boolean.class, "class:" + request.getClass());
@@ -164,7 +161,7 @@ public class PlcConnectionAdapterTest {
             checkRead(connection, request, false);
         }
         {
-            PlcReadRequest<Byte> request = PlcConnectionAdapter.newPlcReadRequest(Byte.class, address);
+            SinglePlcReadRequest<Byte> request = PlcConnectionAdapter.newPlcReadRequest(Byte.class, address);
             ReadRequestItem<Byte> requestItem = request.getReadRequestItems().get(0);
             Class<Byte> dataType = requestItem.getDatatype();
             Assertions.assertTrue(dataType == Byte.class, "class:" + request.getClass());
@@ -173,7 +170,7 @@ public class PlcConnectionAdapterTest {
             checkRead(connection, request, (byte) 0x23);
         }
         {
-            PlcReadRequest<Short> request = PlcConnectionAdapter.newPlcReadRequest(Short.class, address);
+            SinglePlcReadRequest<Short> request = PlcConnectionAdapter.newPlcReadRequest(Short.class, address);
             ReadRequestItem<Short> requestItem = request.getReadRequestItems().get(0);
             Class<Short> dataType = requestItem.getDatatype();
             Assertions.assertTrue(dataType == Short.class, "class:" + request.getClass());
@@ -182,7 +179,7 @@ public class PlcConnectionAdapterTest {
             checkRead(connection, request, (short) 23);
         }
         {
-            PlcReadRequest<Integer> request = PlcConnectionAdapter.newPlcReadRequest(Integer.class, address);
+            SinglePlcReadRequest<Integer> request = PlcConnectionAdapter.newPlcReadRequest(Integer.class, address);
             ReadRequestItem<Integer> requestItem = request.getReadRequestItems().get(0);
             Class<Integer> dataType = requestItem.getDatatype();
             Assertions.assertTrue(dataType == Integer.class, "class:" + request.getClass());
@@ -191,7 +188,7 @@ public class PlcConnectionAdapterTest {
             checkRead(connection, request, -133);
         }
         {
-            PlcReadRequest<Float> request = PlcConnectionAdapter.newPlcReadRequest(Float.class, address);
+            SinglePlcReadRequest<Float> request = PlcConnectionAdapter.newPlcReadRequest(Float.class, address);
             ReadRequestItem<Float> requestItem = request.getReadRequestItems().get(0);
             Class<Float> dataType = requestItem.getDatatype();
             Assertions.assertTrue(dataType == Float.class, "class:" + request.getClass());
@@ -200,7 +197,7 @@ public class PlcConnectionAdapterTest {
             checkRead(connection, request, -143.5f);
         }
         {
-            PlcReadRequest<String> request = PlcConnectionAdapter.newPlcReadRequest(String.class, address);
+            SinglePlcReadRequest<String> request = PlcConnectionAdapter.newPlcReadRequest(String.class, address);
             ReadRequestItem<String> requestItem = request.getReadRequestItems().get(0);
             Class<String> dataType = requestItem.getDatatype();
             Assertions.assertTrue(dataType == String.class, "class:" + request.getClass());
@@ -209,7 +206,7 @@ public class PlcConnectionAdapterTest {
             checkRead(connection, request, "OneMoreTime");
         }
         {
-            PlcReadRequest<Calendar> request = PlcConnectionAdapter.newPlcReadRequest(Calendar.class, address);
+            SinglePlcReadRequest<Calendar> request = PlcConnectionAdapter.newPlcReadRequest(Calendar.class, address);
             ReadRequestItem<Calendar> requestItem = request.getReadRequestItems().get(0);
             Class<Calendar> dataType = requestItem.getDatatype();
             Assertions.assertTrue(dataType == Calendar.class, "class:" + request.getClass());
@@ -233,7 +230,7 @@ public class PlcConnectionAdapterTest {
         MockConnection connection = (MockConnection) adapter.getConnection();
 
         {
-            PlcWriteRequest<Boolean> request = PlcConnectionAdapter.newPlcWriteRequest(address, true);
+            SinglePlcWriteRequest<Boolean> request = PlcConnectionAdapter.newPlcWriteRequest(address, true);
             WriteRequestItem<Boolean> requestItem = request.getRequestItems().get(0);
             Class<Boolean> dataType = requestItem.getDatatype();
             Assertions.assertTrue(Boolean.class.isAssignableFrom(dataType), "class:" + request.getClass());
@@ -241,7 +238,7 @@ public class PlcConnectionAdapterTest {
             checkWrite(connection, request, true);
         }
         {
-            PlcWriteRequest<Byte> request = PlcConnectionAdapter.newPlcWriteRequest(address, (byte) 0x113);
+            SinglePlcWriteRequest<Byte> request = PlcConnectionAdapter.newPlcWriteRequest(address, (byte) 0x113);
             WriteRequestItem<Byte> requestItem = request.getRequestItems().get(0);
             Class<Byte> dataType = requestItem.getDatatype();
             Assertions.assertTrue(Byte.class.isAssignableFrom(dataType), "class:" + request.getClass());
@@ -249,7 +246,7 @@ public class PlcConnectionAdapterTest {
             checkWrite(connection, request, (byte) 0x113);
         }
         {
-            PlcWriteRequest<Short> request = PlcConnectionAdapter.newPlcWriteRequest(address, (short) 113);
+            SinglePlcWriteRequest<Short> request = PlcConnectionAdapter.newPlcWriteRequest(address, (short) 113);
             WriteRequestItem<Short> requestItem = request.getRequestItems().get(0);
             Class<Short> dataType = requestItem.getDatatype();
             Assertions.assertTrue(Short.class.isAssignableFrom(dataType), "class:" + request.getClass());
@@ -257,7 +254,7 @@ public class PlcConnectionAdapterTest {
             checkWrite(connection, request, (short) 113);
         }
         {
-            PlcWriteRequest<Integer> request = PlcConnectionAdapter.newPlcWriteRequest(address, 1033);
+            SinglePlcWriteRequest<Integer> request = PlcConnectionAdapter.newPlcWriteRequest(address, 1033);
             WriteRequestItem<Integer> requestItem = request.getRequestItems().get(0);
             Class<Integer> dataType = requestItem.getDatatype();
             Assertions.assertTrue(Integer.class.isAssignableFrom(dataType), "class:" + request.getClass());
@@ -265,7 +262,7 @@ public class PlcConnectionAdapterTest {
             checkWrite(connection, request, 1033);
         }
         {
-            PlcWriteRequest<Float> request = PlcConnectionAdapter.newPlcWriteRequest(address, 1043.5f);
+            SinglePlcWriteRequest<Float> request = PlcConnectionAdapter.newPlcWriteRequest(address, 1043.5f);
             WriteRequestItem<Float> requestItem = request.getRequestItems().get(0);
             Class<Float> dataType = requestItem.getDatatype();
             Assertions.assertTrue(Float.class.isAssignableFrom(dataType), "class:" + request.getClass());
@@ -273,7 +270,7 @@ public class PlcConnectionAdapterTest {
             checkWrite(connection, request, 1043.5f);
         }
         {
-            PlcWriteRequest<String> request = PlcConnectionAdapter.newPlcWriteRequest(address, "A written value");
+            SinglePlcWriteRequest<String> request = PlcConnectionAdapter.newPlcWriteRequest(address, "A written value");
             WriteRequestItem<String> requestItem = request.getRequestItems().get(0);
             Class<String> dataType = requestItem.getDatatype();
             Assertions.assertTrue(String.class.isAssignableFrom(dataType), "class:" + request.getClass());
@@ -282,7 +279,7 @@ public class PlcConnectionAdapterTest {
         }
         {
             Calendar calValue = Calendar.getInstance();
-            PlcWriteRequest<Calendar> request = PlcConnectionAdapter.newPlcWriteRequest(address, calValue);
+            SinglePlcWriteRequest<Calendar> request = PlcConnectionAdapter.newPlcWriteRequest(address, calValue);
             WriteRequestItem<Calendar> requestItem = request.getRequestItems().get(0);
             Class<Calendar> dataType = requestItem.getDatatype();
             Assertions.assertTrue(Calendar.class.isAssignableFrom(dataType), "class:" + request.getClass());
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 c81ce11..2bd3ab2 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
@@ -25,10 +25,7 @@ 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;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.messages.items.ReadRequestItem;
 import org.apache.plc4x.java.api.messages.items.ReadResponseItem;
 import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
@@ -85,11 +82,11 @@ public class MockConnection extends AbstractPlcConnection implements PlcReader,
 
     @SuppressWarnings("unchecked")
     @Override
-    public <T> CompletableFuture<PlcReadResponse<T>> read(PlcReadRequest<T> readRequest) {
+    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
         curReadCnt++;
         if (readExceptionTriggerCount > 0 && curReadCnt == readExceptionTriggerCount) {
             curReadCnt = 0;
-            CompletableFuture<PlcReadResponse<T>> cf = new CompletableFuture<>();
+            CompletableFuture<PlcReadResponse> cf = new CompletableFuture<>();
             cf.completeExceptionally(new PlcIoException(readExceptionMsg));
             return cf;
         }
@@ -99,26 +96,42 @@ public class MockConnection extends AbstractPlcConnection implements PlcReader,
                 Collections.singletonList(getDataValue(requestItem.getAddress())));
             responseItems.add(responseItem);
         }
-        PlcReadResponse response = new PlcReadResponse(readRequest, responseItems);
+        PlcReadResponse response;
+        if (readRequest instanceof BulkPlcReadRequest) {
+            response = new BulkPlcReadResponse((BulkPlcReadRequest) readRequest, responseItems);
+        } else if (readRequest instanceof SinglePlcReadRequest) {
+            response = new SinglePlcReadResponse((SinglePlcReadRequest) readRequest, responseItems.isEmpty() ? null : responseItems.get(0));
+        } else {
+            response = null;
+        }
         return CompletableFuture.completedFuture(response);
     }
 
+    @SuppressWarnings("unchecked")
     @Override
-    public <T> CompletableFuture<PlcWriteResponse<T>> write(PlcWriteRequest<T> writeRequest) {
+    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
         curWriteCnt++;
         if (writeExceptionTriggerCount > 0 && curWriteCnt == writeExceptionTriggerCount) {
             curWriteCnt = 0;
-            CompletableFuture<PlcWriteResponse<T>> cf = new CompletableFuture<>();
+            CompletableFuture<PlcWriteResponse> cf = new CompletableFuture<>();
             cf.completeExceptionally(new PlcIoException(writeExceptionMsg));
             return cf;
         }
-        List<WriteResponseItem<T>> responseItems = new LinkedList<>();
-        for (WriteRequestItem<T> requestItem : writeRequest.getRequestItems()) {
+        List<WriteResponseItem> responseItems = new LinkedList<>();
+        for (WriteRequestItem requestItem : writeRequest.getRequestItems()) {
             setDataValue(requestItem.getAddress(), requestItem.getValues());
-            WriteResponseItem<T> responseItem = new WriteResponseItem<>(requestItem, ResponseCode.OK);
+            WriteResponseItem<?> responseItem = new WriteResponseItem<>(requestItem, ResponseCode.OK);
             responseItems.add(responseItem);
         }
-        PlcWriteResponse<T> response = new PlcWriteResponse<>(writeRequest, responseItems);
+        PlcWriteResponse response;
+        if (writeRequest instanceof BulkPlcWriteRequest) {
+            response = new BulkPlcWriteResponse((BulkPlcWriteRequest) writeRequest, responseItems);
+        } else if (writeRequest instanceof SinglePlcWriteRequest) {
+            response = new SinglePlcWriteResponse((SinglePlcWriteRequest) writeRequest, responseItems.isEmpty() ? null : responseItems.get(0));
+        } else {
+            response = null;
+        }
+
         return CompletableFuture.completedFuture(response);
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java
index d6faa78..2888b61 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcReader.java
@@ -18,8 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.api.connection;
 
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.messages.*;
 
 import java.util.concurrent.CompletableFuture;
 
@@ -28,6 +27,13 @@ import java.util.concurrent.CompletableFuture;
  */
 public interface PlcReader {
 
+    /**
+     * Reads a requested value from a PLC.
+     *
+     * @param readRequest object describing the type and location of the value.
+     * @return a {@link CompletableFuture} giving async access to the returned value.
+     */
+    CompletableFuture<? extends PlcReadResponse> read(PlcReadRequest readRequest);
 
     /**
      * Reads a requested value from a PLC.
@@ -36,6 +42,20 @@ public interface PlcReader {
      * @param <T>         type that is being requested.
      * @return a {@link CompletableFuture} giving async access to the returned value.
      */
-    <T> CompletableFuture<PlcReadResponse<T>> read(PlcReadRequest<T> readRequest);
+    @SuppressWarnings("unchecked")
+    default <T> CompletableFuture<SinglePlcReadResponse<T>> read(SinglePlcReadRequest<T> readRequest) {
+        return (CompletableFuture<SinglePlcReadResponse<T>>) read((PlcReadRequest) readRequest);
+    }
+
+    /**
+     * Reads a requested value from a PLC.
+     *
+     * @param readRequest object describing the type and location of the value.
+     * @return a {@link CompletableFuture} giving async access to the returned value.
+     */
+    @SuppressWarnings("unchecked")
+    default CompletableFuture<BulkPlcReadResponse> read(BulkPlcReadRequest readRequest) {
+        return (CompletableFuture<BulkPlcReadResponse>) read((PlcReadRequest) readRequest);
+    }
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java
index 53add5b..afb70e4 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/PlcWriter.java
@@ -19,8 +19,7 @@ under the License.
 package org.apache.plc4x.java.api.connection;
 
 
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.messages.*;
 
 import java.util.concurrent.CompletableFuture;
 
@@ -33,9 +32,31 @@ public interface PlcWriter {
      * Writes a given value to a PLC.
      *
      * @param writeRequest object describing the type, location and value that whould be written.
+     * @return a {@link CompletableFuture} giving async access to the response of the write operation.
+     */
+    CompletableFuture<? extends PlcWriteResponse> write(PlcWriteRequest writeRequest);
+
+    /**
+     * Writes a given value to a PLC.
+     *
+     * @param writeRequest object describing the type, location and value that whould be written.
      * @param <T>          type that is being requested.
      * @return a {@link CompletableFuture} giving async access to the response of the write operation.
      */
-    <T> CompletableFuture<PlcWriteResponse<T>> write(PlcWriteRequest<T> writeRequest);
+    @SuppressWarnings("unchecked")
+    default <T> CompletableFuture<SinglePlcWriteResponse<T>> write(SinglePlcWriteRequest<T> writeRequest) {
+        return (CompletableFuture<SinglePlcWriteResponse<T>>) write((PlcWriteRequest) writeRequest);
+    }
+
+    /**
+     * Writes a given value to a PLC.
+     *
+     * @param writeRequest object describing the type, location and value that whould be written.
+     * @return a {@link CompletableFuture} giving async access to the response of the write operation.
+     */
+    @SuppressWarnings("unchecked")
+    default CompletableFuture<BulkPlcWriteResponse> write(BulkPlcWriteRequest writeRequest) {
+        return (CompletableFuture<BulkPlcWriteResponse>) write((PlcWriteRequest) writeRequest);
+    }
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcReadRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcReadRequest.java
similarity index 58%
rename from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcReadRequest.java
rename to plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcReadRequest.java
index a60995f..631a99d 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcReadRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcReadRequest.java
@@ -21,28 +21,37 @@ package org.apache.plc4x.java.api.messages;
 import org.apache.plc4x.java.api.messages.items.ReadRequestItem;
 import org.apache.plc4x.java.api.model.Address;
 
+import java.util.LinkedList;
 import java.util.List;
 
 @SuppressWarnings("unchecked")
-public class UncheckedPlcReadRequest extends PlcReadRequest<Object> {
+public class BulkPlcReadRequest implements PlcReadRequest {
 
-    public UncheckedPlcReadRequest() {
-    }
+    private final List<ReadRequestItem> readRequestItems;
 
-    public UncheckedPlcReadRequest(Class dataType, Address address) {
-        super(dataType, address);
+    public BulkPlcReadRequest() {
+        this.readRequestItems = new LinkedList<>();
     }
 
-    public UncheckedPlcReadRequest(Class dataType, Address address, int size) {
-        super(dataType, address, size);
+    public BulkPlcReadRequest(Class dataType, Address address) {
+        this();
+        addItem(new ReadRequestItem(dataType, address));
     }
 
-    public UncheckedPlcReadRequest(List list) {
-        super(list);
+    public BulkPlcReadRequest(Class dataType, Address address, int size) {
+        this();
+        addItem(new ReadRequestItem(dataType, address, size));
     }
 
-    @Override
     public void addItem(ReadRequestItem readRequestItem) {
-        super.addItem(readRequestItem);
+        readRequestItems.add(readRequestItem);
+    }
+
+    public List<ReadRequestItem> getReadRequestItems() {
+        return readRequestItems;
+    }
+
+    public int getNumberOfItems() {
+        return readRequestItems.size();
     }
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcReadResponse.java
similarity index 77%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcReadResponse.java
index 7b31cb3..420d325 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcReadResponse.java
@@ -22,12 +22,12 @@ import org.apache.plc4x.java.api.messages.items.ReadResponseItem;
 
 import java.util.List;
 
-public class PlcReadResponse<T> implements PlcResponse {
+public class BulkPlcReadResponse implements PlcReadResponse {
 
-    private final PlcReadRequest request;
-    private final List<ReadResponseItem<T>> responseItems;
+    private final BulkPlcReadRequest request;
+    private final List<ReadResponseItem> responseItems;
 
-    public PlcReadResponse(PlcReadRequest request, List<ReadResponseItem<T>> responseItems) {
+    public BulkPlcReadResponse(BulkPlcReadRequest request, List<ReadResponseItem> responseItems) {
         this.request = request;
         this.responseItems = responseItems;
     }
@@ -36,7 +36,7 @@ public class PlcReadResponse<T> implements PlcResponse {
         return request;
     }
 
-    public List<ReadResponseItem<T>> getResponseItems() {
+    public List<ReadResponseItem> getResponseItems() {
         return responseItems;
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcWriteRequest.java
similarity index 54%
rename from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcWriteRequest.java
rename to plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcWriteRequest.java
index 83ac035..ff64054 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcWriteRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcWriteRequest.java
@@ -21,28 +21,41 @@ package org.apache.plc4x.java.api.messages;
 import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
 import org.apache.plc4x.java.api.model.Address;
 
+import java.util.LinkedList;
 import java.util.List;
 
 @SuppressWarnings("unchecked")
-public class UncheckedPlcWriteRequest extends PlcWriteRequest<Object> {
+public class BulkPlcWriteRequest implements PlcWriteRequest {
 
-    public UncheckedPlcWriteRequest() {
+    private final List<WriteRequestItem> requestItems;
+
+    public BulkPlcWriteRequest() {
+        this.requestItems = new LinkedList<>();
     }
 
-    public UncheckedPlcWriteRequest(Class<Object> dataType, Address address, Object value) {
-        super(dataType, address, value);
+    public BulkPlcWriteRequest(Class dataType, Address address, Object value) {
+        this();
+        addItem(new WriteRequestItem(dataType, address, value));
     }
 
-    public UncheckedPlcWriteRequest(Class<Object> dataType, Address address, Object[] values) {
-        super(dataType, address, values);
+    public BulkPlcWriteRequest(Class dataType, Address address, Object[] values) {
+        this();
+        addItem(new WriteRequestItem(dataType, address, values));
     }
 
-    public UncheckedPlcWriteRequest(List<WriteRequestItem<Object>> writeRequestItems) {
-        super(writeRequestItems);
+    public BulkPlcWriteRequest(List<WriteRequestItem> requestItems) {
+        this.requestItems = requestItems;
     }
 
-    @Override
     public void addItem(WriteRequestItem requestItem) {
-        super.addItem(requestItem);
+        requestItems.add(requestItem);
+    }
+
+    public List<WriteRequestItem> getRequestItems() {
+        return requestItems;
+    }
+
+    public int getNumberOfItems() {
+        return requestItems.size();
     }
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcWriteResponse.java
similarity index 73%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcWriteResponse.java
index 58b8ce7..8e51652 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/BulkPlcWriteResponse.java
@@ -22,21 +22,21 @@ import org.apache.plc4x.java.api.messages.items.WriteResponseItem;
 
 import java.util.List;
 
-public class PlcWriteResponse<T> implements PlcResponse {
+public class BulkPlcWriteResponse implements PlcWriteResponse {
 
-    private final PlcWriteRequest<T> request;
-    private final List<WriteResponseItem<T>> responseItems;
+    private final BulkPlcWriteRequest request;
+    private final List<WriteResponseItem> responseItems;
 
-    public PlcWriteResponse(PlcWriteRequest<T> request, List<WriteResponseItem<T>> responseItems) {
+    public BulkPlcWriteResponse(BulkPlcWriteRequest request, List<WriteResponseItem> responseItems) {
         this.request = request;
         this.responseItems = responseItems;
     }
 
-    public PlcWriteRequest<T> getRequest() {
+    public BulkPlcWriteRequest getRequest() {
         return request;
     }
 
-    public List<WriteResponseItem<T>> getResponseItems() {
+    public List<WriteResponseItem> getResponseItems() {
         return responseItems;
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
index d720136..aed337d 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
@@ -20,9 +20,7 @@ package org.apache.plc4x.java.api.messages;
 
 /**
  * Base type for all forms of messages passed between plc and plc4x system.
- * @param <T>         type that is being handled.
  */
-@SuppressWarnings("unused")
-public interface PlcMessage<T> {
+public interface PlcMessage {
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
index dbf8d59..d016947 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
@@ -19,44 +19,14 @@ under the License.
 package org.apache.plc4x.java.api.messages;
 
 import org.apache.plc4x.java.api.messages.items.ReadRequestItem;
-import org.apache.plc4x.java.api.model.Address;
 
-import java.util.LinkedList;
 import java.util.List;
 
-public class PlcReadRequest<T> implements PlcRequest<T> {
+public interface PlcReadRequest extends PlcRequest {
+    void addItem(ReadRequestItem readRequestItem);
 
-    private final List<ReadRequestItem<T>> readRequestItems;
-
-    public PlcReadRequest() {
-        this.readRequestItems = new LinkedList<>();
-    }
-
-    public PlcReadRequest(Class<T> dataType, Address address) {
-        this();
-        addItem(new ReadRequestItem<>(dataType, address));
-    }
-
-    public PlcReadRequest(Class<T> dataType, Address address, int size) {
-        this();
-        addItem(new ReadRequestItem<>(dataType, address, size));
-    }
-
-    public PlcReadRequest(List<ReadRequestItem<T>> readRequestItems) {
-        this.readRequestItems = readRequestItems;
-    }
-
-    public void addItem(ReadRequestItem<T> readRequestItem) {
-        readRequestItems.add(readRequestItem);
-    }
-
-    public List<ReadRequestItem<T>> getReadRequestItems() {
-        return readRequestItems;
-    }
-
-    public int getNumItems() {
-        return readRequestItems.size();
-    }
+    List<? extends ReadRequestItem> getReadRequestItems();
 
+    int getNumberOfItems();
 }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
index 7b31cb3..43b3b88 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
@@ -22,22 +22,8 @@ import org.apache.plc4x.java.api.messages.items.ReadResponseItem;
 
 import java.util.List;
 
-public class PlcReadResponse<T> implements PlcResponse {
-
-    private final PlcReadRequest request;
-    private final List<ReadResponseItem<T>> responseItems;
-
-    public PlcReadResponse(PlcReadRequest request, List<ReadResponseItem<T>> responseItems) {
-        this.request = request;
-        this.responseItems = responseItems;
-    }
-
-    public PlcReadRequest getRequest() {
-        return request;
-    }
-
-    public List<ReadResponseItem<T>> getResponseItems() {
-        return responseItems;
-    }
+public interface PlcReadResponse extends PlcResponse {
+    PlcReadRequest getRequest();
 
+    List<? extends ReadResponseItem> getResponseItems();
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
index 40a4b75..f2367f9 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
@@ -21,6 +21,6 @@ package org.apache.plc4x.java.api.messages;
 /**
  * Base type for all messages sent from the plc4x system to a connected plc.
  */
-public interface PlcRequest<T> extends PlcMessage<T> {
+public interface PlcRequest extends PlcMessage {
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
index c5cfd93..e39d3f9 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
@@ -19,43 +19,13 @@ under the License.
 package org.apache.plc4x.java.api.messages;
 
 import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
-import org.apache.plc4x.java.api.model.Address;
 
-import java.util.LinkedList;
 import java.util.List;
 
-public class PlcWriteRequest<T> implements PlcRequest<T> {
+public interface PlcWriteRequest extends PlcRequest {
+    void addItem(WriteRequestItem writeRequestItem);
 
-    private final List<WriteRequestItem<T>> requestItems;
-
-    public PlcWriteRequest() {
-        this.requestItems = new LinkedList<>();
-    }
-
-    public PlcWriteRequest(Class<T> dataType, Address address, T value) {
-        this();
-        addItem(new WriteRequestItem<>(dataType, address, value));
-    }
-
-    public PlcWriteRequest(Class<T> dataType, Address address, T[] values) {
-        this();
-        addItem(new WriteRequestItem<>(dataType, address, values));
-    }
-
-    public PlcWriteRequest(List<WriteRequestItem<T>> requestItems) {
-        this.requestItems = requestItems;
-    }
-
-    public void addItem(WriteRequestItem<T> requestItem) {
-        requestItems.add(requestItem);
-    }
-
-    public List<WriteRequestItem<T>> getRequestItems() {
-        return requestItems;
-    }
-
-    public int getNumItems() {
-        return requestItems.size();
-    }
+    List<? extends WriteRequestItem> getRequestItems();
 
+    int getNumberOfItems();
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
index 58b8ce7..de88b18 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
@@ -22,22 +22,8 @@ import org.apache.plc4x.java.api.messages.items.WriteResponseItem;
 
 import java.util.List;
 
-public class PlcWriteResponse<T> implements PlcResponse {
-
-    private final PlcWriteRequest<T> request;
-    private final List<WriteResponseItem<T>> responseItems;
-
-    public PlcWriteResponse(PlcWriteRequest<T> request, List<WriteResponseItem<T>> responseItems) {
-        this.request = request;
-        this.responseItems = responseItems;
-    }
-
-    public PlcWriteRequest<T> getRequest() {
-        return request;
-    }
-
-    public List<WriteResponseItem<T>> getResponseItems() {
-        return responseItems;
-    }
+public interface PlcWriteResponse extends PlcResponse {
+    PlcWriteRequest getRequest();
 
+    List<? extends WriteResponseItem> getResponseItems();
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcReadRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcReadRequest.java
new file mode 100644
index 0000000..e06acf0
--- /dev/null
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcReadRequest.java
@@ -0,0 +1,67 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.java.api.messages;
+
+import org.apache.plc4x.java.api.messages.items.ReadRequestItem;
+import org.apache.plc4x.java.api.model.Address;
+
+import java.util.Collections;
+import java.util.List;
+
+public class SinglePlcReadRequest<T> implements PlcReadRequest {
+
+    private ReadRequestItem<T> readRequestItem;
+
+    public SinglePlcReadRequest() {
+    }
+
+    public SinglePlcReadRequest(Class<T> dataType, Address address) {
+        readRequestItem = new ReadRequestItem<>(dataType, address);
+    }
+
+    public SinglePlcReadRequest(Class<T> dataType, Address address, int size) {
+        readRequestItem = new ReadRequestItem<>(dataType, address, size);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public void addItem(ReadRequestItem readRequestItem) {
+        if (this.readRequestItem != null && readRequestItem != null) {
+            throw new IllegalStateException(SinglePlcReadRequest.class.getName() + " can only contain on readRequestItem");
+        }
+        this.readRequestItem = (ReadRequestItem<T>) readRequestItem;
+    }
+
+    @Override
+    public List<ReadRequestItem<T>> getReadRequestItems() {
+        return readRequestItem != null ? Collections.singletonList(readRequestItem) : Collections.emptyList();
+    }
+
+    public ReadRequestItem<T> getReadRequestItem() {
+        return readRequestItem;
+    }
+
+    public void setReadRequestItem(ReadRequestItem<T> readRequestItem) {
+        this.readRequestItem = readRequestItem;
+    }
+
+    public int getNumberOfItems() {
+        return readRequestItem != null ? 1 : 0;
+    }
+}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcReadResponse.java
similarity index 62%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcReadResponse.java
index 7b31cb3..eeb027a 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcReadResponse.java
@@ -20,24 +20,30 @@ package org.apache.plc4x.java.api.messages;
 
 import org.apache.plc4x.java.api.messages.items.ReadResponseItem;
 
+import java.util.Collections;
 import java.util.List;
 
-public class PlcReadResponse<T> implements PlcResponse {
+public class SinglePlcReadResponse<T> implements PlcReadResponse {
 
-    private final PlcReadRequest request;
-    private final List<ReadResponseItem<T>> responseItems;
+    private final SinglePlcReadRequest<T> request;
+    private final ReadResponseItem<T> responseItem;
 
-    public PlcReadResponse(PlcReadRequest request, List<ReadResponseItem<T>> responseItems) {
+    public SinglePlcReadResponse(SinglePlcReadRequest<T> request, ReadResponseItem<T> responseItem) {
         this.request = request;
-        this.responseItems = responseItems;
+        this.responseItem = responseItem;
     }
 
-    public PlcReadRequest getRequest() {
+    @Override
+    public SinglePlcReadRequest<T> getRequest() {
         return request;
     }
 
+    @Override
     public List<ReadResponseItem<T>> getResponseItems() {
-        return responseItems;
+        return responseItem != null ? Collections.singletonList(responseItem) : Collections.emptyList();
     }
 
+    public ReadResponseItem<T> getResponseItem() {
+        return responseItem;
+    }
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcWriteRequest.java
similarity index 50%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcWriteRequest.java
index c5cfd93..085cc04 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcWriteRequest.java
@@ -21,41 +21,47 @@ package org.apache.plc4x.java.api.messages;
 import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
 import org.apache.plc4x.java.api.model.Address;
 
-import java.util.LinkedList;
+import java.util.Collections;
 import java.util.List;
 
-public class PlcWriteRequest<T> implements PlcRequest<T> {
+public class SinglePlcWriteRequest<T> implements PlcWriteRequest {
 
-    private final List<WriteRequestItem<T>> requestItems;
+    private WriteRequestItem<T> writeRequestItem;
 
-    public PlcWriteRequest() {
-        this.requestItems = new LinkedList<>();
+    public SinglePlcWriteRequest() {
     }
 
-    public PlcWriteRequest(Class<T> dataType, Address address, T value) {
-        this();
+    public SinglePlcWriteRequest(Class<T> dataType, Address address, T value) {
         addItem(new WriteRequestItem<>(dataType, address, value));
     }
 
-    public PlcWriteRequest(Class<T> dataType, Address address, T[] values) {
-        this();
+    public SinglePlcWriteRequest(Class<T> dataType, Address address, T[] values) {
         addItem(new WriteRequestItem<>(dataType, address, values));
     }
 
-    public PlcWriteRequest(List<WriteRequestItem<T>> requestItems) {
-        this.requestItems = requestItems;
+    @Override
+    @SuppressWarnings("unchecked")
+    public void addItem(WriteRequestItem writeRequestItem) {
+        if (this.writeRequestItem != null && writeRequestItem != null) {
+            throw new IllegalStateException(SinglePlcReadRequest.class.getName() + " can only contain on readRequestItem");
+        }
+        this.writeRequestItem = (WriteRequestItem<T>) writeRequestItem;
     }
 
-    public void addItem(WriteRequestItem<T> requestItem) {
-        requestItems.add(requestItem);
+    @Override
+    public List<WriteRequestItem<T>> getRequestItems() {
+        return (writeRequestItem != null) ? Collections.singletonList(writeRequestItem) : Collections.emptyList();
     }
 
-    public List<WriteRequestItem<T>> getRequestItems() {
-        return requestItems;
+    public WriteRequestItem<T> getWriteRequestItem() {
+        return writeRequestItem;
     }
 
-    public int getNumItems() {
-        return requestItems.size();
+    public void setWriteRequestItem(WriteRequestItem<T> writeRequestItem) {
+        this.writeRequestItem = writeRequestItem;
     }
 
+    public int getNumberOfItems() {
+        return writeRequestItem != null ? 1 : 0;
+    }
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcWriteResponse.java
similarity index 62%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
copy to plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcWriteResponse.java
index 58b8ce7..0155a18 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/SinglePlcWriteResponse.java
@@ -20,24 +20,31 @@ package org.apache.plc4x.java.api.messages;
 
 import org.apache.plc4x.java.api.messages.items.WriteResponseItem;
 
+import java.util.Collections;
 import java.util.List;
 
-public class PlcWriteResponse<T> implements PlcResponse {
+public class SinglePlcWriteResponse<T> implements PlcWriteResponse {
 
-    private final PlcWriteRequest<T> request;
-    private final List<WriteResponseItem<T>> responseItems;
+    private final SinglePlcWriteRequest<T> request;
+    private final WriteResponseItem<T> responseItem;
 
-    public PlcWriteResponse(PlcWriteRequest<T> request, List<WriteResponseItem<T>> responseItems) {
+    public SinglePlcWriteResponse(SinglePlcWriteRequest<T> request, WriteResponseItem<T> responseItem) {
         this.request = request;
-        this.responseItems = responseItems;
+        this.responseItem = responseItem;
     }
 
-    public PlcWriteRequest<T> getRequest() {
+    @Override
+    public SinglePlcWriteRequest<T> getRequest() {
         return request;
     }
 
+    @Override
     public List<WriteResponseItem<T>> getResponseItems() {
-        return responseItems;
+        return responseItem != null ? Collections.singletonList(responseItem) : Collections.emptyList();
+    }
+
+    public WriteResponseItem<T> getResponseItem() {
+        return responseItem;
     }
 
 }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
index c9b44c2..ab7bd37 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
@@ -29,7 +29,6 @@ import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
 import org.apache.plc4x.java.api.messages.items.WriteResponseItem;
 import org.apache.plc4x.java.api.model.Address;
 import org.apache.plc4x.java.api.types.ResponseCode;
-import org.apache.plc4x.java.s7.connection.S7PlcConnection;
 import org.apache.plc4x.java.s7.model.S7Address;
 import org.apache.plc4x.java.s7.model.S7BitAddress;
 import org.apache.plc4x.java.s7.model.S7DataBlockAddress;
@@ -42,8 +41,6 @@ import org.apache.plc4x.java.s7.netty.model.params.items.VarParameterItem;
 import org.apache.plc4x.java.s7.netty.model.payloads.VarPayload;
 import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem;
 import org.apache.plc4x.java.s7.netty.model.types.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -63,7 +60,7 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
         if (msg.getRequest() instanceof PlcReadRequest) {
             List<VarParameterItem> parameterItems = new LinkedList<>();
 
-            PlcReadRequest<?> readRequest = (PlcReadRequest<?>) msg.getRequest();
+            PlcReadRequest readRequest = (PlcReadRequest) msg.getRequest();
             for (ReadRequestItem requestItem : readRequest.getReadRequestItems()) {
                 // Try to get the correct S7 transport size for the given data type.
                 // (Map PLC4X data type to S7 data type)
@@ -90,7 +87,7 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
             List<VarParameterItem> parameterItems = new LinkedList<>();
             List<VarPayloadItem> payloadItems = new LinkedList<>();
 
-            PlcWriteRequest<?> writeRequest = (PlcWriteRequest<?>) msg.getRequest();
+            PlcWriteRequest writeRequest = (PlcWriteRequest) msg.getRequest();
             for (WriteRequestItem requestItem : writeRequest.getRequestItems()) {
                 // Try to get the correct S7 transport size for the given data type.
                 // (Map PLC4X data type to S7 data type)
@@ -141,7 +138,7 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
 
                 // Handle the response to a read request.
                 if (requestContainer.getRequest() instanceof PlcReadRequest) {
-                    PlcReadRequest<?> plcReadRequest = (PlcReadRequest<?>) requestContainer.getRequest();
+                    PlcReadRequest plcReadRequest = (PlcReadRequest) requestContainer.getRequest();
 
                     List<ReadResponseItem> responseItems = new LinkedList<>();
                     VarPayload payload = responseMessage.getPayload(VarPayload.class);
@@ -157,11 +154,11 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
                         VarPayloadItem payloadItem = payloadItems.get(i);
 
                         // Get the request item for this payload item
-                        ReadRequestItem<?> requestItem = plcReadRequest.getReadRequestItems().get(i);
+                        ReadRequestItem requestItem = plcReadRequest.getReadRequestItems().get(i);
 
                         ResponseCode responseCode = decodeResponseCode(payloadItem.getReturnCode());
 
-                        ReadResponseItem<?> responseItem;
+                        ReadResponseItem responseItem;
                         // Something went wrong.
                         if (responseCode != ResponseCode.OK) {
                             responseItem = new ReadResponseItem<>(requestItem, responseCode, null);
@@ -169,18 +166,24 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
                         // All Ok.
                         else {
                             byte[] data = payloadItem.getData();
-                            Class<?> datatype = requestItem.getDatatype();
-                            List<?> value = decodeData(datatype, data);
+                            Class datatype = requestItem.getDatatype();
+                            List value = decodeData(datatype, data);
                             responseItem = new ReadResponseItem(requestItem, responseCode, value);
                         }
                         responseItems.add(responseItem);
                     }
-                    response = new PlcReadResponse(plcReadRequest, responseItems);
+                    if (plcReadRequest instanceof BulkPlcReadRequest) {
+                        response = new BulkPlcReadResponse((BulkPlcReadRequest) plcReadRequest, responseItems);
+                    } else if (plcReadRequest instanceof SinglePlcReadRequest) {
+                        response = new SinglePlcReadResponse((SinglePlcReadRequest) plcReadRequest, responseItems.isEmpty() ? null : responseItems.get(0));
+                    } else {
+                        response = null;
+                    }
                 }
 
                 // Handle the response to a write request.
                 else if (requestContainer.getRequest() instanceof PlcWriteRequest) {
-                    PlcWriteRequest<?> plcWriteRequest = (PlcWriteRequest) requestContainer.getRequest();
+                    PlcWriteRequest plcWriteRequest = (PlcWriteRequest) requestContainer.getRequest();
                     List<WriteResponseItem> responseItems = new LinkedList<>();
                     VarPayload payload = responseMessage.getPayload(VarPayload.class);
                     // If the numbers of items don't match, we're in big trouble as the only
@@ -204,7 +207,13 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
                         responseItems.add(responseItem);
                     }
 
-                    response = new PlcWriteResponse(plcWriteRequest, responseItems);
+                    if (plcWriteRequest instanceof BulkPlcWriteRequest) {
+                        response = new BulkPlcWriteResponse((BulkPlcWriteRequest) plcWriteRequest, responseItems);
+                    } else if (plcWriteRequest instanceof SinglePlcWriteRequest) {
+                        response = new SinglePlcWriteResponse((SinglePlcWriteRequest) plcWriteRequest, responseItems.isEmpty() ? null : responseItems.get(0));
+                    } else {
+                        response = null;
+                    }
                 }
 
                 // Confirm the response being handled.
@@ -245,7 +254,7 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
         }
     }
 
-    private TransportSize encodeTransportSize(Class<?> datatype) {
+    private TransportSize encodeTransportSize(Class datatype) {
         if (datatype == Boolean.class) {
             return TransportSize.BIT;
         } else if (datatype == Byte.class) {
@@ -264,7 +273,7 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
         return null;
     }
 
-    private DataTransportSize encodeDataTransportSize(Class<?> datatype) {
+    private DataTransportSize encodeDataTransportSize(Class datatype) {
         if (datatype == Boolean.class) {
             return DataTransportSize.BIT;
         } else if (datatype == Byte.class) {
@@ -359,7 +368,7 @@ public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequest
             return null;
         }
         List<Object> result = new LinkedList<>();
-        for (int i = 0; i < s7Data.length;) {
+        for (int i = 0; i < s7Data.length; ) {
             if (datatype == Boolean.class) {
                 result.add((s7Data[i] & 0x01) == 0x01);
                 i += 1;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcReaderSample.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcReaderSample.java
index 864c9f3..068ef71 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcReaderSample.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcReaderSample.java
@@ -21,8 +21,8 @@ package org.apache.plc4x.java.s7;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcReader;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.messages.SinglePlcReadRequest;
+import org.apache.plc4x.java.api.messages.SinglePlcReadResponse;
 import org.apache.plc4x.java.api.messages.items.ReadResponseItem;
 import org.apache.plc4x.java.api.model.Address;
 import org.slf4j.Logger;
@@ -63,9 +63,8 @@ public class S7PlcReaderSample {
                 // Read synchronously ...
                 // NOTICE: the ".get()" immediately lets this thread pause till
                 // the response is processed and available.
-                PlcReadResponse<Byte> plcReadResponse = plcReader.read(new PlcReadRequest<>(Byte.class, inputs)).get();
-                List<ReadResponseItem<Byte>> responseItems = plcReadResponse.getResponseItems();
-                System.out.println("Inputs: " + responseItems.get(0).getValues().get(0));
+                SinglePlcReadResponse<Byte> plcReadResponse = plcReader.read(new SinglePlcReadRequest<>(Byte.class, inputs)).get();
+                System.out.println("Inputs: " + plcReadResponse.getResponseItem().getValues().get(0));
 
                 //////////////////////////////////////////////////////////
                 // Read asynchronously ...
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
index 4f072e6..79e1e79 100644
--- 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
@@ -21,8 +21,8 @@ package org.apache.plc4x.java.s7;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcReader;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.messages.SinglePlcReadRequest;
+import org.apache.plc4x.java.api.messages.SinglePlcReadResponse;
 import org.apache.plc4x.java.api.model.Address;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
 import org.slf4j.Logger;
@@ -62,9 +62,9 @@ public class S7PlcScanner {
                             } else {
                                 address = plcConnection.parseAddress(memoryArea.name() + "/" + i);
                             }
-                            PlcReadResponse<Byte> plcReadResponse = plcReader.read(
-                                new PlcReadRequest<>(Byte.class, address)).get();
-                            Byte data = plcReadResponse.getResponseItems().get(0).getValues().get(0);
+                            SinglePlcReadResponse<Byte> plcReadResponse = plcReader.read(
+                                new SinglePlcReadRequest<>(Byte.class, address)).get();
+                            Byte data = plcReadResponse.getResponseItem().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));
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
index 96e155e..784f436 100644
--- 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
@@ -21,8 +21,8 @@ package org.apache.plc4x.java.s7;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcReader;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.messages.SinglePlcReadRequest;
+import org.apache.plc4x.java.api.messages.SinglePlcReadResponse;
 import org.apache.plc4x.java.api.model.Address;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -57,8 +57,8 @@ public class S7PlcTestConsole {
                 while (!"exit".equalsIgnoreCase(line = scanner.next())) {
                     try {
                         Address address = plcConnection.parseAddress(line);
-                        PlcReadResponse<Byte> plcReadResponse = plcReader.read(new PlcReadRequest<>(Byte.class, address)).get();
-                        List<Byte> data = plcReadResponse.getResponseItems().get(0).getValues();
+                        SinglePlcReadResponse<Byte> plcReadResponse = plcReader.read(new SinglePlcReadRequest<>(Byte.class, address)).get();
+                        List<Byte> data = plcReadResponse.getResponseItem().getValues();
                         System.out.println("Response: " + data.get(0));
                     } catch (Exception e) {
                         e.printStackTrace();
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
index 159e588..f789158 100644
--- 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
@@ -21,8 +21,8 @@ package org.apache.plc4x.java.s7;
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcWriter;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.messages.SinglePlcWriteRequest;
+import org.apache.plc4x.java.api.messages.SinglePlcWriteResponse;
 import org.apache.plc4x.java.api.model.Address;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,9 +54,9 @@ public class S7PlcWriterSample {
                 // Write synchronously ...
                 // NOTICE: the ".get()" immediately lets this thread pause till
                 // the response is processed and available.
-                PlcWriteResponse<Float> plcWriteResponse = plcWriter.write(
-                    new PlcWriteRequest<>(Float.class, inputs, 2.0f)).get();
-                System.out.println("Written: " + plcWriteResponse.getResponseItems().get(0).getResponseCode().name());
+                SinglePlcWriteResponse<Float> plcWriteResponse = plcWriter.write(
+                    new SinglePlcWriteRequest<>(Float.class, inputs, 2.0f)).get();
+                System.out.println("Written: " + plcWriteResponse.getResponseItem().getResponseCode().name());
             }
         }
         // Catch any exception or the application won't be able to finish if something goes wrong.
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 4556f10..1fcdd36 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
@@ -18,10 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.s7.netty;
 
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcRequest;
-import org.apache.plc4x.java.api.messages.PlcRequestContainer;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.netty.NettyTestBase;
 import org.apache.plc4x.java.s7.model.S7Address;
 import org.apache.plc4x.java.s7.model.S7BitAddress;
@@ -67,14 +64,14 @@ public class Plc4XS7ProtocolTest extends NettyTestBase {
         // Read Request Tests
         {
             LinkedList<Object> out = new LinkedList<>();
-            SUT.encode(null, createMockedContainer(new PlcReadRequest<>(type, address)), out);
+            SUT.encode(null, createMockedContainer(new SinglePlcReadRequest(type, address)), out);
             // TODO: finish the asserts
             assertThat(out).hasSize(1);
         }
         // Write Request Tests
         {
             LinkedList<Object> out = new LinkedList<>();
-            SUT.encode(null, createMockedContainer(new PlcWriteRequest(type, address, fakeValueFor(type))), out);
+            SUT.encode(null, createMockedContainer(new SinglePlcWriteRequest(type, address, fakeValueFor(type))), out);
             // TODO: finish the asserts
             assertThat(out).hasSize(1);
         }
@@ -97,7 +94,7 @@ public class Plc4XS7ProtocolTest extends NettyTestBase {
                 Field requests = Plc4XS7Protocol.class.getDeclaredField("requests");
                 requests.setAccessible(true);
                 Map<Short, PlcRequestContainer> requestContainerMap = (Map<Short, PlcRequestContainer>) requests.get(SUT);
-                requestContainerMap.put(fakeTpduReference, createMockedContainer(new PlcReadRequest(type, address)));
+                requestContainerMap.put(fakeTpduReference, createMockedContainer(new SinglePlcReadRequest(type, address)));
             }
             S7ResponseMessage msg = new S7ResponseMessage(
                 MessageType.ACK,
@@ -119,7 +116,7 @@ public class Plc4XS7ProtocolTest extends NettyTestBase {
                 Field requests = Plc4XS7Protocol.class.getDeclaredField("requests");
                 requests.setAccessible(true);
                 Map<Short, PlcRequestContainer> requestContainerMap = (Map<Short, PlcRequestContainer>) requests.get(SUT);
-                requestContainerMap.put(fakeTpduReference, createMockedContainer(new PlcWriteRequest(type, address, fakeValueFor(type))));
+                requestContainerMap.put(fakeTpduReference, createMockedContainer(new SinglePlcWriteRequest(type, address, fakeValueFor(type))));
             }
             S7ResponseMessage msg = new S7ResponseMessage(
                 MessageType.ACK,
@@ -220,9 +217,9 @@ public class Plc4XS7ProtocolTest extends NettyTestBase {
             requestEnricher.accept(initialRequest);
         }
         when(mock.getRequest()).thenReturn(initialRequest);
-        if (initialRequest.getClass() == PlcReadRequest.class) {
+        if (PlcReadRequest.class.isAssignableFrom(initialRequest.getClass())) {
             return mock;
-        } else if (initialRequest.getClass() == PlcWriteRequest.class) {
+        } else if (PlcWriteRequest.class.isAssignableFrom(initialRequest.getClass())) {
             return mock;
         } else {
             throw new IllegalArgumentException("Unsupported Type: " + initialRequest.getClass());

-- 
To stop receiving notification emails like this one, please contact
"commits@plc4x.apache.org" <co...@plc4x.apache.org>.