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 2bff661..ab55af8 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
@@ -18,8 +18,7 @@
 */
 package org.apache.plc4x.edgent;
 
-import java.util.Calendar;
-
+import com.google.gson.JsonObject;
 import org.apache.edgent.function.Consumer;
 import org.apache.edgent.function.Function;
 import org.apache.edgent.function.Supplier;
@@ -28,18 +27,19 @@
 import org.apache.plc4x.java.api.connection.PlcReader;
 import org.apache.plc4x.java.api.connection.PlcWriter;
 import org.apache.plc4x.java.api.exceptions.PlcException;
-import org.apache.plc4x.java.api.messages.*;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.model.Address;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.gson.JsonObject;
+import java.util.Calendar;
 
 /**
  * PlcConnectionAdapter encapsulates a plc4x {@link PlcConnection}.
  * <p>
  * The idea here is to use PlcConnectionAdapter to enable our Edgent Supplier/Consumer
- * instances to be isolated from the details of / variability of 
+ * instances to be isolated from the details of / variability of
  * PlcConnection mgmt and such.
  * <p>
  * A PlcConnectionAdapter is subject to the constraints of the underlying
@@ -53,17 +53,17 @@
  * support for multiple connections from a single client.
  * <p>
  * A single PlcConnectionAdapter can be used by multiple threads concurrently
- * (e.g., used by multiple PlcFunctions Consumers for {@code Topology.poll()} and/or 
- * multiple Suppliers for {@code TStream.sink()}). 
- * 
+ * (e.g., used by multiple PlcFunctions Consumers for {@code Topology.poll()} and/or
+ * multiple Suppliers for {@code TStream.sink()}).
+ *
  * @see PlcFunctions
  */
