You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2018/10/22 13:07:06 UTC

[incubator-plc4x] branch master updated: - Write tests for the field items - Fixed a lot of bugs in the field items - Introduced the ability to use Groovy for test code and use the Spock framework for testing. - Changed the way the DefaultBooleanFieldItem.getByte method works.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 563f16f  - Write tests for the field items - Fixed a lot of bugs in the field items - Introduced the ability to use Groovy for test code and use the Spock framework for testing. - Changed the way the DefaultBooleanFieldItem.getByte method works.
563f16f is described below

commit 563f16f82c14b5a4378cd43eb62aebf8953db953
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Oct 22 14:06:57 2018 +0100

    - Write tests for the field items
    - Fixed a lot of bugs in the field items
    - Introduced the ability to use Groovy for test code and use the Spock framework for testing.
    - Changed the way the DefaultBooleanFieldItem.getByte method works.
---
 .../apache/plc4x/edgent/mock/MockConnection.java   |  14 +-
 .../apache/plc4x/edgent/mock/MockFieldHandler.java |  30 +--
 .../apache/plc4x/edgent/mock/MockFieldItem.java    |   4 +-
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   |  42 ++--
 .../plc4x/java/ads/protocol/Plc4x2AdsProtocol.java |   8 +-
 .../ads/protocol/util/LittleEndianDecoder.java     |   2 +-
 .../ads/protocol/util/LittleEndianDecoderTest.java |   6 +-
 plc4j/protocols/driver-bases/base/pom.xml          |  15 +-
 .../base/connection/DefaultPlcFieldHandler.java    |  30 +--
 .../java/base/connection/PlcFieldHandler.java      |  30 +--
 .../java/base/messages/DefaultPlcReadResponse.java | 102 +++++-----
 .../java/base/messages/DefaultPlcWriteRequest.java |  26 +--
 .../base/messages/InternalPlcReadResponse.java     |   4 +-
 .../base/messages/InternalPlcWriteRequest.java     |   8 +-
 .../{FieldItem.java => BaseDefaultFieldItem.java}  |  22 +--
 .../messages/items/DefaultBigDecimalFieldItem.java |  22 +--
 .../messages/items/DefaultBigIntegerFieldItem.java |  28 +--
 .../messages/items/DefaultBooleanFieldItem.java    | 128 +++++++++++-
 .../messages/items/DefaultByteArrayFieldItem.java  |   2 +-
 .../base/messages/items/DefaultByteFieldItem.java  |   8 +-
 .../messages/items/DefaultDoubleFieldItem.java     |   6 +-
 .../base/messages/items/DefaultFloatFieldItem.java |   7 +-
 .../messages/items/DefaultIntegerFieldItem.java    |   8 +-
 .../messages/items/DefaultLocalDateFieldItem.java  |   6 +-
 .../items/DefaultLocalDateTimeFieldItem.java       |   4 +-
 .../messages/items/DefaultLocalTimeFieldItem.java  |   4 +-
 .../base/messages/items/DefaultLongFieldItem.java  |   8 +-
 .../base/messages/items/DefaultShortFieldItem.java |   8 +-
 .../messages/items/DefaultStringFieldItem.java     |   4 +-
 .../SingleItemToSingleRequestProtocol.java         |  12 +-
 .../base/messages/items/DefaultItemsSpec.groovy    | 215 +++++++++++++++++++++
 .../SingleItemToSingleRequestProtocolTest.java     |  20 +-
 ...spockframework.report.IReportCreator.properties |  66 +++++++
 .../ethernetip/netty/Plc4XEtherNetIpProtocol.java  |   8 +-
 .../ethernetip/netty/util/EnipPlcFieldHandler.java |  26 +--
 .../java/modbus/netty/Plc4XModbusProtocol.java     |  10 +-
 .../java/modbus/util/ModbusPlcFieldHandler.java    |   6 +-
 .../items/DefaultModbusByteArrayFieldItemTest.java |  23 +--
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       |  10 +-
 .../java/s7/netty/util/S7PlcFieldHandler.java      |  38 ++--
 .../java/s7/netty/util/S7PlcFieldHandlerTest.java  |  12 +-
 .../org/apache/plc4x/java/test/TestConnection.java |  12 +-
 .../org/apache/plc4x/java/test/TestDevice.java     |  10 +-
 .../apache/plc4x/java/test/TestFieldHandler.java   |  28 +--
 .../org/apache/plc4x/java/test/TestFieldItem.java  |   4 +-
 .../org/apache/plc4x/java/test/TestDeviceTest.java |  12 +-
 pom.xml                                            |  54 +++++-
 47 files changed, 802 insertions(+), 350 deletions(-)

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 383d3c6..6ff75e5 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
@@ -21,8 +21,6 @@ package org.apache.plc4x.edgent.mock;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.base.messages.PlcReader;
-import org.apache.plc4x.java.base.messages.PlcWriter;
 import org.apache.plc4x.java.api.exceptions.PlcIoException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -31,7 +29,7 @@ import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -43,7 +41,7 @@ public class MockConnection extends org.apache.plc4x.java.base.connection.MockCo
 
     private final String url;
     private final PlcAuthentication authentication;
-    private final Map<PlcField, FieldItem<?>> dataValueMap = new HashMap<>();
+    private final Map<PlcField, BaseDefaultFieldItem<?>> dataValueMap = new HashMap<>();
     private long curReadCnt;
     private int readExceptionTriggerCount;
     private String readExceptionMsg;
@@ -81,7 +79,7 @@ public class MockConnection extends org.apache.plc4x.java.base.connection.MockCo
             cf.completeExceptionally(new PlcIoException(readExceptionMsg));
             return cf;
         }
-        Map<String, Pair<PlcResponseCode, FieldItem>> fields = new LinkedHashMap<>();
+        Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> fields = new LinkedHashMap<>();
         for (String fieldName : readRequest.getFieldNames()) {
             PlcField field = readRequest.getField(fieldName);
             fields.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, getFieldItem(field)));
@@ -117,15 +115,15 @@ public class MockConnection extends org.apache.plc4x.java.base.connection.MockCo
         return CompletableFuture.completedFuture(response);
     }
 
