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:21 UTC

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

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