-public class PlcConnectionAdapter implements AutoCloseable{
+public class PlcConnectionAdapter implements AutoCloseable {
 
-  private static final Logger logger = LoggerFactory.getLogger(PlcConnectionAdapter.class);
-  
-  private String plcConnectionUrl;
-  private PlcConnection plcConnection;
+    private static final Logger logger = LoggerFactory.getLogger(PlcConnectionAdapter.class);
+
+    private String plcConnectionUrl;
+    private PlcConnection plcConnection;
   
   /*
    * NOTES:
@@ -71,130 +71,127 @@
    *   of read or write errors, my thinking is to enhance the PlcConnectionAdapter
    *   to enable the app to register an error callback handler or such.
    */
-  
-  public PlcConnectionAdapter(PlcConnection plcConnection) {
-    this.plcConnection = plcConnection;
-  }
-  
-  public PlcConnectionAdapter(String plcConnectionUrl) {
-    this.plcConnectionUrl = plcConnectionUrl;
-  }
-  
-  PlcConnection getConnection() throws PlcException {
-    synchronized(this) {
-      if (plcConnection == null) {
-        plcConnection = new PlcDriverManager().getConnection(plcConnectionUrl);
-      }
-      return plcConnection;
+
+    public PlcConnectionAdapter(PlcConnection plcConnection) {
+        this.plcConnection = plcConnection;
     }
-  }
 
-  @Override
-  public void close() throws Exception {
-    // only close a connection this instance created/connected
-    if (plcConnectionUrl != null) {
-      if (plcConnection != null)
-        plcConnection.close();
+    public PlcConnectionAdapter(String plcConnectionUrl) {
+        this.plcConnectionUrl = plcConnectionUrl;
     }
-  }
 
-  <T> Supplier<T> newSupplier(Class<T> datatype, String addressStr) {
-    PlcConnectionAdapter.checkDatatype(datatype);
-    return new Supplier<T>() {
-      private static final long serialVersionUID = 1L;
-
-      @Override
-      public T get() {
-        PlcConnection connection = null;
-        Address address = null;
-        try {
-          connection = getConnection();
-          address = connection.parseAddress(addressStr);
-          PlcReader reader = connection.getReader().get();
-          PlcReadRequest readRequest = PlcConnectionAdapter.newPlcReadRequest(datatype, address);
-          T value = (T) reader.read(readRequest).get().getResponseItems().get(0).getValues().get(0);
-          return value;
+    PlcConnection getConnection() throws PlcException {
+        synchronized (this) {
+            if (plcConnection == null) {
+                plcConnection = new PlcDriverManager().getConnection(plcConnectionUrl);
+            }
+            return plcConnection;
         }
-        catch (Exception e) {
-          logger.error("reading from plc device {} {} failed", connection, address, e);
-          return null;
+    }
+
+    @Override
+    public void close() throws Exception {
+        // only close a connection this instance created/connected
+        if (plcConnectionUrl != null) {
+            if (plcConnection != null)
+                plcConnection.close();
         }
-      }
-      
-    };
-  }
+    }
 
-  <T> Consumer<T> newConsumer(Class<T> datatype, String addressStr) {
-    PlcConnectionAdapter.checkDatatype(datatype);
-    return new Consumer<T>() {
-      private static final long serialVersionUID = 1L;
+    <T> Supplier<T> newSupplier(Class<T> datatype, String addressStr) {
+        PlcConnectionAdapter.checkDatatype(datatype);
+        return new Supplier<T>() {
+            private static final long serialVersionUID = 1L;
 
-      @Override
-      public void accept(T arg0) {
-        PlcConnection connection = null;
-        Address address = null;
-        try {
-          connection = getConnection();
-          address = connection.parseAddress(addressStr);
-          PlcWriter writer = connection.getWriter().get();
-          PlcWriteRequest writeReq = PlcConnectionAdapter.newPlcWriteRequest(address, arg0);
-          writer.write(writeReq).get();
-        }
-        catch (Exception e) {
-          logger.error("writing to plc device {} {} failed", connection, address, e);
-        }
-      }
-      
-    };
-  }
-  
-  <T> Consumer<JsonObject> newConsumer(Class<T> datatype, Function<JsonObject,String> addressFn, Function<JsonObject,T> valueFn) {
-    PlcConnectionAdapter.checkDatatype(datatype);
-    return new Consumer<JsonObject>() {
-      private static final long serialVersionUID = 1L;
+            @Override
+            public T get() {
+                PlcConnection connection = null;
+                Address address = null;
+                try {
+                    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;
+                } catch (Exception e) {
+                    logger.error("reading from plc device {} {} failed", connection, address, e);
+                    return null;
+                }
+            }
 
-      @Override
-      public void accept(JsonObject jo) {
-        PlcConnection connection = null;
-        Address address = null;
-        try {
-          connection = getConnection();
-          String addressStr = addressFn.apply(jo);
-          address = connection.parseAddress(addressStr);
-          T value = valueFn.apply(jo);
-          PlcWriter writer = connection.getWriter().get();
-          PlcWriteRequest writeReq = newPlcWriteRequest(address, value);
-          writer.write(writeReq).get();
-        }
-        catch (Exception e) {
-          logger.error("writing to plc device {} {} failed", connection, address, e);
-        }
-      }
-      
-    };
-  }
+        };
+    }
 
-  static void checkDatatype(Class<?> cls) {
-    if (cls == Boolean.class
-        || cls == Byte.class
-        || cls == Short.class
-        || cls == Integer.class
-        || cls == Float.class
-        || cls == String.class
-        || cls == Calendar.class)
-      return;
-    throw new IllegalArgumentException("Not a legal plc data type: "+cls.getSimpleName());
-  }
+    <T> Consumer<T> newConsumer(Class<T> datatype, String addressStr) {
+        PlcConnectionAdapter.checkDatatype(datatype);
+        return new Consumer<T>() {
+            private static final long serialVersionUID = 1L;
 
-  @SuppressWarnings("unchecked")
-  static <T> PlcWriteRequest newPlcWriteRequest(Address address, T value) {
-    Class<?> cls = value.getClass();
-    return new PlcWriteRequest(cls, address, value);
-  }
+            @Override
+            public void accept(T arg0) {
+                PlcConnection connection = null;
+                Address address = null;
+                try {
+                    connection = getConnection();
+                    address = connection.parseAddress(addressStr);
+                    PlcWriter writer = connection.getWriter().get();
+                    PlcWriteRequest writeReq = PlcConnectionAdapter.newPlcWriteRequest(address, arg0);
+                    writer.write(writeReq).get();
+                } catch (Exception e) {
+                    logger.error("writing to plc device {} {} failed", connection, address, e);
+                }
+            }
 
-  @SuppressWarnings("unchecked")
-  static <T> PlcReadRequest newPlcReadRequest(Class<T> datatype, Address address) {
-      return new PlcReadRequest(datatype, address);
-  }
+        };
+    }
+
+    <T> Consumer<JsonObject> newConsumer(Class<T> datatype, Function<JsonObject, String> addressFn, Function<JsonObject, T> valueFn) {
+        PlcConnectionAdapter.checkDatatype(datatype);
+        return new Consumer<JsonObject>() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public void accept(JsonObject jo) {
+                PlcConnection connection = null;
+                Address address = null;
+                try {
+                    connection = getConnection();
+                    String addressStr = addressFn.apply(jo);
+                    address = connection.parseAddress(addressStr);
+                    T value = valueFn.apply(jo);
+                    PlcWriter writer = connection.getWriter().get();
+                    PlcWriteRequest writeReq = newPlcWriteRequest(address, value);
+                    writer.write(writeReq).get();
+                } catch (Exception e) {
+                    logger.error("writing to plc device {} {} failed", connection, address, e);
+                }
+            }
+
+        };
+    }
+
+    static void checkDatatype(Class<?> cls) {
+        if (cls == Boolean.class
+            || cls == Byte.class
+            || cls == Short.class
+            || cls == Integer.class
+            || cls == Float.class
+            || cls == String.class
+            || cls == Calendar.class)
+            return;
+        throw new IllegalArgumentException("Not a legal plc data type: " + cls.getSimpleName());
+    }
+
+    @SuppressWarnings("unchecked")
+    static <T> PlcWriteRequest<T> newPlcWriteRequest(Address address, T value) {
+        Class<T> cls = (Class<T>) value.getClass();
+        return new PlcWriteRequest<>(cls, address, value);
+    }
+
+    @SuppressWarnings("unchecked")
+    static <T> PlcReadRequest<T> newPlcReadRequest(Class<T> datatype, Address address) {
+        return new PlcReadRequest<>(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 88cec7d..36e4d1c 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
@@ -18,11 +18,7 @@
 */
 package org.apache.plc4x.edgent;
 
-import java.lang.reflect.Array;
-import java.util.Calendar;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-
+import com.google.gson.JsonObject;
 import org.apache.edgent.function.Consumer;
 import org.apache.edgent.function.Function;
 import org.apache.edgent.function.Supplier;
@@ -30,7 +26,10 @@
 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.*;
+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.items.ReadRequestItem;
 import org.apache.plc4x.java.api.messages.items.WriteRequestItem;
 import org.apache.plc4x.java.api.model.Address;
@@ -38,507 +37,525 @@
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 
-import com.google.gson.JsonObject;
+import java.lang.reflect.Array;
+import java.util.Calendar;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 
 public class PlcConnectionAdapterTest {
-  
-  // TODO figure out how to get these run via Eclipse (org.junit.jupiter.api?) and remove this
-  // Ah... Junit 5... needs newer Eclipse (newer than neon 1.a)
-  public static void main(String[] args) throws Exception {
-    PlcConnectionAdapterTest t = new PlcConnectionAdapterTest();
-    t.testCtor1();
-    t.testCtor2();
-    t.testCheckDatatype();
-    t.testNewPlcReadRequest();
-    t.testNewPlcWriteRequest();
-    t.testNewSupplier();
-    t.testNewSupplierNeg();
-    t.testNewConsumer1();
-    t.testNewConsumer1Neg();
-    t.testNewConsumer2();
-    t.testNewConsumer2Neg();
-    System.out.println("SUCCESS");
-  }
-  
-  protected MockConnection getMockConnection() throws PlcConnectionException {
-    return (MockConnection) new PlcDriverManager().getConnection("mock://some-cool-url");
-  }
-  
-  /*
-   * Test the PlcConnectionAdapter(PlcConnection) ctor, getConnection() and close()
-   */
-  @Test
-  @Tag("fast")
-  public void testCtor1() throws Exception {
-    MockConnection mockConnection = getMockConnection();
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(mockConnection);
-    Assertions.assertSame(mockConnection, adapter.getConnection());
-    // and again... multiple adapter.getConnection() returns the same
-    Assertions.assertSame(mockConnection, adapter.getConnection());
-    adapter.close();
-  }
-  
-  /*
-   * Test the PlcConnectionAdapter(url) ctor, getConnection() and close()
-   */
-  @Test
-  @Tag("fast")
-  public void testCtor2() throws Exception {
-    MockConnection mockConnection = getMockConnection();
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(mockConnection.getUrl());
-    MockConnection mockConnection2 = (MockConnection) adapter.getConnection();
-    Assertions.assertNotSame(mockConnection, mockConnection2);
-    Assertions.assertSame(mockConnection.getUrl(), mockConnection2.getUrl());
-    // and again... multiple adapter.getConnection() returns the same
-    Assertions.assertSame(mockConnection2, adapter.getConnection());
-    adapter.close();
-  }
- 
-  @Test
-  @Tag("fast")
-  public void testCheckDatatype() throws Exception {
-    PlcConnectionAdapter.checkDatatype(Boolean.class);
-    PlcConnectionAdapter.checkDatatype(Byte.class);
-    PlcConnectionAdapter.checkDatatype(Short.class);
-    PlcConnectionAdapter.checkDatatype(Integer.class);
-    PlcConnectionAdapter.checkDatatype(Float.class);
-    PlcConnectionAdapter.checkDatatype(String.class);
-    PlcConnectionAdapter.checkDatatype(Calendar.class);
-    Assertions.assertThrows(IllegalArgumentException.class,
-        () -> PlcConnectionAdapter.checkDatatype(Long.class));
-    Assertions.assertThrows(IllegalArgumentException.class,
-        () -> PlcConnectionAdapter.checkDatatype(Double.class));
-  }
-  
-  private <T> void checkRead(MockConnection connection, PlcReadRequest 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> cf = connection.read(request);
-    
-    Assertions.assertTrue(cf.isDone());
-    PlcReadResponse response = cf.get();
-    Assertions.assertEquals(value, response.getResponseItems().get(0).getValues().get(0));
-  }
-  
-  private <T> void checkWrite(MockConnection connection, PlcWriteRequest 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> cf = connection.write(request);
-    
-    Assertions.assertTrue(cf.isDone());
-    PlcWriteResponse response = cf.get();
-    Assertions.assertNotNull(response);
-    T writtenData = (T) connection.getDataValue(request.getRequestItems().get(0).getAddress());
-    if(writtenData.getClass().isArray()) {
-      writtenData = (T) Array.get(writtenData, 0);
+
+    // TODO figure out how to get these run via Eclipse (org.junit.jupiter.api?) and remove this
+    // Ah... Junit 5... needs newer Eclipse (newer than neon 1.a)
+    public static void main(String[] args) throws Exception {
+        PlcConnectionAdapterTest t = new PlcConnectionAdapterTest();
+        t.testCtor1();
+        t.testCtor2();
+        t.testCheckDatatype();
+        t.testNewPlcReadRequest();
+        t.testNewPlcWriteRequest();
+        t.testNewSupplier();
+        t.testNewSupplierNeg();
+        t.testNewConsumer1();
+        t.testNewConsumer1Neg();
+        t.testNewConsumer2();
+        t.testNewConsumer2Neg();
+        System.out.println("SUCCESS");
     }
-    Assertions.assertEquals(value, writtenData);
-  }
-  
-  /*
-   * Verify the adapter yields the appropriate PlcReadRequest for each type and that it works.
-   */
-  @SuppressWarnings("unchecked")
-  @Test
-  @Tag("fast")
-  public void testNewPlcReadRequest() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
 
-    PlcReadRequest request;
-    
-    request = PlcConnectionAdapter.newPlcReadRequest(Boolean.class, address);
-    ReadRequestItem requestItem = request.getReadRequestItems().get(0);
-    Class dataType = requestItem.getDatatype();
-    Assertions.assertTrue(dataType == Boolean.class, "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkRead(connection, request, true);
-    checkRead(connection, request, false);
-    
-    request = PlcConnectionAdapter.newPlcReadRequest(Byte.class, address);
-    requestItem = request.getReadRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(dataType == Byte.class, "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkRead(connection, request, (byte)0x13);
-    checkRead(connection, request, (byte)0x23);
-    
-    request = PlcConnectionAdapter.newPlcReadRequest(Short.class, address);
-    requestItem = request.getReadRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(dataType == Short.class, "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkRead(connection, request, (short)13);
-    checkRead(connection, request, (short)23);
-
-    request = PlcConnectionAdapter.newPlcReadRequest(Integer.class, address);
-    requestItem = request.getReadRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(dataType == Integer.class, "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkRead(connection, request, 33);
-    checkRead(connection, request, -133);
-    
-    request = PlcConnectionAdapter.newPlcReadRequest(Float.class, address);
-    requestItem = request.getReadRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(dataType == Float.class, "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkRead(connection, request, 43.5f);
-    checkRead(connection, request, -143.5f);
-    
-    request = PlcConnectionAdapter.newPlcReadRequest(String.class, address);
-    requestItem = request.getReadRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(dataType == String.class, "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkRead(connection, request, "ReadySetGo");
-    checkRead(connection, request, "OneMoreTime");
-    
-    request = PlcConnectionAdapter.newPlcReadRequest(Calendar.class, address);
-    requestItem = request.getReadRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(dataType == Calendar.class, "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkRead(connection, request, Calendar.getInstance());
-    
-    adapter.close();
-  }
-  
-  
-  /*
-   * Verify the adapter yields the appropriate PlcWriteRequest for each type and that it works.
-   */
-  @SuppressWarnings("unchecked")
-  @Test
-  @Tag("fast")
-  public void testNewPlcWriteRequest() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
-
-    PlcWriteRequest request;
-    
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, true);
-    WriteRequestItem requestItem = request.getRequestItems().get(0);
-    Class dataType = requestItem.getDatatype();
-    Assertions.assertTrue(Boolean.class.isAssignableFrom(dataType), "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkWrite(connection, request, true);
-    
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, (byte)0x113);
-    requestItem = request.getRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(Byte.class.isAssignableFrom(dataType), "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkWrite(connection, request, (byte)0x113);
-    
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, (short)113);
-    requestItem = request.getRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(Short.class.isAssignableFrom(dataType), "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkWrite(connection, request, (short)113);
-
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, 1033);
-    requestItem = request.getRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(Integer.class.isAssignableFrom(dataType), "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkWrite(connection, request, 1033);
-    
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, 1043.5f);
-    requestItem = request.getRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(Float.class.isAssignableFrom(dataType), "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkWrite(connection, request, 1043.5f);
-    
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, "A written value");
-    requestItem = request.getRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    Assertions.assertTrue(String.class.isAssignableFrom(dataType), "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkWrite(connection, request, "A written value");
-    
-    Calendar calValue = Calendar.getInstance();
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, calValue);
-    requestItem = request.getRequestItems().get(0);
-    dataType = requestItem.getDatatype();
-    request = PlcConnectionAdapter.newPlcWriteRequest(address, calValue);
-    Assertions.assertTrue(Calendar.class.isAssignableFrom(dataType), "class:"+request.getClass());
-    Assertions.assertSame(address, requestItem.getAddress());
-    checkWrite(connection, request, calValue);
-    
-    adapter.close();
-  }
-
-  /*
-   * test PlcConnectionAdapter.newSupplier
-   */
-  @SuppressWarnings("unchecked")
-  @Test
-  @Tag("fast")
-  public void testNewSupplier() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
-
-    Supplier<?> supplier;
-    
-    supplier = adapter.newSupplier(Boolean.class, addressStr);
-    Assertions.assertNotSame(supplier, adapter.newSupplier(Boolean.class, addressStr));
-    checkSupplier(connection, address, (Supplier<Boolean>)supplier, true, false);
-    
-    supplier = adapter.newSupplier(Byte.class, addressStr);
-    checkSupplier(connection, address, (Supplier<Byte>)supplier, (byte)0x1, (byte)0x2, (byte)0x3);
-    
-    supplier = adapter.newSupplier(Short.class, addressStr);
-    checkSupplier(connection, address, (Supplier<Short>)supplier, (short)1, (short)2, (short)3);
-
-    supplier = adapter.newSupplier(Integer.class, addressStr);
-    checkSupplier(connection, address, (Supplier<Integer>)supplier, 1000, 1001, 1002);
-    
-    supplier = adapter.newSupplier(Float.class, addressStr);
-    checkSupplier(connection, address, (Supplier<Float>)supplier, 1000.5f, 1001.5f, 1002.5f);
-    
-    supplier = adapter.newSupplier(String.class, addressStr);
-    checkSupplier(connection, address, (Supplier<String>)supplier, "one", "two", "three");
-    
-    adapter.close();
-  }
-  
-  /*
-   * test PlcConnectionAdapter.newSupplier with read exception
-   */
-  @SuppressWarnings("unchecked")
-  @Test
-  @Tag("fast")
-  public void testNewSupplierNeg() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
-
-    Supplier<?> supplier;
-    
-    supplier = adapter.newSupplier(String.class, addressStr);
-    checkSupplier(2, connection, address, (Supplier<String>)supplier, "one", "two", "three");
-    
-    adapter.close();
-  }
-  
-  static <T> void checkSupplier(MockConnection connection, Address address, Supplier<T> supplier, Object ... values) throws Exception {
-    checkSupplier(0, connection, address, supplier, values);
-  }
-  private static <T> void checkSupplier(int readFailureCountTrigger, MockConnection connection, Address address, Supplier<T> supplier, Object ... values) throws Exception {
-    // verify that a read failure doesn't kill the consumer
-    // it logs (not verified) but returns null (as designed) and keeps working for the subsequent reads
-    connection.setReadException(readFailureCountTrigger, "This is a mock read exception");
-    int readCount = 0;
-    for (Object value : values) {
-      connection.setDataValue(address, value);
-      T readData = supplier.get();
-      // System.out.println("checkSupplier"+(readFailureCountTrigger > 0 ? "NEG" : "")+": value:"+value+" readData:"+readData);
-      if (readFailureCountTrigger <= 0)
-        Assertions.assertEquals(value, readData);
-      else {
-        if (++readCount != readFailureCountTrigger)
-          Assertions.assertEquals(value, readData);
-        else
-          Assertions.assertNull(readData);
-      }
+    protected MockConnection getMockConnection() throws PlcConnectionException {
+        return (MockConnection) new PlcDriverManager().getConnection("mock://some-cool-url");
     }
-  }
 
-  /*
-   * test PlcConnectionAdapter.newConsumer(address)
-   */
-  @SuppressWarnings("unchecked")
-  @Test
-  @Tag("fast")
-  public void testNewConsumer1() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
+    /*
+     * Test the PlcConnectionAdapter(PlcConnection) ctor, getConnection() and close()
+     */
+    @Test
+    @Tag("fast")
+    public void testCtor1() throws Exception {
+        MockConnection mockConnection = getMockConnection();
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(mockConnection);
+        Assertions.assertSame(mockConnection, adapter.getConnection());
+        // and again... multiple adapter.getConnection() returns the same
+        Assertions.assertSame(mockConnection, adapter.getConnection());
+        adapter.close();
+    }
 
-    Consumer<?> consumer;
-    
-    consumer = adapter.newConsumer(Boolean.class, addressStr);
-    Assertions.assertNotSame(consumer, adapter.newConsumer(Boolean.class, addressStr));
-    checkConsumer(connection, address, consumer, true, false);
-    
-    consumer = adapter.newConsumer(Byte.class, addressStr);
-    checkConsumer(connection, address, consumer, (byte)0x1, (byte)0x2, (byte)0x3);
-    
-    consumer = adapter.newConsumer(Short.class, addressStr);
-    checkConsumer(connection, address, consumer, (short)1, (short)2, (short)3);
+    /*
+     * Test the PlcConnectionAdapter(url) ctor, getConnection() and close()
+     */
+    @Test
+    @Tag("fast")
+    public void testCtor2() throws Exception {
+        MockConnection mockConnection = getMockConnection();
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(mockConnection.getUrl());
+        MockConnection mockConnection2 = (MockConnection) adapter.getConnection();
+        Assertions.assertNotSame(mockConnection, mockConnection2);
+        Assertions.assertSame(mockConnection.getUrl(), mockConnection2.getUrl());
+        // and again... multiple adapter.getConnection() returns the same
+        Assertions.assertSame(mockConnection2, adapter.getConnection());
+        adapter.close();
+    }
 
-    consumer = adapter.newConsumer(Integer.class, addressStr);
-    checkConsumer(connection, address, consumer, 1000, 1001, 1002);
-    
-    consumer = adapter.newConsumer(Float.class, addressStr);
-    checkConsumer(connection, address, consumer, 1000.5f, 1001.5f, 1002.5f);
-    
-    consumer = adapter.newConsumer(String.class, addressStr);
-    checkConsumer(connection, address, consumer, "one", "two", "three");
-    
-    adapter.close();
-  }
+    @Test
+    @Tag("fast")
+    public void testCheckDatatype() throws Exception {
+        PlcConnectionAdapter.checkDatatype(Boolean.class);
+        PlcConnectionAdapter.checkDatatype(Byte.class);
+        PlcConnectionAdapter.checkDatatype(Short.class);
+        PlcConnectionAdapter.checkDatatype(Integer.class);
+        PlcConnectionAdapter.checkDatatype(Float.class);
+        PlcConnectionAdapter.checkDatatype(String.class);
+        PlcConnectionAdapter.checkDatatype(Calendar.class);
+        Assertions.assertThrows(IllegalArgumentException.class,
+            () -> PlcConnectionAdapter.checkDatatype(Long.class));
+        Assertions.assertThrows(IllegalArgumentException.class,
+            () -> PlcConnectionAdapter.checkDatatype(Double.class));
+    }
 
-  /*
-   * test PlcConnectionAdapter.newConsumer(address) with write exception
-   */
-  @SuppressWarnings("unchecked")
-  @Test
-  @Tag("fast")
-  public void testNewConsumer1Neg() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
+    private <T> void checkRead(MockConnection connection, PlcReadRequest<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);
 
-    Consumer<?> consumer;
-    
-    consumer = adapter.newConsumer(String.class, addressStr);
-    checkConsumer(2, connection, address, (Consumer<String>)consumer, "one", "two", "three");
-    
-    adapter.close();
-  }
-  
-  static <T> void checkConsumer(MockConnection connection, Address address, Consumer<T> consumer, Object ... values) throws Exception {
-    checkConsumer(0, connection, address, consumer, values);
-  }
-  @SuppressWarnings("unchecked")
-  private static <T> void checkConsumer(int writeFailureCountTrigger, MockConnection connection, Address address, Consumer<T> consumer, Object ... values) throws Exception {
-    // verify that a write failure doesn't kill the consumer
-    // it logs (not verified) but keeps working for the subsequent writes
-    connection.setWriteException(writeFailureCountTrigger, "This is a mock write exception");
-    int writeCount = 0;
-    Object previousValue = null;
-    for (Object value : values) {
-      consumer.accept((T)value);
-      T writtenData = (T) connection.getDataValue(address);
-      if(writtenData.getClass().isArray()) {
-        writtenData = (T) Array.get(writtenData, 0);
-      }
-      // System.out.println("checkConsumer"+(writeFailureCountTrigger > 0 ? "NEG" : "")+": value:"+value+" writtenData:"+writtenData);
-      if (writeFailureCountTrigger <= 0)
+        CompletableFuture<PlcReadResponse<T>> cf = connection.read(request);
+
+        Assertions.assertTrue(cf.isDone());
+        PlcReadResponse<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 {
+        // 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);
+
+        Assertions.assertTrue(cf.isDone());
+        PlcWriteResponse response = cf.get();
+        Assertions.assertNotNull(response);
+        T writtenData = (T) connection.getDataValue(request.getRequestItems().get(0).getAddress());
+        if (writtenData.getClass().isArray()) {
+            writtenData = (T) Array.get(writtenData, 0);
+        }
         Assertions.assertEquals(value, writtenData);
-      else { 
-        if (++writeCount != writeFailureCountTrigger)
-          Assertions.assertEquals(value, writtenData);
-        else
-          Assertions.assertEquals(previousValue, writtenData);
-      }
-      previousValue = value;
     }
-  }
 
-  /*
-   * test PlcConnectionAdapter.newConsumer(addressFn, valueFn)
-   */
-  @Test
-  @Tag("fast")
-  public void testNewConsumer2() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
+    /*
+     * Verify the adapter yields the appropriate PlcReadRequest for each type and that it works.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    @Tag("fast")
+    public void testNewPlcReadRequest() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
 
-    Consumer<JsonObject> consumer;
-    
-    Function<JsonObject,String> addressFn = t -> t.get("address").getAsString(); 
-    
-    consumer = adapter.newConsumer(Boolean.class, addressFn, t -> t.get("value").getAsBoolean());
-    checkConsumerJson(connection, address, consumer, true, false);
-    
-    consumer = adapter.newConsumer(Byte.class, addressFn, t -> t.get("value").getAsByte());
-    checkConsumerJson(connection, address, consumer, (byte)0x1, (byte)0x2, (byte)0x3);
-    
-    consumer = adapter.newConsumer(Short.class, addressFn, t -> t.get("value").getAsShort());
-    checkConsumerJson(connection, address, consumer, (short)1, (short)2, (short)3);
-
-    consumer = adapter.newConsumer(Integer.class, addressFn, t -> t.get("value").getAsInt());
-    checkConsumerJson(connection, address, consumer, 1000, 1001, 1002);
-    
-    consumer = adapter.newConsumer(Float.class, addressFn, t -> t.get("value").getAsFloat());
-    checkConsumerJson(connection, address, consumer, 1000.5f, 1001.5f, 1002.5f);
-    
-    consumer = adapter.newConsumer(String.class, addressFn, t -> t.get("value").getAsString());
-    checkConsumerJson(connection, address, consumer, "one", "two", "three");
-    
-    adapter.close();
-  }
-
-  /*
-   * test PlcConnectionAdapter.newConsumer(addressFn, valueFn) with write failure
-   */
-  @Test
-  @Tag("fast")
-  public void testNewConsumer2Neg() throws Exception {
-    String addressStr = "MyReadWriteAddress/0";
-    MockAddress address = new MockAddress(addressStr);
-    PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
-    MockConnection connection = (MockConnection) adapter.getConnection();
-
-    Consumer<JsonObject> consumer;
-    
-    Function<JsonObject,String> addressFn = t -> t.get("address").getAsString(); 
-    
-    consumer = adapter.newConsumer(String.class, addressFn, t -> t.get("value").getAsString());
-    checkConsumerJson(2, connection, address, consumer, "one", "two", "three");
-    
-    adapter.close();
-  }
-  
-  static <T> void checkConsumerJson(MockConnection connection, MockAddress address, Consumer<JsonObject> consumer, Object ... values) throws Exception {
-    checkConsumerJson(0, connection, address, consumer, values);
-  }
-  private static <T> void checkConsumerJson(int writeFailureCountTrigger, MockConnection connection, MockAddress address, Consumer<JsonObject> consumer, Object ... values) throws Exception {
-    if (writeFailureCountTrigger > 0)
-      connection.setWriteException(writeFailureCountTrigger, "This is a mock write exception");
-    int writeCount = 0;
-    Object previousValue = null;
-    for (Object value : values) {
-      
-      // build the JsonObject to consume
-      JsonObject jo = new JsonObject();
-      jo.addProperty("address", address.getAddress());
-      if (value instanceof Boolean)
-        jo.addProperty("value", (Boolean)value);
-      else if (value instanceof Number)
-        jo.addProperty("value", (Number)value);
-      else if (value instanceof String)
-        jo.addProperty("value", (String)value);
-      
-      consumer.accept(jo);
-      
-      @SuppressWarnings("unchecked")
-      T writtenData = (T) connection.getDataValue(address);
-      if(writtenData.getClass().isArray()) {
-        writtenData = (T) Array.get(writtenData, 0);
-      }
-      // System.out.println("checkConsumerJson"+(writeFailureCountTrigger > 0 ? "NEG" : "")+": value:"+value+" writtenData:"+writtenData);
-      if (writeFailureCountTrigger <= 0)
-        Assertions.assertEquals(value, writtenData);
-      else { 
-        if (++writeCount != writeFailureCountTrigger)
-          Assertions.assertEquals(value, writtenData);
-        else
-          Assertions.assertEquals(previousValue, writtenData);
-      }
-      previousValue = value;
+        {
+            PlcReadRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkRead(connection, request, true);
+            checkRead(connection, request, false);
+        }
+        {
+            PlcReadRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkRead(connection, request, (byte) 0x13);
+            checkRead(connection, request, (byte) 0x23);
+        }
+        {
+            PlcReadRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkRead(connection, request, (short) 13);
+            checkRead(connection, request, (short) 23);
+        }
+        {
+            PlcReadRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkRead(connection, request, 33);
+            checkRead(connection, request, -133);
+        }
+        {
+            PlcReadRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkRead(connection, request, 43.5f);
+            checkRead(connection, request, -143.5f);
+        }
+        {
+            PlcReadRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkRead(connection, request, "ReadySetGo");
+            checkRead(connection, request, "OneMoreTime");
+        }
+        {
+            PlcReadRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkRead(connection, request, Calendar.getInstance());
+        }
+        adapter.close();
     }
-  }
+
+
+    /*
+     * Verify the adapter yields the appropriate PlcWriteRequest for each type and that it works.
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    @Tag("fast")
+    public void testNewPlcWriteRequest() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
+
+        {
+            PlcWriteRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkWrite(connection, request, true);
+        }
+        {
+            PlcWriteRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkWrite(connection, request, (byte) 0x113);
+        }
+        {
+            PlcWriteRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkWrite(connection, request, (short) 113);
+        }
+        {
+            PlcWriteRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkWrite(connection, request, 1033);
+        }
+        {
+            PlcWriteRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkWrite(connection, request, 1043.5f);
+        }
+        {
+            PlcWriteRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkWrite(connection, request, "A written value");
+        }
+        {
+            Calendar calValue = Calendar.getInstance();
+            PlcWriteRequest<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());
+            Assertions.assertSame(address, requestItem.getAddress());
+            checkWrite(connection, request, calValue);
+        }
+        adapter.close();
+    }
+
+    /*
+     * test PlcConnectionAdapter.newSupplier
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    @Tag("fast")
+    public void testNewSupplier() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
+
+        {
+            Supplier<Boolean> supplier = adapter.newSupplier(Boolean.class, addressStr);
+            Assertions.assertNotSame(supplier, adapter.newSupplier(Boolean.class, addressStr));
+            checkSupplier(connection, address, supplier, true, false);
+        }
+        {
+            Supplier<Byte> supplier = adapter.newSupplier(Byte.class, addressStr);
+            checkSupplier(connection, address, supplier, (byte) 0x1, (byte) 0x2, (byte) 0x3);
+        }
+        {
+            Supplier<Short> supplier = adapter.newSupplier(Short.class, addressStr);
+            checkSupplier(connection, address, supplier, (short) 1, (short) 2, (short) 3);
+        }
+        {
+            Supplier<Integer> supplier = adapter.newSupplier(Integer.class, addressStr);
+            checkSupplier(connection, address, supplier, 1000, 1001, 1002);
+        }
+        {
+            Supplier<Float> supplier = adapter.newSupplier(Float.class, addressStr);
+            checkSupplier(connection, address, supplier, 1000.5f, 1001.5f, 1002.5f);
+        }
+        {
+            Supplier<?> supplier = adapter.newSupplier(String.class, addressStr);
+            checkSupplier(connection, address, supplier, "one", "two", "three");
+        }
+        adapter.close();
+    }
+
+    /*
+     * test PlcConnectionAdapter.newSupplier with read exception
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    @Tag("fast")
+    public void testNewSupplierNeg() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
+
+        Supplier<String> supplier = adapter.newSupplier(String.class, addressStr);
+        checkSupplier(2, connection, address, supplier, "one", "two", "three");
+
+        adapter.close();
+    }
+
+    static <T> void checkSupplier(MockConnection connection, Address address, Supplier<T> supplier, Object... values) throws Exception {
+        checkSupplier(0, connection, address, supplier, values);
+    }
+
+    private static <T> void checkSupplier(int readFailureCountTrigger, MockConnection connection, Address address, Supplier<T> supplier, Object... values) throws Exception {
+        // verify that a read failure doesn't kill the consumer
+        // it logs (not verified) but returns null (as designed) and keeps working for the subsequent reads
+        connection.setReadException(readFailureCountTrigger, "This is a mock read exception");
+        int readCount = 0;
+        for (Object value : values) {
+            connection.setDataValue(address, value);
+            T readData = supplier.get();
+            // System.out.println("checkSupplier"+(readFailureCountTrigger > 0 ? "NEG" : "")+": value:"+value+" readData:"+readData);
+            if (readFailureCountTrigger <= 0)
+                Assertions.assertEquals(value, readData);
+            else {
+                if (++readCount != readFailureCountTrigger)
+                    Assertions.assertEquals(value, readData);
+                else
+                    Assertions.assertNull(readData);
+            }
+        }
+    }
+
+    /*
+     * test PlcConnectionAdapter.newConsumer(address)
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    @Tag("fast")
+    public void testNewConsumer1() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
+
+        Consumer<?> consumer;
+
+        consumer = adapter.newConsumer(Boolean.class, addressStr);
+        Assertions.assertNotSame(consumer, adapter.newConsumer(Boolean.class, addressStr));
+        checkConsumer(connection, address, consumer, true, false);
+
+        consumer = adapter.newConsumer(Byte.class, addressStr);
+        checkConsumer(connection, address, consumer, (byte) 0x1, (byte) 0x2, (byte) 0x3);
+
+        consumer = adapter.newConsumer(Short.class, addressStr);
+        checkConsumer(connection, address, consumer, (short) 1, (short) 2, (short) 3);
+
+        consumer = adapter.newConsumer(Integer.class, addressStr);
+        checkConsumer(connection, address, consumer, 1000, 1001, 1002);
+
+        consumer = adapter.newConsumer(Float.class, addressStr);
+        checkConsumer(connection, address, consumer, 1000.5f, 1001.5f, 1002.5f);
+
+        consumer = adapter.newConsumer(String.class, addressStr);
+        checkConsumer(connection, address, consumer, "one", "two", "three");
+
+        adapter.close();
+    }
+
+    /*
+     * test PlcConnectionAdapter.newConsumer(address) with write exception
+     */
+    @SuppressWarnings("unchecked")
+    @Test
+    @Tag("fast")
+    public void testNewConsumer1Neg() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
+
+        Consumer<?> consumer;
+
+        consumer = adapter.newConsumer(String.class, addressStr);
+        checkConsumer(2, connection, address, (Consumer<String>) consumer, "one", "two", "three");
+
+        adapter.close();
+    }
+
+    static <T> void checkConsumer(MockConnection connection, Address address, Consumer<T> consumer, Object... values) throws Exception {
+        checkConsumer(0, connection, address, consumer, values);
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T> void checkConsumer(int writeFailureCountTrigger, MockConnection connection, Address address, Consumer<T> consumer, Object... values) throws Exception {
+        // verify that a write failure doesn't kill the consumer
+        // it logs (not verified) but keeps working for the subsequent writes
+        connection.setWriteException(writeFailureCountTrigger, "This is a mock write exception");
+        int writeCount = 0;
+        Object previousValue = null;
+        for (Object value : values) {
+            consumer.accept((T) value);
+            T writtenData = (T) connection.getDataValue(address);
+            if (writtenData.getClass().isArray()) {
+                writtenData = (T) Array.get(writtenData, 0);
+            }
+            // System.out.println("checkConsumer"+(writeFailureCountTrigger > 0 ? "NEG" : "")+": value:"+value+" writtenData:"+writtenData);
+            if (writeFailureCountTrigger <= 0)
+                Assertions.assertEquals(value, writtenData);
+            else {
+                if (++writeCount != writeFailureCountTrigger)
+                    Assertions.assertEquals(value, writtenData);
+                else
+                    Assertions.assertEquals(previousValue, writtenData);
+            }
+            previousValue = value;
+        }
+    }
+
+    /*
+     * test PlcConnectionAdapter.newConsumer(addressFn, valueFn)
+     */
+    @Test
+    @Tag("fast")
+    public void testNewConsumer2() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
+
+        Consumer<JsonObject> consumer;
+
+        Function<JsonObject, String> addressFn = t -> t.get("address").getAsString();
+
+        consumer = adapter.newConsumer(Boolean.class, addressFn, t -> t.get("value").getAsBoolean());
+        checkConsumerJson(connection, address, consumer, true, false);
+
+        consumer = adapter.newConsumer(Byte.class, addressFn, t -> t.get("value").getAsByte());
+        checkConsumerJson(connection, address, consumer, (byte) 0x1, (byte) 0x2, (byte) 0x3);
+
+        consumer = adapter.newConsumer(Short.class, addressFn, t -> t.get("value").getAsShort());
+        checkConsumerJson(connection, address, consumer, (short) 1, (short) 2, (short) 3);
+
+        consumer = adapter.newConsumer(Integer.class, addressFn, t -> t.get("value").getAsInt());
+        checkConsumerJson(connection, address, consumer, 1000, 1001, 1002);
+
+        consumer = adapter.newConsumer(Float.class, addressFn, t -> t.get("value").getAsFloat());
+        checkConsumerJson(connection, address, consumer, 1000.5f, 1001.5f, 1002.5f);
+
+        consumer = adapter.newConsumer(String.class, addressFn, t -> t.get("value").getAsString());
+        checkConsumerJson(connection, address, consumer, "one", "two", "three");
+
+        adapter.close();
+    }
+
+    /*
+     * test PlcConnectionAdapter.newConsumer(addressFn, valueFn) with write failure
+     */
+    @Test
+    @Tag("fast")
+    public void testNewConsumer2Neg() throws Exception {
+        String addressStr = "MyReadWriteAddress/0";
+        MockAddress address = new MockAddress(addressStr);
+        PlcConnectionAdapter adapter = new PlcConnectionAdapter(getMockConnection());
+        MockConnection connection = (MockConnection) adapter.getConnection();
+
+        Consumer<JsonObject> consumer;
+
+        Function<JsonObject, String> addressFn = t -> t.get("address").getAsString();
+
+        consumer = adapter.newConsumer(String.class, addressFn, t -> t.get("value").getAsString());
+        checkConsumerJson(2, connection, address, consumer, "one", "two", "three");
+
+        adapter.close();
+    }
+
+    static <T> void checkConsumerJson(MockConnection connection, MockAddress address, Consumer<JsonObject> consumer, Object... values) throws Exception {
+        checkConsumerJson(0, connection, address, consumer, values);
+    }
+
+    private static <T> void checkConsumerJson(int writeFailureCountTrigger, MockConnection connection, MockAddress address, Consumer<JsonObject> consumer, Object... values) throws Exception {
+        if (writeFailureCountTrigger > 0)
+            connection.setWriteException(writeFailureCountTrigger, "This is a mock write exception");
+        int writeCount = 0;
+        Object previousValue = null;
+        for (Object value : values) {
+
+            // build the JsonObject to consume
+            JsonObject jo = new JsonObject();
+            jo.addProperty("address", address.getAddress());
+            if (value instanceof Boolean)
+                jo.addProperty("value", (Boolean) value);
+            else if (value instanceof Number)
+                jo.addProperty("value", (Number) value);
+            else if (value instanceof String)
+                jo.addProperty("value", (String) value);
+
+            consumer.accept(jo);
+
+            @SuppressWarnings("unchecked")
+            T writtenData = (T) connection.getDataValue(address);
+            if (writtenData.getClass().isArray()) {
+                writtenData = (T) Array.get(writtenData, 0);
+            }
+            // System.out.println("checkConsumerJson"+(writeFailureCountTrigger > 0 ? "NEG" : "")+": value:"+value+" writtenData:"+writtenData);
+            if (writeFailureCountTrigger <= 0)
+                Assertions.assertEquals(value, writtenData);
+            else {
+                if (++writeCount != writeFailureCountTrigger)
+                    Assertions.assertEquals(value, writtenData);
+                else
+                    Assertions.assertEquals(previousValue, writtenData);
+            }
+            previousValue = value;
+        }
+    }
 
 }
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 d02c7a0..c81ce11 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
@@ -18,9 +18,6 @@
 */
 package org.apache.plc4x.edgent.mock;
 
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.connection.AbstractPlcConnection;
 import org.apache.plc4x.java.api.connection.PlcReader;
@@ -39,33 +36,36 @@
 import org.apache.plc4x.java.api.model.Address;
 import org.apache.plc4x.java.api.types.ResponseCode;
 
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+
 public class MockConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
 
     private final String url;
     private final PlcAuthentication authentication;
-    private final Map<Address,Object> dataValueMap = new HashMap<>();
+    private final Map<Address, Object> dataValueMap = new HashMap<>();
     private long curReadCnt;
     private int readExceptionTriggerCount;
     private String readExceptionMsg;
     private long curWriteCnt;
     private int writeExceptionTriggerCount;
     private String writeExceptionMsg;
-  
+
     public MockConnection(String url) {
-      this(url, null);
+        this(url, null);
     }
-  
+
     public MockConnection(String url, PlcAuthentication authentication) {
-      this.url = url;
-      this.authentication = authentication;
+        this.url = url;
+        this.authentication = authentication;
     }
-  
+
     public PlcAuthentication getAuthentication() {
         return authentication;
     }
-    
+
     public String getUrl() {
-      return url;
+        return url;
     }
 
     @Override
@@ -80,68 +80,73 @@
 
     @Override
     public Address parseAddress(String addressString) throws PlcException {
-      return new MockAddress(addressString);
+        return new MockAddress(addressString);
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
-      curReadCnt++;
-      if (readExceptionTriggerCount > 0 && curReadCnt == readExceptionTriggerCount) {
-        curReadCnt = 0;
-        CompletableFuture<PlcReadResponse> cf = new CompletableFuture<>();
-        cf.completeExceptionally(new PlcIoException(readExceptionMsg));
-        return cf;
-      }
-      List<ReadResponseItem> responseItems = new LinkedList<>();
-      for (ReadRequestItem requestItem : readRequest.getReadRequestItems()) {
-        ReadResponseItem responseItem = new ReadResponseItem(requestItem, ResponseCode.OK,
-          Collections.singletonList(getDataValue(requestItem.getAddress())));
-        responseItems.add(responseItem);
-      }
-      PlcReadResponse response = new PlcReadResponse(readRequest, responseItems);
-      return CompletableFuture.completedFuture(response);
+    public <T> CompletableFuture<PlcReadResponse<T>> read(PlcReadRequest<T> readRequest) {
+        curReadCnt++;
+        if (readExceptionTriggerCount > 0 && curReadCnt == readExceptionTriggerCount) {
+            curReadCnt = 0;
+            CompletableFuture<PlcReadResponse<T>> cf = new CompletableFuture<>();
+            cf.completeExceptionally(new PlcIoException(readExceptionMsg));
+            return cf;
+        }
+        List<ReadResponseItem> responseItems = new LinkedList<>();
+        for (ReadRequestItem requestItem : readRequest.getReadRequestItems()) {
+            ReadResponseItem responseItem = new ReadResponseItem(requestItem, ResponseCode.OK,
+                Collections.singletonList(getDataValue(requestItem.getAddress())));
+            responseItems.add(responseItem);
+        }
+        PlcReadResponse response = new PlcReadResponse(readRequest, responseItems);
+        return CompletableFuture.completedFuture(response);
     }
 
     @Override
-    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
-      curWriteCnt++;
-      if (writeExceptionTriggerCount > 0 && curWriteCnt == writeExceptionTriggerCount) {
-        curWriteCnt = 0;
-        CompletableFuture<PlcWriteResponse> cf = new CompletableFuture<>();
-        cf.completeExceptionally(new PlcIoException(writeExceptionMsg));
-        return cf;
-      }
-       List<WriteResponseItem> responseItems = new LinkedList<>();
-        for (WriteRequestItem requestItem : writeRequest.getRequestItems()) {
-            setDataValue(requestItem.getAddress(), requestItem.getValues());
-            WriteResponseItem responseItem = new WriteResponseItem(requestItem, ResponseCode.OK);
-          responseItems.add(responseItem);
+    public <T> CompletableFuture<PlcWriteResponse<T>> write(PlcWriteRequest<T> writeRequest) {
+        curWriteCnt++;
+        if (writeExceptionTriggerCount > 0 && curWriteCnt == writeExceptionTriggerCount) {
+            curWriteCnt = 0;
+            CompletableFuture<PlcWriteResponse<T>> cf = new CompletableFuture<>();
+            cf.completeExceptionally(new PlcIoException(writeExceptionMsg));
+            return cf;
         }
-      PlcWriteResponse response = new PlcWriteResponse(writeRequest, responseItems);
-      return CompletableFuture.completedFuture(response);
+        List<WriteResponseItem<T>> responseItems = new LinkedList<>();
+        for (WriteRequestItem<T> requestItem : writeRequest.getRequestItems()) {
+            setDataValue(requestItem.getAddress(), requestItem.getValues());
+            WriteResponseItem<T> responseItem = new WriteResponseItem<>(requestItem, ResponseCode.OK);
+            responseItems.add(responseItem);
+        }
+        PlcWriteResponse<T> response = new PlcWriteResponse<>(writeRequest, responseItems);
+        return CompletableFuture.completedFuture(response);
     }
 
     public void setDataValue(Address address, Object o) {
-      dataValueMap.put(address, o);
+        dataValueMap.put(address, o);
     }
+
     public Object getDataValue(Address address) {
-      return dataValueMap.get(address);
+        return dataValueMap.get(address);
     }
-    public Map<Address,Object> getAllDataValues() {
-      return dataValueMap;
+
+    public Map<Address, Object> getAllDataValues() {
+        return dataValueMap;
     }
+
     public void clearAllDataValues() {
-      dataValueMap.clear();
+        dataValueMap.clear();
     }
+
     public void setReadException(int readTriggerCount, String msg) {
-      readExceptionTriggerCount = readTriggerCount;
-      readExceptionMsg = msg;
-      curReadCnt = 0;
+        readExceptionTriggerCount = readTriggerCount;
+        readExceptionMsg = msg;
+        curReadCnt = 0;
     }
+
     public void setWriteException(int writeTriggerCount, String msg) {
-      writeExceptionTriggerCount = writeTriggerCount;
-      writeExceptionMsg = msg;
-      curWriteCnt = 0;
+        writeExceptionTriggerCount = writeTriggerCount;
+        writeExceptionMsg = msg;
+        curWriteCnt = 0;
     }
 }
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 35ddf1b..d6faa78 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
@@ -28,12 +28,14 @@
  */
 public interface PlcReader {
 
+
     /**
      * Reads a requested value from a PLC.
      *
      * @param readRequest object describing the type and location of the value.
+     * @param <T>         type that is being requested.
      * @return a {@link CompletableFuture} giving async access to the returned value.
      */
-    CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest);
+    <T> CompletableFuture<PlcReadResponse<T>> read(PlcReadRequest<T> 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 d427dc8..53add5b 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
@@ -33,8 +33,9 @@
      * 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.
      */
-    CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest);
+    <T> CompletableFuture<PlcWriteResponse<T>> write(PlcWriteRequest<T> writeRequest);
 
 }
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 aed337d..d720136 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,7 +20,9 @@
 
 /**
  * Base type for all forms of messages passed between plc and plc4x system.
+ * @param <T>         type that is being handled.
  */
-public interface PlcMessage {
+@SuppressWarnings("unused")
+public interface PlcMessage<T> {
 
 }
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 5c3e522..dbf8d59 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
@@ -24,33 +24,33 @@
 import java.util.LinkedList;
 import java.util.List;
 
-public class PlcReadRequest implements PlcRequest {
+public class PlcReadRequest<T> implements PlcRequest<T> {
 
-    private final List<ReadRequestItem> readRequestItems;
+    private final List<ReadRequestItem<T>> readRequestItems;
 
     public PlcReadRequest() {
         this.readRequestItems = new LinkedList<>();
     }
 
-    public PlcReadRequest(Class dataType, Address address) {
+    public PlcReadRequest(Class<T> dataType, Address address) {
         this();
-        addItem(new ReadRequestItem(dataType, address));
+        addItem(new ReadRequestItem<>(dataType, address));
     }
 
-    public PlcReadRequest(Class dataType, Address address, int size) {
+    public PlcReadRequest(Class<T> dataType, Address address, int size) {
         this();
-        addItem(new ReadRequestItem(dataType, address, size));
+        addItem(new ReadRequestItem<>(dataType, address, size));
     }
 
-    public PlcReadRequest(List<ReadRequestItem> readRequestItems) {
+    public PlcReadRequest(List<ReadRequestItem<T>> readRequestItems) {
         this.readRequestItems = readRequestItems;
     }
 
-    public void addItem(ReadRequestItem readRequestItem) {
+    public void addItem(ReadRequestItem<T> readRequestItem) {
         readRequestItems.add(readRequestItem);
     }
 
-    public List<ReadRequestItem> getReadRequestItems() {
+    public List<ReadRequestItem<T>> getReadRequestItems() {
         return readRequestItems;
     }
 
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 8d4d7d9..7b31cb3 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,12 +22,12 @@
 
 import java.util.List;
 
-public class PlcReadResponse implements PlcResponse {
+public class PlcReadResponse<T> implements PlcResponse {
 
     private final PlcReadRequest request;
-    private final List<ReadResponseItem> responseItems;
+    private final List<ReadResponseItem<T>> responseItems;
 
-    public PlcReadResponse(PlcReadRequest request, List<ReadResponseItem> responseItems) {
+    public PlcReadResponse(PlcReadRequest request, List<ReadResponseItem<T>> responseItems) {
         this.request = request;
         this.responseItems = responseItems;
     }
@@ -36,7 +36,7 @@
         return request;
     }
 
-    public List<ReadResponseItem> getResponseItems() {
+    public List<ReadResponseItem<T>> getResponseItems() {
         return responseItems;
     }
 
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 f2367f9..40a4b75 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 @@
 /**
  * Base type for all messages sent from the plc4x system to a connected plc.
  */
-public interface PlcRequest extends PlcMessage {
+public interface PlcRequest<T> extends PlcMessage<T> {
 
 }
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 ecfdf53..c5cfd93 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
@@ -24,33 +24,33 @@
 import java.util.LinkedList;
 import java.util.List;
 
-public class PlcWriteRequest implements PlcRequest {
+public class PlcWriteRequest<T> implements PlcRequest<T> {
 
-    private final List<WriteRequestItem> requestItems;
+    private final List<WriteRequestItem<T>> requestItems;
 
     public PlcWriteRequest() {
         this.requestItems = new LinkedList<>();
     }
 
-    public PlcWriteRequest(Class dataType, Address address, Object value) {
+    public PlcWriteRequest(Class<T> dataType, Address address, T value) {
         this();
-        addItem(new WriteRequestItem(dataType, address, value));
+        addItem(new WriteRequestItem<>(dataType, address, value));
     }
 
-    public PlcWriteRequest(Class dataType, Address address, Object[] values) {
+    public PlcWriteRequest(Class<T> dataType, Address address, T[] values) {
         this();
-        addItem(new WriteRequestItem(dataType, address, values));
+        addItem(new WriteRequestItem<>(dataType, address, values));
     }
 
-    public PlcWriteRequest(List<WriteRequestItem> requestItems) {
+    public PlcWriteRequest(List<WriteRequestItem<T>> requestItems) {
         this.requestItems = requestItems;
     }
 
-    public void addItem(WriteRequestItem requestItem) {
+    public void addItem(WriteRequestItem<T> requestItem) {
         requestItems.add(requestItem);
     }
 
-    public List<WriteRequestItem> getRequestItems() {
+    public List<WriteRequestItem<T>> getRequestItems() {
         return requestItems;
     }
 
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 9e8a925..58b8ce7 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,21 +22,21 @@
 
 import java.util.List;
 
-public class PlcWriteResponse implements PlcResponse {
+public class PlcWriteResponse<T> implements PlcResponse {
 
-    private final PlcWriteRequest request;
-    private final List<WriteResponseItem> responseItems;
+    private final PlcWriteRequest<T> request;
+    private final List<WriteResponseItem<T>> responseItems;
 
-    public PlcWriteResponse(PlcWriteRequest request, List<WriteResponseItem> responseItems) {
+    public PlcWriteResponse(PlcWriteRequest<T> request, List<WriteResponseItem<T>> responseItems) {
         this.request = request;
         this.responseItems = responseItems;
     }
 
-    public PlcWriteRequest getRequest() {
+    public PlcWriteRequest<T> getRequest() {
         return request;
     }
 
-    public List<WriteResponseItem> getResponseItems() {
+    public List<WriteResponseItem<T>> getResponseItems() {
         return responseItems;
     }
 
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/UncheckedPlcReadRequest.java
new file mode 100644
index 0000000..a60995f
--- /dev/null
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcReadRequest.java
@@ -0,0 +1,48 @@
+/*
+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.List;
+
+@SuppressWarnings("unchecked")
+public class UncheckedPlcReadRequest extends PlcReadRequest<Object> {
+
+    public UncheckedPlcReadRequest() {
+    }
+
+    public UncheckedPlcReadRequest(Class dataType, Address address) {
+        super(dataType, address);
+    }
+
+    public UncheckedPlcReadRequest(Class dataType, Address address, int size) {
+        super(dataType, address, size);
+    }
+
+    public UncheckedPlcReadRequest(List list) {
+        super(list);
+    }
+
+    @Override
+    public void addItem(ReadRequestItem readRequestItem) {
+        super.addItem(readRequestItem);
+    }
+}
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/UncheckedPlcWriteRequest.java
new file mode 100644
index 0000000..83ac035
--- /dev/null
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/UncheckedPlcWriteRequest.java
@@ -0,0 +1,48 @@
+/*
+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.WriteRequestItem;
+import org.apache.plc4x.java.api.model.Address;
+
+import java.util.List;
+
+@SuppressWarnings("unchecked")
+public class UncheckedPlcWriteRequest extends PlcWriteRequest<Object> {
+
+    public UncheckedPlcWriteRequest() {
+    }
+
+    public UncheckedPlcWriteRequest(Class<Object> dataType, Address address, Object value) {
+        super(dataType, address, value);
+    }
+
+    public UncheckedPlcWriteRequest(Class<Object> dataType, Address address, Object[] values) {
+        super(dataType, address, values);
+    }
+
+    public UncheckedPlcWriteRequest(List<WriteRequestItem<Object>> writeRequestItems) {
+        super(writeRequestItems);
+    }
+
+    @Override
+    public void addItem(WriteRequestItem requestItem) {
+        super.addItem(requestItem);
+    }
+}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadRequestItem.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadRequestItem.java
index b4e29fb..6086959 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadRequestItem.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadRequestItem.java
@@ -20,27 +20,27 @@
 
 import org.apache.plc4x.java.api.model.Address;
 
-public class ReadRequestItem {
+public class ReadRequestItem<T> {
 
-    private final Class datatype;
+    private final Class<T> datatype;
 
     private final Address address;
 
     private final int size;
 
-    public ReadRequestItem(Class datatype, Address address) {
+    public ReadRequestItem(Class<T> datatype, Address address) {
         this.datatype = datatype;
         this.address = address;
         this.size = 1;
     }
 
-    public ReadRequestItem(Class datatype, Address address, int size) {
+    public ReadRequestItem(Class<T> datatype, Address address, int size) {
         this.datatype = datatype;
         this.address = address;
         this.size = size;
     }
 
-    public Class getDatatype() {
+    public Class<T> getDatatype() {
         return datatype;
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadResponseItem.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadResponseItem.java
index 7bf33bb..286fb64 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadResponseItem.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/ReadResponseItem.java
@@ -22,15 +22,15 @@
 
 import java.util.List;
 
-public class ReadResponseItem {
+public class ReadResponseItem<T> {
 
-    private final ReadRequestItem requestItem;
+    private final ReadRequestItem<T> requestItem;
 
     private final ResponseCode responseCode;
 
-    private final List<Object> values;
+    private final List<T> values;
 
-    public ReadResponseItem(ReadRequestItem requestItem, ResponseCode responseCode, List<Object> values) {
+    public ReadResponseItem(ReadRequestItem<T> requestItem, ResponseCode responseCode, List<T> values) {
         this.requestItem = requestItem;
         this.responseCode = responseCode;
         this.values = values;
@@ -44,7 +44,7 @@
         return responseCode;
     }
 
-    public List<Object> getValues() {
+    public List<T> getValues() {
         return values;
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java
index c482359..44111ae 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteRequestItem.java
@@ -20,27 +20,31 @@
 
 import org.apache.plc4x.java.api.model.Address;
 
-public class WriteRequestItem {
+import java.lang.reflect.Array;
 
-    private final Class datatype;
+public class WriteRequestItem<T> {
+
+    private final Class<T> datatype;
 
     private final Address address;
 
-    private final Object[] values;
+    private final T[] values;
 
-    public WriteRequestItem(Class datatype, Address address, Object value) {
+    @SuppressWarnings("unchecked")
+    public WriteRequestItem(Class<T> datatype, Address address, T value) {
         this.datatype = datatype;
         this.address = address;
-        this.values = new Object[]{value};
+        this.values = (T[]) Array.newInstance(datatype, 1);
+        this.values[0] = value;
     }
 
-    public WriteRequestItem(Class datatype, Address address, Object[] values) {
+    public WriteRequestItem(Class<T> datatype, Address address, T[] values) {
         this.datatype = datatype;
         this.address = address;
         this.values = values;
     }
 
-    public Class getDatatype() {
+    public Class<T> getDatatype() {
         return datatype;
     }
 
@@ -48,7 +52,7 @@
         return address;
     }
 
-    public Object[] getValues() {
+    public T[] getValues() {
         return values;
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteResponseItem.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteResponseItem.java
index 5761c2b..524f68f 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteResponseItem.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/items/WriteResponseItem.java
@@ -20,18 +20,18 @@
 
 import org.apache.plc4x.java.api.types.ResponseCode;
 
-public class WriteResponseItem {
+public class WriteResponseItem<T> {
 
-    private final WriteRequestItem requestItem;
+    private final WriteRequestItem<T> requestItem;
 
     private final ResponseCode responseCode;
 
-    public WriteResponseItem(WriteRequestItem requestItem, ResponseCode responseCode) {
+    public WriteResponseItem(WriteRequestItem<T> requestItem, ResponseCode responseCode) {
         this.requestItem = requestItem;
         this.responseCode = responseCode;
     }
 
-    public WriteRequestItem getRequestItem() {
+    public WriteRequestItem<T> getRequestItem() {
         return requestItem;
     }
 
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 d234a46..c9b44c2 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
@@ -50,8 +50,6 @@
 
 public class Plc4XS7Protocol extends MessageToMessageCodec<S7Message, PlcRequestContainer> {
 
-    private static final Logger logger = LoggerFactory.getLogger(S7PlcConnection.class);
-
     private static final AtomicInteger tpduGenerator = new AtomicInteger(1);
 
     private Map<Short, PlcRequestContainer> requests;
@@ -65,7 +63,7 @@
         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)
@@ -78,7 +76,7 @@
                 VarParameterItem varParameterItem = encodeVarParameterItem(requestItem.getAddress(), transportSize, requestItem.getSize());
                 parameterItems.add(varParameterItem);
             }
-            VarParameter readVarParameter =  new VarParameter(ParameterType.READ_VAR, parameterItems);
+            VarParameter readVarParameter = new VarParameter(ParameterType.READ_VAR, parameterItems);
 
             // Assemble the request.
             S7RequestMessage s7ReadRequest = new S7RequestMessage(MessageType.JOB,
@@ -88,11 +86,11 @@
             requests.put(s7ReadRequest.getTpduReference(), msg);
 
             out.add(s7ReadRequest);
-        } else if(msg.getRequest() instanceof PlcWriteRequest) {
+        } else if (msg.getRequest() instanceof PlcWriteRequest) {
             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)
@@ -116,7 +114,7 @@
 
                 payloadItems.add(varPayloadItem);
             }
-            VarParameter writeVarParameter =  new VarParameter(ParameterType.WRITE_VAR, parameterItems);
+            VarParameter writeVarParameter = new VarParameter(ParameterType.WRITE_VAR, parameterItems);
             VarPayload writeVarPayload = new VarPayload(ParameterType.WRITE_VAR, payloadItems);
 
             // Assemble the request.
@@ -130,9 +128,10 @@
         }
     }
 
+    @SuppressWarnings("unchecked")
     @Override
     protected void decode(ChannelHandlerContext ctx, S7Message msg, List<Object> out) throws Exception {
-        if(msg instanceof S7ResponseMessage) {
+        if (msg instanceof S7ResponseMessage) {
             S7ResponseMessage responseMessage = (S7ResponseMessage) msg;
             short tpduReference = responseMessage.getTpduReference();
             if (requests.containsKey(tpduReference)) {
@@ -142,14 +141,14 @@
 
                 // 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);
                     // If the numbers of items don't match, we're in big trouble as the only
                     // way to know how to interpret the responses is by aligning them with the
                     // items from the request as this information is not returned by the PLC.
-                    if(plcReadRequest.getReadRequestItems().size() != payload.getPayloadItems().size()) {
+                    if (plcReadRequest.getReadRequestItems().size() != payload.getPayloadItems().size()) {
                         throw new PlcProtocolException(
                             "The number of requested items doesn't match the number of returned items");
                     }
@@ -158,20 +157,20 @@
                         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);
+                        if (responseCode != ResponseCode.OK) {
+                            responseItem = new ReadResponseItem<>(requestItem, responseCode, null);
                         }
                         // All Ok.
                         else {
                             byte[] data = payloadItem.getData();
                             Class<?> datatype = requestItem.getDatatype();
-                            List<Object> value = decodeData(datatype, data);
+                            List<?> value = decodeData(datatype, data);
                             responseItem = new ReadResponseItem(requestItem, responseCode, value);
                         }
                         responseItems.add(responseItem);
@@ -181,13 +180,13 @@
 
                 // 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
                     // way to know how to interpret the responses is by aligning them with the
                     // items from the request as this information is not returned by the PLC.
-                    if(plcWriteRequest.getRequestItems().size() != payload.getPayloadItems().size()) {
+                    if (plcWriteRequest.getRequestItems().size() != payload.getPayloadItems().size()) {
                         throw new PlcProtocolException(
                             "The number of requested items doesn't match the number of returned items");
                     }
@@ -286,7 +285,7 @@
     }
 
     private byte[] encodeData(Object[] values) {
-        if(values.length == 0) {
+        if (values.length == 0) {
             return null;
         }
         byte[] result = null;
@@ -294,24 +293,24 @@
         if (valueType == Boolean.class) {
             // TODO: Check if this is true and the result is not Math.ceil(values.lenght / 8)
             result = new byte[values.length];
-            for(int i = 0; i < values.length; i++) {
+            for (int i = 0; i < values.length; i++) {
                 result[i] = (byte) (((Boolean) values[i]) ? 0x01 : 0x00);
             }
         } else if (valueType == Byte[].class) {
             result = new byte[values.length];
-            for(int i = 0; i < values.length; i++) {
+            for (int i = 0; i < values.length; i++) {
                 result[i] = (byte) values[i];
             }
         } else if (valueType == Short.class) {
             result = new byte[values.length * 2];
-            for(int i = 0; i < values.length; i++) {
+            for (int i = 0; i < values.length; i++) {
                 short intValue = (short) values[i];
                 result[i * 2] = (byte) ((intValue & 0xff00) >> 8);
                 result[(i * 2) + 1] = (byte) (intValue & 0xff);
             }
         } else if (valueType == Integer.class) {
             result = new byte[values.length * 4];
-            for(int i = 0; i < values.length; i++) {
+            for (int i = 0; i < values.length; i++) {
                 int intValue = (int) values[i];
                 result[i * 4] = (byte) ((intValue & 0xff000000) >> 24);
                 result[(i * 4) + 1] = (byte) ((intValue & 0x00ff0000) >> 16);
@@ -322,7 +321,7 @@
             result = null;
         } else if (valueType == Float.class) {
             result = new byte[values.length * 4];
-            for(int i = 0; i < values.length; i++) {
+            for (int i = 0; i < values.length; i++) {
                 float floatValue = (float) values[i];
                 int intValue = Float.floatToIntBits(floatValue);
                 result[i * 4] = (byte) ((intValue & 0xff000000) >> 24);
@@ -341,7 +340,7 @@
     ////////////////////////////////////////////////////////////////////////////////
 
     private ResponseCode decodeResponseCode(DataTransportErrorCode dataTransportErrorCode) {
-        if(dataTransportErrorCode != null) {
+        if (dataTransportErrorCode != null) {
             switch (dataTransportErrorCode) {
                 case OK:
                     return ResponseCode.OK;
@@ -354,25 +353,26 @@
         return ResponseCode.INTERNAL_ERROR;
     }
 
-    private List<Object> decodeData(Class<?> datatype, byte[] s7Data) throws PlcProtocolException {
-        if(s7Data.length == 0) {
+    @SuppressWarnings("unchecked")
+    private <T> List<T> decodeData(Class<T> datatype, byte[] s7Data) throws PlcProtocolException {
+        if (s7Data.length == 0) {
             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;
+                i += 1;
             } else if (datatype == Byte.class) {
                 result.add(s7Data[i]);
-                i+=1;
+                i += 1;
             } else if (datatype == Short.class) {
-                result.add((short) (((s7Data[i] & 0xff) << 8) | (s7Data[i+1] & 0xff)));
-                i+=2;
+                result.add((short) (((s7Data[i] & 0xff) << 8) | (s7Data[i + 1] & 0xff)));
+                i += 2;
             } else if (datatype == Integer.class) {
                 result.add((((s7Data[i] & 0xff) << 24) | ((s7Data[i + 1] & 0xff) << 16) |
                     ((s7Data[i + 2] & 0xff) << 8) | (s7Data[i + 3] & 0xff)));
-                i+=4;
+                i += 4;
             } else if (datatype == Float.class) {
                 // Description of the Real number format:
                 // https://www.sps-lehrgang.de/zahlenformate-step7/#c144
@@ -380,12 +380,12 @@
                 int intValue = (((s7Data[i] & 0xff) << 24) | ((s7Data[i + 1] & 0xff) << 16) |
                     ((s7Data[i + 2] & 0xff) << 8) | (s7Data[i + 3] & 0xff));
                 result.add(Float.intBitsToFloat(intValue));
-                i+=4;
+                i += 4;
             } else {
                 throw new PlcProtocolException("Unsupported datatype " + datatype.getSimpleName());
             }
         }
-        return result;
+        return (List<T>) result;
     }
 
 }
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 9415179..864c9f3 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
@@ -22,9 +22,9 @@
 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.items.ReadResponseItem;
 import org.apache.plc4x.java.api.model.Address;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,7 +44,7 @@
     public static void main(String[] args) throws Exception {
         // Create a connection to the S7 PLC (s7://{hostname/ip}/{racknumber}/{slotnumber})
         logger.info("Connecting");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")){
+        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")) {
             logger.info("Connected");
 
             Optional<PlcReader> reader = plcConnection.getReader();
@@ -63,8 +63,8 @@
                 // Read synchronously ...
                 // NOTICE: the ".get()" immediately lets this thread pause till
                 // the response is processed and available.
-                PlcReadResponse plcReadResponse = plcReader.read(new PlcReadRequest(Byte.class, inputs)).get();
-                List<ReadResponseItem> responseItems = plcReadResponse.getResponseItems();
+                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));
 
                 //////////////////////////////////////////////////////////
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 fdc7fac..4f072e6 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
@@ -43,7 +43,7 @@
     public static void main(String[] args) throws Exception {
         // Create a connection to the S7 PLC (s7://{hostname/ip}/{racknumber}/{slotnumber})
         logger.info("Connecting");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")){
+        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")) {
             logger.info("Connected");
 
             Optional<PlcReader> reader = plcConnection.getReader();
@@ -54,18 +54,18 @@
                 for (MemoryArea memoryArea : MemoryArea.values()) {
                     System.out.println(memoryArea);
                     System.out.println("------------------------------------------");
-                    for(int i = 0; i < 8959; i++) {
+                    for (int i = 0; i < 8959; i++) {
                         try {
                             Address address;
-                            if(memoryArea == MemoryArea.DATA_BLOCKS) {
+                            if (memoryArea == MemoryArea.DATA_BLOCKS) {
                                 address = plcConnection.parseAddress("DATA_BLOCKS/1/" + i);
                             } else {
                                 address = plcConnection.parseAddress(memoryArea.name() + "/" + i);
                             }
-                            PlcReadResponse plcReadResponse = plcReader.read(
-                                new PlcReadRequest(Byte.class, address)).get();
-                            Byte data = (Byte) plcReadResponse.getResponseItems().get(0).getValues().get(0);
-                            if(data != null && data != 0) {
+                            PlcReadResponse<Byte> plcReadResponse = plcReader.read(
+                                new PlcReadRequest<>(Byte.class, address)).get();
+                            Byte data = plcReadResponse.getResponseItems().get(0).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 58cc851..96e155e 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
@@ -44,7 +44,7 @@
     public static void main(String[] args) throws Exception {
         // Create a connection to the S7 PLC (s7://{hostname/ip}/{racknumber}/{slotnumber})
         logger.info("Connecting");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")){
+        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")) {
             logger.info("Connected");
 
             Optional<PlcReader> reader = plcConnection.getReader();
@@ -54,13 +54,13 @@
 
                 Scanner scanner = new Scanner(System.in);
                 String line;
-                while(!"exit".equalsIgnoreCase(line = scanner.next())) {
+                while (!"exit".equalsIgnoreCase(line = scanner.next())) {
                     try {
                         Address address = plcConnection.parseAddress(line);
-                        PlcReadResponse plcReadResponse = plcReader.read(new PlcReadRequest(Byte.class, address)).get();
-                        List<Object> data = plcReadResponse.getResponseItems().get(0).getValues();
+                        PlcReadResponse<Byte> plcReadResponse = plcReader.read(new PlcReadRequest<>(Byte.class, address)).get();
+                        List<Byte> data = plcReadResponse.getResponseItems().get(0).getValues();
                         System.out.println("Response: " + data.get(0));
-                    } catch(Exception e) {
+                    } 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 3edc52a..159e588 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,7 +21,8 @@
 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.*;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.model.Address;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,7 +42,7 @@
     public static void main(String[] args) throws Exception {
         // Create a connection to the S7 PLC (s7://{hostname/ip}/{racknumber}/{slotnumber})
         logger.info("Connecting");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")){
+        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")) {
             logger.info("Connected");
 
             Optional<PlcWriter> writer = plcConnection.getWriter();
@@ -53,8 +54,8 @@
                 // Write synchronously ...
                 // NOTICE: the ".get()" immediately lets this thread pause till
                 // the response is processed and available.
-                PlcWriteResponse plcWriteResponse = plcWriter.write(
-                    new PlcWriteRequest(Float.class, inputs, 2.0f)).get();
+                PlcWriteResponse<Float> plcWriteResponse = plcWriter.write(
+                    new PlcWriteRequest<>(Float.class, inputs, 2.0f)).get();
                 System.out.println("Written: " + plcWriteResponse.getResponseItems().get(0).getResponseCode().name());
             }
         }
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 adafac3..4556f10 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
@@ -67,7 +67,7 @@
         // Read Request Tests
         {
             LinkedList<Object> out = new LinkedList<>();
-            SUT.encode(null, createMockedContainer(new PlcReadRequest(type, address)), out);
+            SUT.encode(null, createMockedContainer(new PlcReadRequest<>(type, address)), out);
             // TODO: finish the asserts
             assertThat(out).hasSize(1);
         }