-    public void setFieldItem(PlcField field, FieldItem<?> fieldItem) {
+    public void setFieldItem(PlcField field, BaseDefaultFieldItem<?> fieldItem) {
         dataValueMap.put(field, fieldItem);
     }
 
-    public FieldItem<?> getFieldItem(PlcField field) {
+    public BaseDefaultFieldItem<?> getFieldItem(PlcField field) {
         return dataValueMap.get(field);
     }
 
-    public Map<PlcField, FieldItem<?>> getAllFieldItems() {
+    public Map<PlcField, BaseDefaultFieldItem<?>> getAllFieldItems() {
         return dataValueMap;
     }
 
diff --git a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java
index 437cafe..788b8d7 100644
--- a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java
+++ b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldHandler.java
@@ -22,7 +22,7 @@ package org.apache.plc4x.edgent.mock;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 public class MockFieldHandler implements PlcFieldHandler {
 
@@ -32,72 +32,72 @@ public class MockFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeByte(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeShort(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeLong(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeFloat(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeBigDecimal(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigDecimal(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeDouble(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeString(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeDate(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeDateTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
     @Override
-    public FieldItem encodeByteArray(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByteArray(PlcField field, Object[] values) {
         return new MockFieldItem(values);
     }
 
diff --git a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldItem.java b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldItem.java
index debe835..2a1f83f 100644
--- a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldItem.java
+++ b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockFieldItem.java
@@ -19,9 +19,9 @@
 
 package org.apache.plc4x.edgent.mock;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
-public class MockFieldItem extends FieldItem<Object> {
+public class MockFieldItem extends BaseDefaultFieldItem<Object> {
 
     public MockFieldItem(Object... values) {
         super(values);
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
index 9d1ec6a..cbd6ca8 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
@@ -52,7 +52,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         // All of these types are declared as Bit or Bit-String types.
         switch (adsField.getAdsDataType()) {
@@ -104,7 +104,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeByte(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -155,7 +155,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeShort(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -206,7 +206,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -257,7 +257,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -308,7 +308,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeLong(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -359,7 +359,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeFloat(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -410,7 +410,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDouble(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -461,7 +461,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeString(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -512,7 +512,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -563,7 +563,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDate(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -614,7 +614,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDateTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BIT:
@@ -664,7 +664,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
         }
     }
 
-    private FieldItem internalEncodeBoolean(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeBoolean(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case BOOL:
@@ -714,11 +714,11 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
         return new DefaultBooleanFieldItem(booleanValues.toArray(new Boolean[0]));
     }
 
-    private FieldItem internalEncodeInteger(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeInteger(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         BigDecimal minValue = BigDecimal.valueOf(adsField.getAdsDataType().getLowerBound());
         BigDecimal maxValue = BigDecimal.valueOf(adsField.getAdsDataType().getUpperBound());
-        Class<? extends FieldItem> fieldType;
+        Class<? extends BaseDefaultFieldItem> fieldType;
         switch (adsField.getAdsDataType()) {
             case BYTE:
                 fieldType = DefaultByteFieldItem.class;
@@ -816,11 +816,11 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
         }
     }
 
-    private FieldItem internalEncodeFloatingPoint(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeFloatingPoint(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         BigDecimal minValue = BigDecimal.valueOf(adsField.getAdsDataType().getLowerBound());
         BigDecimal maxValue = BigDecimal.valueOf(adsField.getAdsDataType().getUpperBound());
-        Class<? extends FieldItem> fieldType;
+        Class<? extends BaseDefaultFieldItem> fieldType;
         switch (adsField.getAdsDataType()) {
             case REAL:
                 fieldType = DefaultFloatFieldItem.class;
@@ -883,7 +883,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
         }
     }
 
-    private FieldItem internalEncodeString(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeString(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         double maxLength = adsField.getAdsDataType().getUpperBound();
         boolean encoding16Bit;
@@ -962,7 +962,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
         return new DefaultStringFieldItem(stringValues.toArray(new String[0]));
     }
 
-    private FieldItem internalTimeTemporal(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalTimeTemporal(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case TIME:
@@ -981,7 +981,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
         return new DefaultLocalTimeFieldItem(localTimeValues.toArray(new LocalTime[0]));
     }
 
-    private FieldItem internalDateTemporal(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalDateTemporal(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case TIME:
@@ -1000,7 +1000,7 @@ public class AdsPlcFieldHandler extends DefaultPlcFieldHandler {
         return new DefaultLocalDateFieldItem(localDateValues.toArray(new LocalDate[0]));
     }
 
-    private FieldItem internalDateTimeTemporal(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalDateTimeTemporal(PlcField field, Object[] values) {
         AdsField adsField = (AdsField) field;
         switch (adsField.getAdsDataType()) {
             case TIME:
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocol.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocol.java
index c67f455..ba64cc4 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocol.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/Plc4x2AdsProtocol.java
@@ -42,7 +42,7 @@ import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -152,7 +152,7 @@ public class Plc4x2AdsProtocol extends MessageToMessageCodec<AmsPacket, PlcReque
         IndexGroup indexGroup = IndexGroup.of(directAdsField.getIndexGroup());
         IndexOffset indexOffset = IndexOffset.of(directAdsField.getIndexOffset());
 
-        FieldItem fieldItem = writeRequest.getFieldItems().get(0);
+        BaseDefaultFieldItem fieldItem = writeRequest.getFieldItems().get(0);
         Object[] values = fieldItem.getValues();
 
         byte[] bytes = encodeData(directAdsField.getAdsDataType(), values);
@@ -297,10 +297,10 @@ public class Plc4x2AdsProtocol extends MessageToMessageCodec<AmsPacket, PlcReque
 
         PlcResponseCode responseCode = decodeResponseCode(responseMessage.getResult());
         byte[] bytes = responseMessage.getData().getBytes();
-        FieldItem<?> fieldItem = decodeData(field.getAdsDataType(), bytes);
+        BaseDefaultFieldItem<?> fieldItem = decodeData(field.getAdsDataType(), bytes);
 
         // TODO: does every item has the same ads response or is this whole aggregation broken?
-        Map<String, Pair<PlcResponseCode, FieldItem>> responseItems = plcReadRequest.getFieldNames()
+        Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> responseItems = plcReadRequest.getFieldNames()
             .stream()
             .collect(Collectors.toMap(
                 fieldName -> fieldName,
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
index 235760e..950e4b4 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
@@ -42,7 +42,7 @@ public class LittleEndianDecoder {
     }
 
     @SuppressWarnings("unchecked")
-    public static FieldItem decodeData(AdsDataType adsDataType, byte[] adsData) {
+    public static BaseDefaultFieldItem decodeData(AdsDataType adsDataType, byte[] adsData) {
         ByteBuf wrappedBuffer = Unpooled.wrappedBuffer(adsData);
         switch (adsDataType) {
             case BIT: {
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoderTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoderTest.java
index 0d2e773..1edaf37 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoderTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoderTest.java
@@ -22,7 +22,7 @@ import org.apache.commons.lang3.reflect.MethodUtils;
 import org.apache.plc4x.java.ads.model.AdsDataType;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -48,9 +48,9 @@ public class LittleEndianDecoderTest {
     @ParameterizedTest
     @MethodSource("createAdsDataTypePears")
     public void decodeData(AdsDataType adsDataType, Collection expectedTypes, Class<?> clazz, byte[] adsData) throws Exception {
-        FieldItem<?> fieldItem = LittleEndianDecoder.decodeData(adsDataType, adsData);
+        BaseDefaultFieldItem<?> fieldItem = LittleEndianDecoder.decodeData(adsDataType, adsData);
 
-        Method getterMethod = MethodUtils.getAccessibleMethod(FieldItem.class, "get" + clazz.getSimpleName(), int.class);
+        Method getterMethod = MethodUtils.getAccessibleMethod(BaseDefaultFieldItem.class, "get" + clazz.getSimpleName(), int.class);
         LOG.info("Using {} to map", getterMethod);
 
         List<? super Object> actualTypes = new LinkedList<>();
diff --git a/plc4j/protocols/driver-bases/base/pom.xml b/plc4j/protocols/driver-bases/base/pom.xml
index 66753a7..58b236d 100644
--- a/plc4j/protocols/driver-bases/base/pom.xml
+++ b/plc4j/protocols/driver-bases/base/pom.xml
@@ -65,10 +65,23 @@
       <artifactId>logback-classic</artifactId>
       <scope>test</scope>
     </dependency>
+
     <dependency>
       <groupId>org.assertj</groupId>
       <artifactId>assertj-core</artifactId>
-      <version>3.9.1</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.spockframework</groupId>
+      <artifactId>spock-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.athaydes</groupId>
+      <artifactId>spock-reports</artifactId>
+      <version>1.6.1</version>
+      <scope>test</scope>
     </dependency>
   </dependencies>
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java
index c61d361..e74be1a 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/DefaultPlcFieldHandler.java
@@ -21,77 +21,77 @@ package org.apache.plc4x.java.base.connection;
 
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 public abstract class DefaultPlcFieldHandler implements PlcFieldHandler {
 
     @Override
-    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeByte(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeShort(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeLong(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeFloat(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeBigDecimal(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigDecimal(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeDouble(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeString(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeDate(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeDateTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 
     @Override
-    public FieldItem encodeByteArray(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByteArray(PlcField field, Object[] values) {
         throw new PlcRuntimeException("Invalid encoder for type " + field);
     }
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
index 91a7605..cddf0c7 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/PlcFieldHandler.java
@@ -20,38 +20,38 @@ package org.apache.plc4x.java.base.connection;
 
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 public interface PlcFieldHandler {
 
     PlcField createField(String fieldQuery) throws PlcInvalidFieldException;
 
-    FieldItem encodeBoolean(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values);
 
-    FieldItem encodeByte(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeByte(PlcField field, Object[] values);
 
-    FieldItem encodeShort(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeShort(PlcField field, Object[] values);
 
-    FieldItem encodeInteger(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values);
 
-    FieldItem encodeBigInteger(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values);
 
-    FieldItem encodeLong(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeLong(PlcField field, Object[] values);
 
-    FieldItem encodeFloat(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values);
 
-    FieldItem encodeBigDecimal(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeBigDecimal(PlcField field, Object[] values);
 
-    FieldItem encodeDouble(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values);
 
-    FieldItem encodeString(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeString(PlcField field, Object[] values);
 
-    FieldItem encodeTime(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeTime(PlcField field, Object[] values);
 
-    FieldItem encodeDate(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeDate(PlcField field, Object[] values);
 
-    FieldItem encodeDateTime(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values);
 
-    FieldItem encodeByteArray(PlcField field, Object[] values);
+    BaseDefaultFieldItem encodeByteArray(PlcField field, Object[] values);
 
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
index 73cad97..30f80de 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
@@ -21,7 +21,7 @@ package org.apache.plc4x.java.base.messages;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -36,9 +36,9 @@ import java.util.Map;
 public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     private final InternalPlcReadRequest request;
-    private final Map<String, Pair<PlcResponseCode, FieldItem>> values;
+    private final Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> values;
 
-    public DefaultPlcReadResponse(InternalPlcReadRequest request, Map<String, Pair<PlcResponseCode, FieldItem>> fields) {
+    public DefaultPlcReadResponse(InternalPlcReadRequest request, Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> fields) {
         this.request = request;
         this.values = fields;
     }
@@ -50,7 +50,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public int getNumberOfValues(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getNumberOfValues();
         }
@@ -76,7 +76,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
     }
 
     @Override
-    public Map<String, Pair<PlcResponseCode, FieldItem>> getValues() {
+    public Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> getValues() {
         return values;
     }
 
@@ -87,7 +87,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Object getObject(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getObject(index);
         }
@@ -107,7 +107,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidBoolean(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidBoolean(index);
         }
@@ -121,7 +121,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Boolean getBoolean(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getBoolean(index);
         }
@@ -130,7 +130,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Boolean> getAllBooleans(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Boolean> values = new ArrayList<>(num);
@@ -149,7 +149,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidByte(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidByte(index);
         }
@@ -163,7 +163,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Byte getByte(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getByte(index);
         }
@@ -172,7 +172,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Byte> getAllBytes(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Byte> values = new ArrayList<>(num);
@@ -191,7 +191,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidShort(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidShort(index);
         }
@@ -205,7 +205,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Short getShort(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getShort(index);
         }
@@ -214,7 +214,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Short> getAllShorts(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Short> values = new ArrayList<>(num);
@@ -233,7 +233,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidInteger(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidInteger(index);
         }
@@ -247,7 +247,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Integer getInteger(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getInteger(index);
         }
@@ -256,7 +256,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Integer> getAllIntegers(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Integer> values = new ArrayList<>(num);
@@ -275,7 +275,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidBigInteger(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidInteger(index);
         }
@@ -289,7 +289,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public BigInteger getBigInteger(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getBigInteger(index);
         }
@@ -298,7 +298,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<BigInteger> getAllBigIntegers(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<BigInteger> values = new ArrayList<>(num);
@@ -317,7 +317,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidLong(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidLong(index);
         }
@@ -331,7 +331,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Long getLong(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getLong(index);
         }
@@ -340,7 +340,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Long> getAllLongs(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Long> values = new ArrayList<>(num);
@@ -359,7 +359,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidFloat(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidFloat(index);
         }
@@ -373,7 +373,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Float getFloat(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getFloat(index);
         }
@@ -382,7 +382,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Float> getAllFloats(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Float> values = new ArrayList<>(num);
@@ -401,7 +401,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidDouble(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidDouble(index);
         }
@@ -415,7 +415,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Double getDouble(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getDouble(index);
         }
@@ -424,7 +424,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Double> getAllDoubles(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Double> values = new ArrayList<>(num);
@@ -443,7 +443,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidBigDecimal(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidBigDecimal(index);
         }
@@ -457,7 +457,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public BigDecimal getBigDecimal(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getBigDecimal(index);
         }
@@ -466,7 +466,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<BigDecimal> getAllBigDecimals(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<BigDecimal> values = new ArrayList<>(num);
@@ -485,7 +485,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidString(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidString(index);
         }
@@ -499,7 +499,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public String getString(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getString(index);
         }
@@ -508,7 +508,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<String> getAllStrings(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<String> values = new ArrayList<>(num);
@@ -527,7 +527,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidTime(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidTime(index);
         }
@@ -541,7 +541,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public LocalTime getTime(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getTime(index);
         }
@@ -550,7 +550,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<LocalTime> getAllTimes(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<LocalTime> values = new ArrayList<>(num);
@@ -569,7 +569,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidDate(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidDate(index);
         }
@@ -583,7 +583,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public LocalDate getDate(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getDate(index);
         }
@@ -592,7 +592,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<LocalDate> getAllDates(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<LocalDate> values = new ArrayList<>(num);
@@ -611,7 +611,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidDateTime(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidDateTime(index);
         }
@@ -625,7 +625,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public LocalDateTime getDateTime(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getDateTime(index);
         }
@@ -634,7 +634,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<LocalDateTime> getAllDateTimes(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<LocalDateTime> values = new ArrayList<>(num);
@@ -648,7 +648,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidByteArray(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidByteArray(0);
         }
@@ -657,7 +657,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public boolean isValidByteArray(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.isValidDateTime(index);
         }
@@ -666,7 +666,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Byte[] getByteArray(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getByteArray(0);
         }
@@ -675,7 +675,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Byte[] getByteArray(String name, int index) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             return fieldInternal.getByteArray(index);
         }
@@ -684,7 +684,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
 
     @Override
     public Collection<Byte[]> getAllByteArrays(String name) {
-        FieldItem fieldInternal = getFieldInternal(name);
+        BaseDefaultFieldItem fieldInternal = getFieldInternal(name);
         if (fieldInternal != null) {
             int num = fieldInternal.getNumberOfValues();
             List<Byte[]> values = new ArrayList<>(num);
@@ -696,7 +696,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
         return null;
     }
 
-    private FieldItem getFieldInternal(String name) {
+    private BaseDefaultFieldItem getFieldInternal(String name) {
         // If this field doesn't exist, ignore it.
         if (values.get(name) == null) {
             return null;
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
index 6330300..9ede855 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcWriteRequest.java
@@ -26,7 +26,7 @@ import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -41,9 +41,9 @@ import java.util.stream.Collectors;
 public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, InternalPlcFieldRequest {
 
     private final PlcWriter writer;
-    private final LinkedHashMap<String, Pair<PlcField, FieldItem>> fields;
+    private final LinkedHashMap<String, Pair<PlcField, BaseDefaultFieldItem>> fields;
 
-    protected DefaultPlcWriteRequest(PlcWriter writer, LinkedHashMap<String, Pair<PlcField, FieldItem>> fields) {
+    protected DefaultPlcWriteRequest(PlcWriter writer, LinkedHashMap<String, Pair<PlcField, BaseDefaultFieldItem>> fields) {
         this.writer = writer;
         this.fields = fields;
     }
@@ -74,12 +74,12 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
         return fields.values().stream().map(Pair::getKey).collect(Collectors.toCollection(LinkedList::new));
     }
 
-    public FieldItem getFieldItem(String name) {
+    public BaseDefaultFieldItem getFieldItem(String name) {
         return fields.get(name).getValue();
     }
 
     @Override
-    public LinkedList<FieldItem> getFieldItems() {
+    public LinkedList<BaseDefaultFieldItem> getFieldItems() {
         return fields.values().stream().map(Pair::getValue).collect(Collectors.toCollection(LinkedList::new));
     }
 
@@ -96,7 +96,7 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
     }
 
     @Override
-    public LinkedList<Triple<String, PlcField, FieldItem>> getNamedFieldTriples() {
+    public LinkedList<Triple<String, PlcField, BaseDefaultFieldItem>> getNamedFieldTriples() {
         return fields.entrySet()
             .stream()
             .map(stringPairEntry ->
@@ -118,7 +118,7 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
         private final PlcWriter writer;
         private final PlcFieldHandler fieldHandler;
         private final Map<String, BuilderItem<Object>> fields;
-        private final Map<Class<?>, BiFunction<PlcField, Object[], FieldItem>> handlerMap;
+        private final Map<Class<?>, BiFunction<PlcField, Object[], BaseDefaultFieldItem>> handlerMap;
 
         public Builder(PlcWriter writer, PlcFieldHandler fieldHandler) {
             this.writer = writer;
@@ -229,7 +229,7 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
                     throw new IllegalArgumentException("Invalid class found " + value.getClass() + ". should all be " + checkedClazz);
                 }
             }
-            BiFunction<PlcField, Object[], FieldItem> plcFieldFieldItemBiFunction = handlerMap.get(checkedClazz);
+            BiFunction<PlcField, Object[], BaseDefaultFieldItem> plcFieldFieldItemBiFunction = handlerMap.get(checkedClazz);
             if (plcFieldFieldItemBiFunction == null) {
                 throw new IllegalArgumentException("no field handler for " + checkedClazz + " found");
             }
@@ -238,19 +238,19 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
 
         @Override
         public PlcWriteRequest build() {
-            LinkedHashMap<String, Pair<PlcField, FieldItem>> parsedFields = new LinkedHashMap<>();
+            LinkedHashMap<String, Pair<PlcField, BaseDefaultFieldItem>> parsedFields = new LinkedHashMap<>();
             fields.forEach((name, builderItem) -> {
                 // Compile the query string.
                 PlcField parsedField = fieldHandler.createField(builderItem.fieldQuery);
                 // Encode the payload.
                 // TODO: Depending on the field type, handle the FieldItem creation differently.
-                FieldItem fieldItem = builderItem.encoder.apply(parsedField, builderItem.values);
+                BaseDefaultFieldItem fieldItem = builderItem.encoder.apply(parsedField, builderItem.values);
                 parsedFields.put(name, new ImmutablePair<>(parsedField, fieldItem));
             });
             return new DefaultPlcWriteRequest(writer, parsedFields);
         }
 
-        private Builder addItem(String name, String fieldQuery, Object[] values, BiFunction<PlcField, Object[], FieldItem> encoder) {
+        private Builder addItem(String name, String fieldQuery, Object[] values, BiFunction<PlcField, Object[], BaseDefaultFieldItem> encoder) {
             if (fields.containsKey(name)) {
                 throw new PlcRuntimeException("Duplicate field definition '" + name + "'");
             }
@@ -261,9 +261,9 @@ public class DefaultPlcWriteRequest implements InternalPlcWriteRequest, Internal
         private static class BuilderItem<T> {
             private final String fieldQuery;
             private final T[] values;
-            private final BiFunction<PlcField, T[], FieldItem> encoder;
+            private final BiFunction<PlcField, T[], BaseDefaultFieldItem> encoder;
 
-            private BuilderItem(String fieldQuery, T[] values, BiFunction<PlcField, T[], FieldItem> encoder) {
+            private BuilderItem(String fieldQuery, T[] values, BiFunction<PlcField, T[], BaseDefaultFieldItem> encoder) {
                 this.fieldQuery = fieldQuery;
                 this.values = values;
                 this.encoder = encoder;
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcReadResponse.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcReadResponse.java
index 53cf0b5..50d0e4d 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcReadResponse.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcReadResponse.java
@@ -21,11 +21,11 @@ package org.apache.plc4x.java.base.messages;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 import java.util.Map;
 
 public interface InternalPlcReadResponse extends PlcReadResponse, InternalPlcResponse {
 
-    Map<String, Pair<PlcResponseCode, FieldItem>> getValues();
+    Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> getValues();
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcWriteRequest.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcWriteRequest.java
index f10cd89..af717d7 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcWriteRequest.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/InternalPlcWriteRequest.java
@@ -21,15 +21,15 @@ package org.apache.plc4x.java.base.messages;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 import java.util.LinkedList;
 
 public interface InternalPlcWriteRequest extends PlcWriteRequest, InternalPlcRequest {
 
-    FieldItem getFieldItem(String name);
+    BaseDefaultFieldItem getFieldItem(String name);
 
-    LinkedList<FieldItem> getFieldItems();
+    LinkedList<BaseDefaultFieldItem> getFieldItems();
 
-    LinkedList<Triple<String, PlcField, FieldItem>> getNamedFieldTriples();
+    LinkedList<Triple<String, PlcField, BaseDefaultFieldItem>> getNamedFieldTriples();
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BaseDefaultFieldItem.java
similarity index 94%
rename from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
rename to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BaseDefaultFieldItem.java
index 14deb18..e41b2e5 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BaseDefaultFieldItem.java
@@ -27,11 +27,11 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.Arrays;
 
-public abstract class FieldItem<T> {
+public abstract class BaseDefaultFieldItem<T> {
 
     private T[] values;
 
-    protected FieldItem(T[] values) {
+    protected BaseDefaultFieldItem(T[] values) {
         this.values = values;
     }
 
@@ -73,20 +73,20 @@ public abstract class FieldItem<T> {
         throw new PlcIncompatibleDatatypeException(Integer.class, index);
     }
 
-    public boolean isValidBigInteger(int index) {
+    public boolean isValidLong(int index) {
         return false;
     }
 
-    public BigInteger getBigInteger(int index) {
-        throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
+    public Long getLong(int index) {
+        throw new PlcIncompatibleDatatypeException(Long.class, index);
     }
 
-    public boolean isValidLong(int index) {
+    public boolean isValidBigInteger(int index) {
         return false;
     }
 
-    public Long getLong(int index) {
-        throw new PlcIncompatibleDatatypeException(Long.class, index);
+    public BigInteger getBigInteger(int index) {
+        throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
     }
 
     public boolean isValidFloat(int index) {
@@ -158,7 +158,7 @@ public abstract class FieldItem<T> {
     }
 
     protected T getValue(int index) {
-        if (index < 0 || (index >= values.length)) {
+        if ((values == null) || (index < 0 || (index >= values.length))) {
             return null;
         }
         return values[index];
@@ -169,10 +169,10 @@ public abstract class FieldItem<T> {
         if (this == o) {
             return true;
         }
-        if (!(o instanceof FieldItem)) {
+        if (!(o instanceof BaseDefaultFieldItem)) {
             return false;
         }
-        FieldItem<?> fieldItem = (FieldItem<?>) o;
+        BaseDefaultFieldItem<?> fieldItem = (BaseDefaultFieldItem<?>) o;
         return Arrays.equals(values, fieldItem.values);
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
index 12f9a2c..c78bd05 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
+public class DefaultBigDecimalFieldItem extends BaseDefaultFieldItem<BigDecimal> {
 
     public DefaultBigDecimalFieldItem(BigDecimal... values) {
         super(values);
@@ -31,12 +31,12 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Object getObject(int index) {
-        return getBigDecimal(index);
+        return getValue(index);
     }
 
     @Override
     public boolean isValidBoolean(int index) {
-        return (getValue(index) != null);
+        return getValue(index) != null;
     }
 
     @Override
@@ -52,7 +52,7 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
         BigDecimal value = getValue(index);
         BigDecimal min = BigDecimal.valueOf(Byte.MIN_VALUE);
         BigDecimal max = BigDecimal.valueOf(Byte.MAX_VALUE);
-        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
+        return (value != null) && (value.compareTo(min) >= 0) && (value.compareTo(max) <= 0);
     }
 
     @Override
@@ -68,7 +68,7 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
         BigDecimal value = getValue(index);
         BigDecimal min = BigDecimal.valueOf(Short.MIN_VALUE);
         BigDecimal max = BigDecimal.valueOf(Short.MAX_VALUE);
-        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
+        return (value != null) && (value.compareTo(min) >= 0) && (value.compareTo(max) <= 0);
     }
 
     @Override
@@ -84,7 +84,7 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
         BigDecimal value = getValue(index);
         BigDecimal min = BigDecimal.valueOf(Integer.MIN_VALUE);
         BigDecimal max = BigDecimal.valueOf(Integer.MAX_VALUE);
-        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
+        return (value != null) && (value.compareTo(min) >= 0) && (value.compareTo(max) <= 0);
     }
 
     @Override
@@ -100,7 +100,7 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
         BigDecimal value = getValue(index);
         BigDecimal min = BigDecimal.valueOf(Long.MIN_VALUE);
         BigDecimal max = BigDecimal.valueOf(Long.MAX_VALUE);
-        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
+        return (value != null) && (value.compareTo(min) >= 0) && (value.compareTo(max) <= 0);
     }
 
     @Override
@@ -126,9 +126,9 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
     @Override
     public boolean isValidFloat(int index) {
         BigDecimal value = getValue(index);
-        BigDecimal min = BigDecimal.valueOf(Float.MIN_VALUE);
+        BigDecimal min = BigDecimal.valueOf(-Float.MAX_VALUE);
         BigDecimal max = BigDecimal.valueOf(Float.MAX_VALUE);
-        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
+        return (value != null) && (value.compareTo(min) >= 0) && (value.compareTo(max) <= 0);
     }
 
     @Override
@@ -142,9 +142,9 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
     @Override
     public boolean isValidDouble(int index) {
         BigDecimal value = getValue(index);
-        BigDecimal min = BigDecimal.valueOf(Double.MIN_VALUE);
+        BigDecimal min = BigDecimal.valueOf(-Double.MAX_VALUE);
         BigDecimal max = BigDecimal.valueOf(Double.MAX_VALUE);
-        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
+        return (value != null) && (value.compareTo(min) >= 0) && (value.compareTo(max) <= 0);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
index 103dd97..80db40e 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
+public class DefaultBigIntegerFieldItem extends BaseDefaultFieldItem<BigInteger> {
 
     public DefaultBigIntegerFieldItem(BigInteger... values) {
         super(values);
@@ -31,7 +31,7 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Object getObject(int index) {
-        return getBigInteger(index);
+        return getValue(index);
     }
 
     @Override
@@ -50,8 +50,8 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
     @Override
     public boolean isValidByte(int index) {
         BigInteger value = getValue(index);
-        return (value != null) && (value.compareTo(BigInteger.valueOf(Byte.MAX_VALUE)) < 0) &&
-            (value.compareTo(BigInteger.valueOf(Byte.MIN_VALUE)) > 0);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Byte.MAX_VALUE)) <= 0) &&
+            (value.compareTo(BigInteger.valueOf(Byte.MIN_VALUE)) >= 0);
     }
 
     @Override
@@ -65,8 +65,8 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
     @Override
     public boolean isValidShort(int index) {
         BigInteger value = getValue(index);
-        return (value != null) && (value.compareTo(BigInteger.valueOf(Short.MAX_VALUE)) < 0) &&
-            (value.compareTo(BigInteger.valueOf(Short.MIN_VALUE)) > 0);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Short.MAX_VALUE)) <= 0) &&
+            (value.compareTo(BigInteger.valueOf(Short.MIN_VALUE)) >= 0);
     }
 
     @Override
@@ -80,8 +80,8 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
     @Override
     public boolean isValidInteger(int index) {
         BigInteger value = getValue(index);
-        return (value != null) && (value.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0) &&
-            (value.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) > 0);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) <= 0) &&
+            (value.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) >= 0);
     }
 
     @Override
@@ -95,8 +95,8 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
     @Override
     public boolean isValidLong(int index) {
         BigInteger value = getValue(index);
-        return (value != null) && (value.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0) &&
-            (value.compareTo(BigInteger.valueOf(Long.MIN_VALUE)) > 0);
+        return (value != null) && (value.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) <= 0) &&
+            (value.compareTo(BigInteger.valueOf(Long.MIN_VALUE)) >= 0);
     }
 
     @Override
@@ -126,8 +126,8 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
             return false;
         }
         BigDecimal decimalValue = new BigDecimal(value);
-        return (decimalValue.compareTo(BigDecimal.valueOf(Float.MAX_VALUE)) < 0) &&
-            (decimalValue.compareTo(BigDecimal.valueOf(Float.MIN_VALUE)) > 0);
+        return (decimalValue.compareTo(BigDecimal.valueOf(Float.MAX_VALUE)) <= 0) &&
+            (decimalValue.compareTo(BigDecimal.valueOf(-Float.MAX_VALUE)) >= 0);
     }
 
     @Override
@@ -145,8 +145,8 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
             return false;
         }
         BigDecimal decimalValue = new BigDecimal(value);
-        return (decimalValue.compareTo(BigDecimal.valueOf(Double.MAX_VALUE)) < 0) &&
-            (decimalValue.compareTo(BigDecimal.valueOf(Double.MIN_VALUE)) > 0);
+        return (decimalValue.compareTo(BigDecimal.valueOf(Double.MAX_VALUE)) <= 0) &&
+            (decimalValue.compareTo(BigDecimal.valueOf(-Double.MAX_VALUE)) >= 0);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
index 0e85bed..f5cd05f 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
@@ -20,9 +20,11 @@ package org.apache.plc4x.java.base.messages.items;
 
 import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.BitSet;
 
-public class DefaultBooleanFieldItem extends FieldItem<Boolean> {
+public class DefaultBooleanFieldItem extends BaseDefaultFieldItem<Boolean> {
 
     public DefaultBooleanFieldItem(Boolean... values) {
         super(values);
@@ -30,7 +32,7 @@ public class DefaultBooleanFieldItem extends FieldItem<Boolean> {
 
     @Override
     public Object getObject(int index) {
-        return getBoolean(index);
+        return getValue(index);
     }
 
     @Override
@@ -48,22 +50,132 @@ public class DefaultBooleanFieldItem extends FieldItem<Boolean> {
 
     @Override
     public boolean isValidByte(int index) {
-        int byteAddress = index >> 3;
-        return (getValue(byteAddress) != null);
+        return isValidBoolean(index);
     }
 
     @Override
     public Byte getByte(int index) {
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? (byte) 1 : (byte) 0;
+    }
+
+    @Override
+    public boolean isValidShort(int index) {
+        return isValidBoolean(index);
+    }
+
+    @Override
+    public Short getShort(int index) {
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? (short) 1 : (short) 0;
+    }
+
+    @Override
+    public boolean isValidInteger(int index) {
+        return isValidBoolean(index);
+    }
+
+    @Override
+    public Integer getInteger(int index) {
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? 1 : 0;
+    }
+
+    @Override
+    public boolean isValidLong(int index) {
+        return isValidBoolean(index);
+    }
+
+    @Override
+    public Long getLong(int index) {
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? 1L : 0L;
+    }
+
+    @Override
+    public boolean isValidBigInteger(int index) {
+        return isValidBoolean(index);
+    }
+
+    @Override
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? BigInteger.ONE : BigInteger.ZERO;
+    }
+
+    @Override
+    public boolean isValidFloat(int index) {
+        return isValidBoolean(index);
+    }
+
+    @Override
+    public Float getFloat(int index) {
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? 1.0F : 0.0F;
+    }
+
+    @Override
+    public boolean isValidDouble(int index) {
+        return isValidBoolean(index);
+    }
+
+    @Override
+    public Double getDouble(int index) {
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? 1.0D : 0.0D;
+    }
+
+    @Override
+    public boolean isValidBigDecimal(int index) {
+        return isValidBoolean(index);
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(int index) {
+        if (!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
+        return getValue(index) ? BigDecimal.ONE : BigDecimal.ZERO;
+    }
+
+    public Byte getCompleteByte(int index) {
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
+        }
         BitSet bitSet = new BitSet();
         int i = 0;
-        for (Boolean value : getValues()) {
-            bitSet.set(i, value);
-            i++;
+        if(getValues() != null) {
+            for (Boolean value : getValues()) {
+                bitSet.set(i, value);
+                i++;
+            }
         }
+        // TODO: In this case the real max index is smaller than the numValues the object reports.
+        // Calculate the real number of bytes.
+        int numBytes = (i / 8) + ((i % 8 == 0) ? 0 : 1);
         byte[] bytes = bitSet.toByteArray();
-        if (bytes.length < index) {
+        if (numBytes - 1 < index) {
             return null;
         }
+        // If the highest level bits are all false, the number of bytes is smaller than it should be,
+        // So we have to fix that and return a 0-vale byte instead.
+        if((bytes.length < numBytes) && (bytes.length <= index)) {
+            return 0x00;
+        }
         return bytes[index];
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
index b0732f5..6d35b0b 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
@@ -22,7 +22,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 
 import java.util.Objects;
 
-public class DefaultByteArrayFieldItem extends FieldItem<Byte[]> {
+public class DefaultByteArrayFieldItem extends BaseDefaultFieldItem<Byte[]> {
 
     public DefaultByteArrayFieldItem(Byte[]... values) {
         super(values);
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
index e737fcf..aac13d2 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultByteFieldItem extends FieldItem<Byte> {
+public class DefaultByteFieldItem extends BaseDefaultFieldItem<Byte> {
 
     public DefaultByteFieldItem(Byte... values) {
         super(values);
@@ -31,7 +31,7 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Object getObject(int index) {
-        return getByte(index);
+        return getValue(index);
     }
 
     @Override
@@ -117,7 +117,7 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
     @Override
     public boolean isValidFloat(int index) {
         Byte value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        return (value != null) && (value <= Float.MAX_VALUE) && (value >= -Float.MAX_VALUE);
     }
 
     @Override
@@ -131,7 +131,7 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
     @Override
     public boolean isValidDouble(int index) {
         Byte value = getValue(index);
-        return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
+        return (value != null) && (value <= Double.MAX_VALUE) && (value >= -Double.MAX_VALUE);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
index c010cc5..9a23dc8 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultDoubleFieldItem extends FieldItem<Double> {
+public class DefaultDoubleFieldItem extends BaseDefaultFieldItem<Double> {
 
     public DefaultDoubleFieldItem(Double... values) {
         super(values);
@@ -31,7 +31,7 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
     @Override
     public Object getObject(int index) {
-        return getDouble(index);
+        return getValue(index);
     }
 
     @Override
@@ -118,7 +118,7 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
     @Override
     public boolean isValidFloat(int index) {
         Double value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        return (value != null) && (value <= Float.MAX_VALUE) && (value >= -Float.MAX_VALUE);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
index a10c39a..d1f661d 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultFloatFieldItem extends FieldItem<Float> {
+public class DefaultFloatFieldItem extends BaseDefaultFieldItem<Float> {
 
     public DefaultFloatFieldItem(Float... values) {
         super(values);
@@ -31,7 +31,7 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public Object getObject(int index) {
-        return getFloat(index);
+        return getValue(index);
     }
 
     @Override
@@ -118,7 +118,7 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
     @Override
     public boolean isValidFloat(int index) {
         Float value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        return (value != null) && (value <= Float.MAX_VALUE) && (value >= -Float.MAX_VALUE);
     }
 
     @Override
@@ -131,6 +131,7 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public boolean isValidDouble(int index) {
+        // If it's a valid Float value it will also be a valid double one.
         return (getValue(index) != null);
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
index 345d20d..2c08c90 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultIntegerFieldItem extends FieldItem<Integer> {
+public class DefaultIntegerFieldItem extends BaseDefaultFieldItem<Integer> {
 
     public DefaultIntegerFieldItem(Integer... values) {
         super(values);
@@ -31,7 +31,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Object getObject(int index) {
-        return getInteger(index);
+        return getValue(index);
     }
 
     @Override
@@ -117,7 +117,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
     @Override
     public boolean isValidFloat(int index) {
         Integer value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        return (value != null) && (value <= Float.MAX_VALUE) && (value >= -Float.MAX_VALUE);
     }
 
     @Override
@@ -131,7 +131,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
     @Override
     public boolean isValidDouble(int index) {
         Integer value = getValue(index);
-        return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
+        return (value != null) && (value <= Double.MAX_VALUE) && (value >= -Double.MAX_VALUE);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
index 34811dc..79d6d6a 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
@@ -22,7 +22,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 
 import java.time.LocalDate;
 
-public class DefaultLocalDateFieldItem extends FieldItem<LocalDate> {
+public class DefaultLocalDateFieldItem extends BaseDefaultFieldItem<LocalDate> {
 
     public DefaultLocalDateFieldItem(LocalDate... values) {
         super(values);
@@ -30,7 +30,7 @@ public class DefaultLocalDateFieldItem extends FieldItem<LocalDate> {
 
     @Override
     public Object getObject(int index) {
-        return getDate(index);
+        return getValue(index);
     }
 
     @Override
@@ -40,7 +40,7 @@ public class DefaultLocalDateFieldItem extends FieldItem<LocalDate> {
 
     @Override
     public LocalDate getDate(int index) {
-        if (!isValidTime(index)) {
+        if (!isValidDate(index)) {
             throw new PlcIncompatibleDatatypeException(LocalDate.class, index);
         }
         return getValue(index);
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
index c49a03a..090b999 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
@@ -24,7 +24,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 
-public class DefaultLocalDateTimeFieldItem extends FieldItem<LocalDateTime> {
+public class DefaultLocalDateTimeFieldItem extends BaseDefaultFieldItem<LocalDateTime> {
 
     public DefaultLocalDateTimeFieldItem(LocalDateTime... values) {
         super(values);
@@ -32,7 +32,7 @@ public class DefaultLocalDateTimeFieldItem extends FieldItem<LocalDateTime> {
 
     @Override
     public Object getObject(int index) {
-        return getDateTime(index);
+        return getValue(index);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
index 0387401..f06cbb1 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
@@ -22,7 +22,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 
 import java.time.LocalTime;
 
-public class DefaultLocalTimeFieldItem extends FieldItem<LocalTime> {
+public class DefaultLocalTimeFieldItem extends BaseDefaultFieldItem<LocalTime> {
 
     public DefaultLocalTimeFieldItem(LocalTime... values) {
         super(values);
@@ -30,7 +30,7 @@ public class DefaultLocalTimeFieldItem extends FieldItem<LocalTime> {
 
     @Override
     public Object getObject(int index) {
-        return getTime(index);
+        return getValue(index);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
index 22d36dc..48efd02 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultLongFieldItem extends FieldItem<Long> {
+public class DefaultLongFieldItem extends BaseDefaultFieldItem<Long> {
 
     public DefaultLongFieldItem(Long... values) {
         super(values);
@@ -31,7 +31,7 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Object getObject(int index) {
-        return getLong(index);
+        return getValue(index);
     }
 
     @Override
@@ -117,7 +117,7 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
     @Override
     public boolean isValidFloat(int index) {
         Long value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        return (value != null) && (value <= Float.MAX_VALUE) && (value >= -Float.MAX_VALUE);
     }
 
     @Override
@@ -131,7 +131,7 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
     @Override
     public boolean isValidDouble(int index) {
         Long value = getValue(index);
-        return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
+        return (value != null) && (value <= Double.MAX_VALUE) && (value >= -Double.MAX_VALUE);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
index df02828..254a8c8 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
@@ -23,7 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultShortFieldItem extends FieldItem<Short> {
+public class DefaultShortFieldItem extends BaseDefaultFieldItem<Short> {
 
     public DefaultShortFieldItem(Short... values) {
         super(values);
@@ -31,7 +31,7 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Object getObject(int index) {
-        return getShort(index);
+        return getValue(index);
     }
 
     @Override
@@ -117,7 +117,7 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
     @Override
     public boolean isValidFloat(int index) {
         Short value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        return (value != null) && (value <= Float.MAX_VALUE) && (value >= -Float.MAX_VALUE);
     }
 
     @Override
@@ -131,7 +131,7 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
     @Override
     public boolean isValidDouble(int index) {
         Short value = getValue(index);
-        return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
+        return (value != null) && (value <= Double.MAX_VALUE) && (value >= -Double.MAX_VALUE);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java
index d02bbd2..cfb3b83 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
 
 import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
 
-public class DefaultStringFieldItem extends FieldItem<String> {
+public class DefaultStringFieldItem extends BaseDefaultFieldItem<String> {
 
     public DefaultStringFieldItem(String... values) {
         super(values);
@@ -28,7 +28,7 @@ public class DefaultStringFieldItem extends FieldItem<String> {
 
     @Override
     public Object getObject(int index) {
-        return getString(index);
+        return getValue(index);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocol.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocol.java
index bc19ad2..7ef5bdc 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocol.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocol.java
@@ -25,14 +25,12 @@ import io.netty.util.concurrent.Future;
 import io.netty.util.concurrent.PromiseCombiner;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
-import org.apache.plc4x.java.base.messages.PlcReader;
-import org.apache.plc4x.java.base.messages.PlcWriter;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.api.exceptions.PlcTimeoutException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -185,7 +183,7 @@ public class SingleItemToSingleRequestProtocol extends ChannelDuplexHandler {
             InternalPlcResponse plcResponse;
             if (originalPlcRequestContainer.getRequest() instanceof InternalPlcReadRequest) {
                 InternalPlcReadRequest internalPlcReadRequest = (InternalPlcReadRequest) originalPlcRequestContainer.getRequest();
-                HashMap<String, Pair<PlcResponseCode, FieldItem>> fields = new HashMap<>();
+                HashMap<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> fields = new HashMap<>();
 
                 correlatedResponseItems.stream()
                     .map(InternalPlcReadResponse.class::cast)
@@ -414,13 +412,13 @@ public class SingleItemToSingleRequestProtocol extends ChannelDuplexHandler {
 
         private final int tdpu;
 
-        public CorrelatedPlcWriteRequest(PlcWriter writer, LinkedHashMap<String, Pair<PlcField, FieldItem>> fields, int tdpu) {
+        public CorrelatedPlcWriteRequest(PlcWriter writer, LinkedHashMap<String, Pair<PlcField, BaseDefaultFieldItem>> fields, int tdpu) {
             super(writer, fields);
             this.tdpu = tdpu;
         }
 
-        public static CorrelatedPlcWriteRequest of(PlcWriter writer, Triple<String, PlcField, FieldItem> fieldItemTriple, int tdpu) {
-            LinkedHashMap<String, Pair<PlcField, FieldItem>> fields = new LinkedHashMap<>();
+        public static CorrelatedPlcWriteRequest of(PlcWriter writer, Triple<String, PlcField, BaseDefaultFieldItem> fieldItemTriple, int tdpu) {
+            LinkedHashMap<String, Pair<PlcField, BaseDefaultFieldItem>> fields = new LinkedHashMap<>();
             fields.put(fieldItemTriple.getLeft(), Pair.of(fieldItemTriple.getMiddle(), fieldItemTriple.getRight()));
             return new CorrelatedPlcWriteRequest(writer, fields, tdpu);
         }
diff --git a/plc4j/protocols/driver-bases/base/src/test/groovy/org/apache/plc4x/java/base/messages/items/DefaultItemsSpec.groovy b/plc4j/protocols/driver-bases/base/src/test/groovy/org/apache/plc4x/java/base/messages/items/DefaultItemsSpec.groovy
new file mode 100644
index 0000000..92c2713
--- /dev/null
+++ b/plc4j/protocols/driver-bases/base/src/test/groovy/org/apache/plc4x/java/base/messages/items/DefaultItemsSpec.groovy
@@ -0,0 +1,215 @@
+/*
+ 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.base.messages.items
+
+
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException
+import spock.lang.Specification
+import spock.lang.Unroll
+
+import java.time.LocalDate
+import java.time.LocalDateTime
+import java.time.LocalTime
+
+class DefaultItemsSpec extends Specification {
+
+    @Unroll
+    def "The '#fieldItemType.simpleName'.isValidXYZ methods should respect the correct boundaries of the type XYZ and "(
+        Class<? extends BaseDefaultFieldItem> fieldItemType, Object value, Boolean isValidBoolean, Boolean isValidByte, Boolean isValidShort, Boolean isValidInteger,
+        Boolean isValidLong, Boolean isValidBigInteger, Boolean isValidFloat, Boolean isValidDouble, Boolean isValidBigDecimal,
+        Boolean isValidString, Boolean isValidTime, Boolean isValidDate, Boolean isValidDateTime, Boolean isValidByteArray) {
+
+        setup:
+        BaseDefaultFieldItem fieldItem = fieldItemType.newInstance(value)
+
+        expect:
+        fieldItem.getObject(0) == value
+
+        assertItem(fieldItem, "Boolean", isValidBoolean)
+        assertItem(fieldItem, "Byte", isValidByte)
+        assertItem(fieldItem, "Short", isValidShort)
+        assertItem(fieldItem, "Integer", isValidInteger)
+        assertItem(fieldItem, "Long", isValidLong)
+        assertItem(fieldItem, "BigInteger", isValidBigInteger)
+        assertItem(fieldItem, "Float", isValidFloat)
+        assertItem(fieldItem, "Double", isValidDouble)
+        assertItem(fieldItem, "BigDecimal", isValidBigDecimal)
+        assertItem(fieldItem, "String", isValidString)
+        assertItem(fieldItem, "Time", isValidTime)
+        assertItem(fieldItem, "Date", isValidDate)
+        assertItem(fieldItem, "DateTime", isValidDateTime)
+        assertItem(fieldItem, "ByteArray", isValidByteArray)
+
+        where:
+        fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultBooleanFieldItem    | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultBooleanFieldItem    | true                                       || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBooleanFieldItem    | false                                      || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+                                                                                
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultByteFieldItem       | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultByteFieldItem       | (byte) 0                                   || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultByteFieldItem       | (byte) 42                                  || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultByteFieldItem       | Byte.MAX_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultByteFieldItem       | Byte.MIN_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultShortFieldItem      | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultShortFieldItem      | (short) 0                                  || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultShortFieldItem      | (short) 42                                 || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultShortFieldItem      | Byte.MIN_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultShortFieldItem      | Byte.MAX_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultShortFieldItem      | Short.MAX_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultShortFieldItem      | Short.MIN_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultIntegerFieldItem    | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | (int) 0                                    || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | (int) 42                                   || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | Byte.MIN_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | Byte.MAX_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | Short.MAX_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | Short.MIN_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | Integer.MAX_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultIntegerFieldItem    | Integer.MIN_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+                                                                                
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultLongFieldItem       | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | (int) 0                                    || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | (int) 42                                   || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Byte.MIN_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Byte.MAX_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Short.MAX_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Short.MIN_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Integer.MAX_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Integer.MIN_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Long.MAX_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultLongFieldItem       | Long.MIN_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultBigIntegerFieldItem | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | (int) 0                                    || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | (int) 42                                   || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Byte.MIN_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Byte.MAX_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Short.MIN_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Short.MAX_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Integer.MIN_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Integer.MAX_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Long.MIN_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | Long.MAX_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | BigInteger.valueOf(Long.MIN_VALUE).multiply(2) || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigIntegerFieldItem | BigInteger.valueOf(Long.MAX_VALUE).multiply(2) || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultFloatFieldItem      | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | (int) 0                                    || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | (int) 42                                   || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Byte.MIN_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Byte.MAX_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Short.MIN_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Short.MAX_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Integer.MIN_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+// In this case the conversion to Float results in a rounding error
+//        DefaultFloatFieldItem      | Integer.MAX_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Long.MIN_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Long.MAX_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | 1.2345678912345f                           || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Float.MIN_VALUE                            || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | -Float.MAX_VALUE                           || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultFloatFieldItem      | Float.MAX_VALUE                            || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultDoubleFieldItem     | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | (int) 0                                    || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | (int) 42                                   || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Byte.MIN_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Byte.MAX_VALUE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Short.MIN_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Short.MAX_VALUE                            || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Integer.MIN_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Integer.MAX_VALUE                          || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Long.MIN_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Long.MAX_VALUE                             || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | 1.23456789123456f                          || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Float.MIN_VALUE                            || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | -Float.MAX_VALUE                           || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Float.MAX_VALUE                            || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | 1.23456789012345d                          || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Double.MIN_VALUE                           || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | -Double.MAX_VALUE                          || true           | false       | false        | false          | false       | true              | false        | true          | true              | false         | false       | false       | false           | false
+        DefaultDoubleFieldItem     | Double.MAX_VALUE                           || true           | false       | false        | false          | false       | true              | false        | true          | true              | false         | false       | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultBigDecimalFieldItem | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.ZERO                            || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.ONE                             || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(42)                     || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Byte.MIN_VALUE)         || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Byte.MAX_VALUE)         || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Short.MIN_VALUE)        || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Short.MAX_VALUE)        || true           | false       | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Integer.MIN_VALUE)      || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Integer.MAX_VALUE)      || true           | false       | false        | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Long.MIN_VALUE)         || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Long.MAX_VALUE)         || true           | false       | false        | false          | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(1.23456789123456f)      || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Float.MIN_VALUE)        || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(-Float.MAX_VALUE)       || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Float.MAX_VALUE)        || true           | false       | false        | false          | false       | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(1.23456789012345d)      || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Double.MIN_VALUE)       || true           | true        | true         | true           | true        | true              | true         | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(-Double.MAX_VALUE)      || true           | false       | false        | false          | false       | true              | false        | true          | true              | false         | false       | false       | false           | false
+        DefaultBigDecimalFieldItem | BigDecimal.valueOf(Double.MAX_VALUE)       || true           | false       | false        | false          | false       | true              | false        | true          | true              | false         | false       | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultLocalTimeFieldItem  | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultLocalTimeFieldItem  | LocalTime.now()                            || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | true        | false       | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultLocalDateFieldItem  | null                                       || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultLocalDateFieldItem  | LocalDate.now()                            || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | true        | false           | false
+
+//      fieldItemType              | value                                      || isValidBoolean | isValidByte | isValidShort | isValidInteger | isValidLong | isValidBigInteger | isValidFloat | isValidDouble | isValidBigDecimal | isValidString | isValidTime | isValidDate | isValidDateTime | isValidByteArray
+        DefaultLocalDateTimeFieldItem | null                                    || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | false       | false       | false           | false
+        DefaultLocalDateTimeFieldItem | LocalDateTime.now()                     || false          | false       | false        | false          | false       | false             | false        | false         | false             | false         | true        | true        | true            | false
+    }
+
+    Boolean assertItem(BaseDefaultFieldItem fieldItem, String type, Boolean expectedToBeValid) {
+        assert fieldItem."isValid$type"(0) == expectedToBeValid
+        if (expectedToBeValid) {
+            assert fieldItem."get$type"(0) != null
+        } else {
+            assert getExecutionException({fieldItem."get$type"(0)}) instanceof PlcIncompatibleDatatypeException
+        }
+        return true
+    }
+
+    Exception getExecutionException(Closure c) {
+        try{
+            c.call()
+            return null
+        }catch(Exception e){
+            return e
+        }
+    }
+
+}
+
+
diff --git a/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocolTest.java b/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocolTest.java
index b3c6458..ebf266f 100644
--- a/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocolTest.java
+++ b/plc4j/protocols/driver-bases/base/src/test/java/org/apache/plc4x/java/base/protocol/SingleItemToSingleRequestProtocolTest.java
@@ -29,7 +29,7 @@ import org.apache.plc4x.java.api.messages.PlcFieldRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.base.model.InternalPlcSubscriptionHandle;
 import org.apache.plc4x.java.base.model.SubscriptionPlcField;
 import org.assertj.core.api.WithAssertions;
@@ -284,8 +284,8 @@ class SingleItemToSingleRequestProtocolTest implements WithAssertions {
             InternalPlcReadRequest request = (InternalPlcReadRequest) plcRequestContainer.getRequest();
             String fieldName = request.getFieldNames().iterator().next();
             CompletableFuture responseFuture = plcRequestContainer.getResponseFuture();
-            HashMap<String, Pair<PlcResponseCode, FieldItem>> responseFields = new HashMap<>();
-            responseFields.put(fieldName, Pair.of(PlcResponseCode.OK, mock(FieldItem.class)));
+            HashMap<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> responseFields = new HashMap<>();
+            responseFields.put(fieldName, Pair.of(PlcResponseCode.OK, mock(BaseDefaultFieldItem.class)));
             responseFuture.complete(new DefaultPlcReadResponse(request, responseFields));
             return null;
         }
@@ -294,13 +294,13 @@ class SingleItemToSingleRequestProtocolTest implements WithAssertions {
     @Nested
     class Decoding {
         @Test
-        void tryFinish() throws Exception {
+        void tryFinish() {
             SUT.tryFinish(1, null, new CompletableFuture<>());
             // TODO: add Assertions.
         }
 
         @Test
-        void errored() throws Exception {
+        void errored() {
             SUT.errored(1, mock(Throwable.class), new CompletableFuture<>());
             // TODO: add Assertions.
         }
@@ -385,12 +385,12 @@ class SingleItemToSingleRequestProtocolTest implements WithAssertions {
         }
 
         @Test
-        void subscribe() throws Exception {
+        void subscribe() {
             // TODO: implement once available
         }
 
         @Test
-        void unsubcribe() throws Exception {
+        void unsubcribe() {
             // TODO: implement once available
         }
 
@@ -419,13 +419,13 @@ class SingleItemToSingleRequestProtocolTest implements WithAssertions {
 
     private static class TestDefaultPlcWriteRequest extends DefaultPlcWriteRequest {
 
-        private TestDefaultPlcWriteRequest(PlcWriter writer, LinkedHashMap<String, Pair<PlcField, FieldItem>> fields) {
+        private TestDefaultPlcWriteRequest(PlcWriter writer, LinkedHashMap<String, Pair<PlcField, BaseDefaultFieldItem>> fields) {
             super(writer, fields);
         }
 
         private static TestDefaultPlcWriteRequest build(PlcWriter writer) {
-            LinkedHashMap<String, Pair<PlcField, FieldItem>> fields = new LinkedHashMap<>();
-            IntStream.rangeClosed(1, 5).forEach(i -> fields.put("writeField" + i, Pair.of(mock(PlcField.class), mock(FieldItem.class))));
+            LinkedHashMap<String, Pair<PlcField, BaseDefaultFieldItem>> fields = new LinkedHashMap<>();
+            IntStream.rangeClosed(1, 5).forEach(i -> fields.put("writeField" + i, Pair.of(mock(PlcField.class), mock(BaseDefaultFieldItem.class))));
             return new TestDefaultPlcWriteRequest(writer, fields);
         }
     }
diff --git a/plc4j/protocols/driver-bases/base/src/test/resources/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties b/plc4j/protocols/driver-bases/base/src/test/resources/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties
new file mode 100644
index 0000000..0759363
--- /dev/null
+++ b/plc4j/protocols/driver-bases/base/src/test/resources/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties
@@ -0,0 +1,66 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# Name of the implementation class(es) of report creator(s) to enable (separate multiple entries with commas)
+# Currently supported classes are:
+#   1. com.athaydes.spockframework.report.internal.HtmlReportCreator
+#   2. com.athaydes.spockframework.report.template.TemplateReportCreator
+com.athaydes.spockframework.report.IReportCreator=com.athaydes.spockframework.report.internal.HtmlReportCreator
+
+# Set properties of the report creator
+# For the HtmlReportCreator, the only properties available are
+# (the location of the css files is relative to the classpath):
+com.athaydes.spockframework.report.internal.HtmlReportCreator.featureReportCss=spock-feature-report.css
+com.athaydes.spockframework.report.internal.HtmlReportCreator.summaryReportCss=spock-summary-report.css
+com.athaydes.spockframework.report.internal.HtmlReportCreator.printThrowableStackTrace=false
+com.athaydes.spockframework.report.internal.HtmlReportCreator.inlineCss=true
+com.athaydes.spockframework.report.internal.HtmlReportCreator.enabled=true
+# options are: "class_name_and_title", "class_name", "title"
+com.athaydes.spockframework.report.internal.HtmlReportCreator.specSummaryNameOption=class_name_and_title
+
+# exclude Specs Table of Contents
+com.athaydes.spockframework.report.internal.HtmlReportCreator.excludeToc=false
+
+# Output directory (where the spock reports will be created) - relative to working directory
+com.athaydes.spockframework.report.outputDir=target/spock-reports
+
+# Output directory where to store the aggregated JSON report (used to support parallel builds)
+com.athaydes.spockframework.report.aggregatedJsonReportDir=
+
+# If set to true, hides blocks which do not have any description
+com.athaydes.spockframework.report.hideEmptyBlocks=false
+
+# Set the name of the project under test so it can be displayed in the report
+com.athaydes.spockframework.report.projectName=
+
+# Set the version of the project under test so it can be displayed in the report
+com.athaydes.spockframework.report.projectVersion=Unknown
+
+# Show the source code for each block
+com.athaydes.spockframework.report.showCodeBlocks=false
+
+# Set the root location of the Spock test source code (only used if showCodeBlocks is 'true')
+com.athaydes.spockframework.report.testSourceRoots=src/test/groovy
+
+# Set properties specific to the TemplateReportCreator
+com.athaydes.spockframework.report.template.TemplateReportCreator.specTemplateFile=/templateReportCreator/spec-template.md
+com.athaydes.spockframework.report.template.TemplateReportCreator.reportFileExtension=md
+com.athaydes.spockframework.report.template.TemplateReportCreator.summaryTemplateFile=/templateReportCreator/summary-template.md
+com.athaydes.spockframework.report.template.TemplateReportCreator.summaryFileName=summary.md
+com.athaydes.spockframework.report.template.TemplateReportCreator.enabled=true
\ No newline at end of file
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
index 98df8d0..49087c1 100644
--- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
+++ b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
@@ -32,14 +32,16 @@ import io.netty.handler.codec.MessageToMessageCodec;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
-import org.apache.plc4x.java.api.messages.*;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.events.ConnectEvent;
 import org.apache.plc4x.java.base.events.ConnectedEvent;
 import org.apache.plc4x.java.base.messages.*;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.ethernetip.model.EtherNetIpField;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -468,7 +470,7 @@ public class Plc4XEtherNetIpProtocol extends MessageToMessageCodec<EnipPacket, P
         UnconnectedDataItemResponse enipResponse = (UnconnectedDataItemResponse) payload;
         ByteBuf data = enipResponse.getData();
         if (data.readableBytes() > 0) {
-            Map<String, Pair<PlcResponseCode, FieldItem>> values = new HashMap<>();
+            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> values = new HashMap<>();
             // TODO: This is not quite correct as this will probalby not work when requesting more than one item.
             for (String fieldName : request.getFieldNames()) {
                 MessageRouterResponse cipResponse = MessageRouterResponse.decode(data);
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java
index eea8901..bd2fbac 100644
--- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java
+++ b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java
@@ -22,7 +22,7 @@ import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.DefaultPlcFieldHandler;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.ethernetip.model.EtherNetIpField;
 
 public class EnipPlcFieldHandler extends DefaultPlcFieldHandler {
@@ -36,73 +36,73 @@ public class EnipPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeByte(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeShort(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeLong(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeFloat(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeDouble(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeString(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeDate(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
 
     @Override
-    public FieldItem encodeDateTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
         EtherNetIpField enipField = (EtherNetIpField) field;
         throw new PlcRuntimeException("Invalid encoder for type " + enipField);
     }
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
index 1bfb9d4..291cc72 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.api.messages.PlcRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.*;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultBooleanFieldItem;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.modbus.messages.items.DefaultModbusByteArrayFieldItem;
 import org.apache.plc4x.java.modbus.model.*;
 import org.slf4j.Logger;
@@ -263,7 +263,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
             LOGGER.debug("{}: Nothing", readCoilsResponse);
             ByteBuf byteBuf = readCoilsResponse.getCoilStatus();
             DefaultBooleanFieldItem data = produceCoilValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, FieldItem>> responseValues = new HashMap<>();
+            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> responseValues = new HashMap<>();
             responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
             plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
         } else if (modbusPdu instanceof ReadDiscreteInputsResponse) {
@@ -272,7 +272,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
             LOGGER.debug("{}: Nothing", readDiscreteInputsResponse);
             ByteBuf byteBuf = readDiscreteInputsResponse.getInputStatus();
             DefaultBooleanFieldItem data = produceCoilValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, FieldItem>> responseValues = new HashMap<>();
+            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> responseValues = new HashMap<>();
             responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
             plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
         } else if (modbusPdu instanceof ReadHoldingRegistersResponse) {
@@ -282,7 +282,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
             ByteBuf byteBuf = readHoldingRegistersResponse.getRegisters();
             // TODO: use register method
             DefaultModbusByteArrayFieldItem data = produceRegisterValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, FieldItem>> responseValues = new HashMap<>();
+            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> responseValues = new HashMap<>();
             responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
             plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
         } else if (modbusPdu instanceof ReadInputRegistersResponse) {
@@ -292,7 +292,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
             ByteBuf byteBuf = readInputRegistersResponse.getRegisters();
             // TODO: use register method
             DefaultModbusByteArrayFieldItem data = produceRegisterValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, FieldItem>> responseValues = new HashMap<>();
+            Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> responseValues = new HashMap<>();
             responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
             plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
         } else if (modbusPdu instanceof MaskWriteRegisterResponse) {
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
index 4fa4e80..eaf3912 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
@@ -22,8 +22,8 @@ import org.apache.commons.lang3.ArrayUtils;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.DefaultPlcFieldHandler;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultBooleanFieldItem;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.modbus.messages.items.DefaultModbusByteArrayFieldItem;
 import org.apache.plc4x.java.modbus.model.*;
 
@@ -52,7 +52,7 @@ public class ModbusPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
         ModbusField modbusField = (ModbusField) field;
         List<Boolean> booleanValues = new LinkedList<>();
         for (Object value : values) {
@@ -93,7 +93,7 @@ public class ModbusPlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeByteArray(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByteArray(PlcField field, Object[] values) {
         ModbusField modbusField = (ModbusField) field;
         List<Byte[]> byteArrays = new LinkedList<>();
         for (Object value : values) {
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java
index 454afec..beedcbf 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java
@@ -18,19 +18,20 @@
  */
 package org.apache.plc4x.java.modbus.messages.items;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.junit.Test;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 @SuppressWarnings("unchecked")
 public class DefaultModbusByteArrayFieldItemTest {
     @Test
     public void convertByteArrayToIntegerTest() {
-        FieldItem fieldItem = getFieldItemForIntegerArray();
+        BaseDefaultFieldItem fieldItem = getFieldItemForIntegerArray();
 
         Integer itemInteger = fieldItem.getInteger(1);
         assertEquals(456,itemInteger,0);
@@ -38,13 +39,13 @@ public class DefaultModbusByteArrayFieldItemTest {
 
     @Test
     public void convertByteArrayToIntegerTestReturnsNull() {
-        FieldItem fieldItem = getFieldItemForIntegerArray();
+        BaseDefaultFieldItem fieldItem = getFieldItemForIntegerArray();
 
         Integer itemInteger = fieldItem.getInteger(17);
         assertNull(itemInteger);
     }
 
-    private static FieldItem getFieldItemForIntegerArray() {
+    private static BaseDefaultFieldItem getFieldItemForIntegerArray() {
         int sizeIntByteBuffer = 12;
         ByteBuffer byteBuffer = ByteBuffer.allocate(sizeIntByteBuffer);
         byteBuffer.order(ByteOrder.BIG_ENDIAN);
@@ -65,7 +66,7 @@ public class DefaultModbusByteArrayFieldItemTest {
 
     @Test
     public void convertByteArrayToShortTest() {
-        FieldItem fieldItem = getFieldItemForShortArray();
+        BaseDefaultFieldItem fieldItem = getFieldItemForShortArray();
 
         Short itemShort = fieldItem.getShort(3);
         assertEquals(1011,itemShort,0);
@@ -73,13 +74,13 @@ public class DefaultModbusByteArrayFieldItemTest {
 
     @Test
     public void convertByteArrayToShortTestReturnsNull() {
-        FieldItem fieldItem = getFieldItemForShortArray();
+        BaseDefaultFieldItem fieldItem = getFieldItemForShortArray();
 
         Short itemShort = fieldItem.getShort(7);
         assertNull(itemShort);
     }
 
-    private static FieldItem getFieldItemForShortArray() {
+    private static BaseDefaultFieldItem getFieldItemForShortArray() {
         int sizeIntByteBuffer = 8;
         ByteBuffer byteBuffer = ByteBuffer.allocate(sizeIntByteBuffer);
         byteBuffer.order(ByteOrder.BIG_ENDIAN);
@@ -100,7 +101,7 @@ public class DefaultModbusByteArrayFieldItemTest {
 
     @Test
     public void convertByteArrayToLongTest() {
-        FieldItem fieldItem = getFieldItemForLongArray();
+        BaseDefaultFieldItem fieldItem = getFieldItemForLongArray();
 
         Long itemLong = fieldItem.getLong(1);
         assertEquals(456789123L,itemLong,0);
@@ -108,13 +109,13 @@ public class DefaultModbusByteArrayFieldItemTest {
 
     @Test
     public void convertByteArrayToLongTestReturnsNull() {
-        FieldItem fieldItem = getFieldItemForLongArray();
+        BaseDefaultFieldItem fieldItem = getFieldItemForLongArray();
 
         Long itemLong = fieldItem.getLong(4);
         assertNull(itemLong);
     }
 
-    private static FieldItem getFieldItemForLongArray() {
+    private static BaseDefaultFieldItem getFieldItemForLongArray() {
         int sizeIntByteBuffer = 32;
         ByteBuffer byteBuffer = ByteBuffer.allocate(sizeIntByteBuffer);
         byteBuffer.order(ByteOrder.BIG_ENDIAN);
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 43c6d44..01c8cb5 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
@@ -34,7 +34,7 @@ import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.PlcMessageToMessageCodec;
 import org.apache.plc4x.java.base.events.ConnectedEvent;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.s7.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.s7.netty.events.S7ConnectedEvent;
@@ -193,7 +193,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
             if(!(writeRequest instanceof DefaultPlcWriteRequest)) {
                 throw new PlcException("The writeRequest should have been of type DefaultPlcWriteRequest");
             }
-            FieldItem fieldItem = ((DefaultPlcWriteRequest) writeRequest).getFieldItem(fieldName);
+            BaseDefaultFieldItem fieldItem = ((DefaultPlcWriteRequest) writeRequest).getFieldItem(fieldName);
 
             // The number of elements provided in the request must match the number defined in the field, or
             // bad things are going to happen.
@@ -411,7 +411,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                 "The number of requested items doesn't match the number of returned items");
         }
 
-        Map<String, Pair<PlcResponseCode, FieldItem>> values = new HashMap<>();
+        Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> values = new HashMap<>();
         List<VarPayloadItem> payloadItems = payload.getItems();
         int index = 0;
         for (String fieldName : plcReadRequest.getFieldNames()) {
@@ -419,7 +419,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
             VarPayloadItem payloadItem = payloadItems.get(index);
 
             PlcResponseCode responseCode = decodeResponseCode(payloadItem.getReturnCode());
-            FieldItem fieldItem = null;
+            BaseDefaultFieldItem fieldItem = null;
             ByteBuf data = Unpooled.wrappedBuffer(payloadItem.getData());
             if (responseCode == PlcResponseCode.OK) {
                 // TODO 2018-09-27 jf: array returning only implemented for BOOL, BYTE, INTEGERS, FP
@@ -572,7 +572,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                         throw new PlcProtocolException("Unsupported type " + field.getDataType());
                 }
             }
-            Pair<PlcResponseCode, FieldItem> result = new ImmutablePair<>(responseCode, fieldItem);
+            Pair<PlcResponseCode, BaseDefaultFieldItem> result = new ImmutablePair<>(responseCode, fieldItem);
             values.put(fieldName, result);
             index++;
         }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
index 4ab6a51..b9c99df 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
@@ -22,9 +22,9 @@ import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.DefaultPlcFieldHandler;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultLocalDateTimeFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.s7.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
@@ -46,7 +46,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         // All of these types are declared as Bit or Bit-String types.
         if ((s7Field.getDataType() == TransportSize.BOOL) || (s7Field.getDataType() == TransportSize.BYTE) ||
@@ -58,7 +58,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeByte(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if ((s7Field.getDataType() == TransportSize.BYTE) || (s7Field.getDataType() == TransportSize.SINT) ||
             (s7Field.getDataType() == TransportSize.USINT) || (s7Field.getDataType() == TransportSize.CHAR)) {
@@ -68,7 +68,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeShort(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if ((s7Field.getDataType() == TransportSize.WORD) || (s7Field.getDataType() == TransportSize.INT) ||
             (s7Field.getDataType() == TransportSize.UINT)) {
@@ -78,7 +78,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if ((s7Field.getDataType() == TransportSize.DWORD) || (s7Field.getDataType() == TransportSize.DINT) ||
             (s7Field.getDataType() == TransportSize.UDINT)) {
@@ -88,7 +88,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if ((s7Field.getDataType() == TransportSize.DWORD) || (s7Field.getDataType() == TransportSize.DINT) ||
             (s7Field.getDataType() == TransportSize.UDINT)) {
@@ -98,7 +98,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeLong(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if ((s7Field.getDataType() == TransportSize.LWORD) || (s7Field.getDataType() == TransportSize.LINT) ||
             (s7Field.getDataType() == TransportSize.ULINT)) {
@@ -108,7 +108,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeFloat(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if (s7Field.getDataType() == TransportSize.REAL) {
             return internalEncodeFloatingPoint(field, values);
@@ -117,7 +117,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDouble(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if (s7Field.getDataType() == TransportSize.LREAL) {
             return internalEncodeFloatingPoint(field, values);
@@ -126,7 +126,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeString(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if ((s7Field.getDataType() == TransportSize.CHAR) || (s7Field.getDataType() == TransportSize.WCHAR) ||
             (s7Field.getDataType() == TransportSize.STRING) || (s7Field.getDataType() == TransportSize.WSTRING)) {
@@ -136,7 +136,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if (s7Field.getDataType() == TransportSize.TIME) {
             return internalEncodeTemporal(field, values);
@@ -145,7 +145,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDate(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if (s7Field.getDataType() == TransportSize.DATE) {
             return internalEncodeTemporal(field, values);
@@ -154,7 +154,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDateTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         if (s7Field.getDataType() == TransportSize.DATE_AND_TIME) {
             return internalEncodeTemporal(field, values);
@@ -162,7 +162,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
     }
 
-    private FieldItem internalEncodeBoolean(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeBoolean(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case BOOL:
@@ -213,11 +213,11 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         return new S7BooleanFieldItem(s7Field.getDataType(), booleanValues.toArray(new Boolean[0]));
     }
 
-    private FieldItem internalEncodeInteger(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         BigInteger minValue;
         BigInteger maxValue;
-        Class<? extends FieldItem> fieldType;
+        Class<? extends BaseDefaultFieldItem> fieldType;
         switch (s7Field.getDataType()) {
             case BYTE:
                 minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
@@ -336,7 +336,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         }
     }
 
-    private FieldItem internalEncodeFloatingPoint(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeFloatingPoint(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         Double minValue;
         Double maxValue;
@@ -380,7 +380,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         return new S7FloatingPointFieldItem(s7Field.getDataType(), floatingPointValues);
     }
 
-    private FieldItem internalEncodeString(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeString(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         int maxLength;
         boolean encoding16Bit;
@@ -472,7 +472,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         return new S7StringFieldItem(s7Field.getDataType(), stringValues.toArray(new String[0]));
     }
 
-    private FieldItem internalEncodeTemporal(PlcField field, Object[] values) {
+    private BaseDefaultFieldItem internalEncodeTemporal(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         switch (s7Field.getDataType()) {
             case TIME:
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
index d938fc0..4a4b790 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
@@ -18,11 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.s7.netty.util;
 
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
 import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -39,6 +36,9 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
 class S7PlcFieldHandlerTest {
 
     private static S7PlcFieldHandler SUT = new S7PlcFieldHandler();
@@ -331,10 +331,10 @@ class S7PlcFieldHandlerTest {
     }
 
     private void encode(String name, PlcField field, Object[] values, Set<String> expectedSuccess,
-                        BiFunction<PlcField, Object[], FieldItem> encoder) {
+                        BiFunction<PlcField, Object[], BaseDefaultFieldItem> encoder) {
         boolean success = expectedSuccess.contains(name);
         try {
-            FieldItem fieldItem = encoder.apply(field, values);
+            BaseDefaultFieldItem fieldItem = encoder.apply(field, values);
             assertNotNull(fieldItem, "A FieldItem instance should have been returned for testcase " + name);
             if(!success) {
                 fail("Expected to fail for testcase " + name);
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
index 32da5e9..5d06baf 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
@@ -21,12 +21,10 @@ package org.apache.plc4x.java.test;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.base.messages.PlcReader;
-import org.apache.plc4x.java.base.messages.PlcWriter;
 import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -86,11 +84,11 @@ class TestConnection implements PlcConnection, PlcReader, PlcWriter {
             throw new IllegalArgumentException("Read request doesn't implement InternalPlcReadRequest");
         }
         InternalPlcReadRequest request = (InternalPlcReadRequest) readRequest;
-        Map<String, Pair<PlcResponseCode, FieldItem>> fields = new HashMap<>();
+        Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> fields = new HashMap<>();
         for (String fieldName : request.getFieldNames()) {
             TestField field = (TestField) request.getField(fieldName);
-            Optional<FieldItem> fieldItemOptional = device.get(field);
-            ImmutablePair<PlcResponseCode, FieldItem> fieldPair;
+            Optional<BaseDefaultFieldItem> fieldItemOptional = device.get(field);
+            ImmutablePair<PlcResponseCode, BaseDefaultFieldItem> fieldPair;
             boolean present = fieldItemOptional.isPresent();
             fieldPair = present
                 ? new ImmutablePair<>(PlcResponseCode.OK, fieldItemOptional.get())
@@ -110,7 +108,7 @@ class TestConnection implements PlcConnection, PlcReader, PlcWriter {
         Map<String, PlcResponseCode> fields = new HashMap<>();
         for (String fieldName : request.getFieldNames()) {
             TestField field = (TestField) request.getField(fieldName);
-            FieldItem fieldItem = request.getFieldItem(fieldName);
+            BaseDefaultFieldItem fieldItem = request.getFieldItem(fieldName);
             device.set(field, fieldItem);
             fields.put(fieldName, PlcResponseCode.OK);
         }
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestDevice.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestDevice.java
index b93e545..c4a4716 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestDevice.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestDevice.java
@@ -18,7 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.test;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
 import java.util.*;
 
@@ -30,13 +30,13 @@ class TestDevice {
 
     private final Random random = new Random();
     private final String name;
-    private final Map<TestField, FieldItem> state = new HashMap<>();
+    private final Map<TestField, BaseDefaultFieldItem> state = new HashMap<>();
 
     TestDevice(String name) {
         this.name = name;
     }
 
-    Optional<FieldItem> get(TestField field) {
+    Optional<BaseDefaultFieldItem> get(TestField field) {
         Objects.requireNonNull(field);
         switch(field.getType()) {
             case STATE:
@@ -49,7 +49,7 @@ class TestDevice {
         throw new IllegalArgumentException("Unsupported field type: " + field.getType().name());
     }
 
-    void set(TestField field, FieldItem value) {
+    void set(TestField field, BaseDefaultFieldItem value) {
         Objects.requireNonNull(field);
         switch (field.getType()) {
             case STATE:
@@ -66,7 +66,7 @@ class TestDevice {
     }
 
     @SuppressWarnings("unchecked")
-    private FieldItem randomValue(Class<?> type) {
+    private BaseDefaultFieldItem randomValue(Class<?> type) {
         Object result = null;
 
         if (type.equals(Byte.class))
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
index 045912c..4452656 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
@@ -43,7 +43,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBoolean(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBoolean(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Boolean.class) {
             return new DefaultBooleanFieldItem((Boolean[]) values);
@@ -52,7 +52,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeByte(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByte(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Byte.class) {
             return new DefaultLongFieldItem(Arrays.stream(values).map(x -> new Long((Byte) x)).toArray(Long[]::new));
@@ -61,7 +61,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeShort(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeShort(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Short.class) {
             return new DefaultLongFieldItem(Arrays.stream(values).map(x -> new Long((Short) x)).toArray(Long[]::new));
@@ -70,7 +70,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeInteger(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Integer.class) {
             return new DefaultLongFieldItem(Arrays.stream(values).map(x -> new Long((Integer) x)).toArray(Long[]::new));
@@ -79,7 +79,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBigInteger(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigInteger(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == BigInteger.class) {
             return new DefaultLongFieldItem(Arrays.stream(values).map(x -> ((BigInteger) x).longValue()).toArray(Long[]::new));
@@ -88,7 +88,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeLong(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeLong(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Long.class) {
             return new DefaultLongFieldItem((Long[]) values);
@@ -97,7 +97,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeFloat(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeFloat(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Float.class) {
             return new DefaultDoubleFieldItem((Double[]) values);
@@ -106,7 +106,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeBigDecimal(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeBigDecimal(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == BigDecimal.class) {
             return new DefaultBigDecimalFieldItem((BigDecimal[]) values);
@@ -115,7 +115,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDouble(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDouble(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Double.class) {
             return new DefaultDoubleFieldItem((Double[]) values);
@@ -124,7 +124,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeString(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeString(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == String.class) {
             return new DefaultStringFieldItem((String[]) values);
@@ -133,7 +133,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeTime(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == LocalTime.class) {
             return new DefaultLocalDateTimeFieldItem((LocalDateTime[]) values);
@@ -142,7 +142,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDate(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDate(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == LocalDate.class) {
             return new DefaultLocalDateTimeFieldItem((LocalDateTime[]) values);
@@ -151,7 +151,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeDateTime(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeDateTime(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == LocalDateTime.class) {
             return new DefaultLocalDateTimeFieldItem((LocalDateTime[]) values);
@@ -160,7 +160,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     }
 
     @Override
-    public FieldItem encodeByteArray(PlcField field, Object[] values) {
+    public BaseDefaultFieldItem encodeByteArray(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == byte[].class) {
             return new DefaultByteArrayFieldItem(Arrays.stream(values).map(Byte.class::cast).toArray(Byte[]::new));
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
index 1c93a94..a040a6d 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
@@ -19,9 +19,9 @@
 
 package org.apache.plc4x.java.test;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
-public class TestFieldItem<T> extends FieldItem<T> {
+public class TestFieldItem<T> extends BaseDefaultFieldItem<T> {
 
     public TestFieldItem(T[] values) {
         super(values);
diff --git a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
index 53df1c7..9038e46 100644
--- a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
+++ b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
@@ -18,15 +18,13 @@
  */
 package org.apache.plc4x.java.test;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
 import org.junit.Test;
 
 import java.util.Optional;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 public class TestDeviceTest {
 
@@ -35,7 +33,7 @@ public class TestDeviceTest {
         TestDevice device = new TestDevice("foobar");
         TestField field = TestField.of("RANDOM/foo:INTEGER");
 
-        Optional<FieldItem> value = device.get(field);
+        Optional<BaseDefaultFieldItem> value = device.get(field);
 
         assertTrue(value.isPresent());
     }
@@ -45,13 +43,13 @@ public class TestDeviceTest {
         TestDevice device = new TestDevice("foobar");
         TestField field = TestField.of("STATE/bar:INTEGER");
 
-        Optional<FieldItem> value = device.get(field);
+        Optional<BaseDefaultFieldItem> value = device.get(field);
         assertFalse(value.isPresent());
 
         device.set(field, new DefaultLongFieldItem((long) 42));
         value = device.get(field);
         assertTrue(value.isPresent());
-        FieldItem fieldItem = value.get();
+        BaseDefaultFieldItem fieldItem = value.get();
         assertEquals(42L, (long) fieldItem.getLong(0));
     }
 
diff --git a/pom.xml b/pom.xml
index 63d6ea7..2495fac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,21 +88,23 @@
     <!-- Exclude all generated code -->
     <sonar.exclusions>**/generated-sources</sonar.exclusions>
 
+    <assertj.version>3.11.1</assertj.version>
     <commons-io.version>2.6</commons-io.version>
     <commons-codec.version>1.11</commons-codec.version>
     <commons-collections4.version>4.1</commons-collections4.version>
     <commons-lang.version>2.6</commons-lang.version>
-    <hamcrest.version>1.3</hamcrest.version>
+    <groovy.version>2.5.3</groovy.version>
     <gson.version>2.8.0</gson.version>
+    <hamcrest.version>1.3</hamcrest.version>
     <junit.version>4.12</junit.version>
     <junit.jupiter.version>5.2.0</junit.jupiter.version>
     <junit.platform.version>1.2.0</junit.platform.version>
     <logback.version>1.2.3</logback.version>
     <mockito.version>2.22.0</mockito.version>
-    <assertj.version>3.11.1</assertj.version>
     <netty.version>4.1.23.Final</netty.version>
     <pcap4j.version>1.7.3</pcap4j.version>
     <slf4j.version>1.7.25</slf4j.version>
+    <spock.version>1.2-groovy-2.5</spock.version>
 
     <!-- Site properties -->
     <bootstrap.version>3.3.7</bootstrap.version>
@@ -281,6 +283,21 @@
         <artifactId>pcap4j-packetfactory-static</artifactId>
         <version>${pcap4j.version}</version>
       </dependency>
+
+      <dependency>
+        <groupId>org.codehaus.groovy</groupId>
+        <artifactId>groovy-all</artifactId>
+        <version>${groovy.version}</version>
+        <type>pom</type>
+        <!-- Ensure we only use this in test -->
+        <scope>test</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.spockframework</groupId>
+        <artifactId>spock-core</artifactId>
+        <version>${spock.version}</version>
+        <scope>test</scope>
+      </dependency>
     </dependencies>
   </dependencyManagement>
 
@@ -413,6 +430,25 @@
         </executions>
       </plugin>
 
+      <!-- Compile any groovy code located in "src/test/groovy" -->
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <version>1.6.2</version>
+        <executions>
+          <execution>
+            <id>compile-groovy-tests</id>
+            <phase>test-compile</phase>
+            <goals>
+              <goal>addTestSources</goal>
+              <goal>generateTestStubs</goal>
+              <goal>compileTests</goal>
+              <goal>removeTestStubs</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
       <!--
         ===================================
         ==                               ==
@@ -1081,6 +1117,13 @@
           <artifactId>assertj-core</artifactId>
           <scope>test</scope>
         </dependency>
+
+        <dependency>
+          <groupId>org.codehaus.groovy</groupId>
+          <artifactId>groovy-all</artifactId>
+          <type>pom</type>
+          <scope>test</scope>
+        </dependency>
       </dependencies>
 
       <build>
@@ -1119,6 +1162,9 @@
                     <ignoredDependency>org.mockito:mockito-junit-jupiter</ignoredDependency>
                     <ignoredDependency>org.slf4j:slf4j-api</ignoredDependency>
                     <ignoredDependency>ch.qos.logback:logback-classic</ignoredDependency>
+                    <ignoredDependency>org.codehaus.groovy:groovy-all</ignoredDependency>
+                    <ignoredDependency>org.codehaus.groovy:groovy</ignoredDependency>
+                    <ignoredDependency>com.athaydes:spock-reports</ignoredDependency>
                   </ignoredDependencies>
                 </configuration>
               </execution>
@@ -1218,6 +1264,10 @@
                 Notice the @ instead of the $ as prefix? That's late evaluation.
               -->
               <argLine>-Xmx256m @{surefireArgLine}</argLine>
+              <includes>
+                <include>**/*Test.java</include>
+                <include>**/*Spec.java</include>
+              </includes>
             </configuration>
           </plugin>