You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cg...@apache.org on 2023/03/19 06:19:12 UTC

[plc4x] 08/08: ALRM, CYC, SZL functionality has been restored for the driver. Missing Alarm ACK and documentation.

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

cgarcia pushed a commit to branch feat/s7ha
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit f3abe2c52e7a06657a2a9b04b0cfe39a8d4c4a3f
Author: César García <ce...@ceos.com.ve>
AuthorDate: Sun Mar 19 02:17:47 2023 -0400

    ALRM, CYC, SZL functionality has been restored for the driver. Missing Alarm ACK and documentation.
---
 .../java/bacnetip/readwrite/BACnetVendorId.java    |   3 +-
 ...dValueType.java => Alarm8MessageQueryType.java} | 138 +--
 ...alueType.java => AssociatedQueryValueType.java} |  60 +-
 .../java/s7/readwrite/AssociatedValueType.java     |   4 +-
 .../java/s7/readwrite/CycServiceItemAnyType.java   | 252 ++++++
 ...UserData.java => CycServiceItemDbReadType.java} | 102 +--
 .../java/s7/readwrite/CycServiceItemType.java      | 192 ++++
 .../apache/plc4x/java/s7/readwrite/EventType.java  |   3 +-
 .../apache/plc4x/java/s7/readwrite/QueryType.java  |   3 +-
 .../S7ParameterUserDataItemCPUFunctions.java       |  16 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarm8.java   |  18 +-
 .../java/s7/readwrite/S7PayloadAlarmAckInd.java    |  18 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarmS.java   |  18 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarmSC.java  |  18 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java  |  18 +-
 .../s7/readwrite/S7PayloadDiagnosticMessage.java   |  17 +-
 .../plc4x/java/s7/readwrite/S7PayloadNotify.java   |  18 +-
 .../plc4x/java/s7/readwrite/S7PayloadNotify8.java  |  18 +-
 .../plc4x/java/s7/readwrite/S7PayloadUserData.java |   5 +
 .../java/s7/readwrite/S7PayloadUserDataItem.java   | 242 +++--
 ...rDataItemCpuFunctionAlarmAckErrorResponse.java} |  57 +-
 ...oadUserDataItemCpuFunctionAlarmAckRequest.java} |  87 +-
 ...oadUserDataItemCpuFunctionAlarmAckResponse.java |  18 +-
 ...S7PayloadUserDataItemCpuFunctionAlarmQuery.java |  18 +-
 ...dUserDataItemCpuFunctionAlarmQueryRequest.java} |  61 +-
 ...dUserDataItemCpuFunctionAlarmQueryResponse.java | 147 +--
 ...loadUserDataItemCpuFunctionMsgSubscription.java |  24 +-
 ...temCpuFunctionMsgSubscriptionAlarmResponse.java |  25 +-
 ...DataItemCpuFunctionMsgSubscriptionRequest.java} |  60 +-
 ...DataItemCpuFunctionMsgSubscriptionResponse.java |  19 +-
 ...aItemCpuFunctionMsgSubscriptionSysResponse.java |  18 +-
 ...erDataItemCpuFunctionReadSzlNoDataRequest.java} |  59 +-
 ...yloadUserDataItemCpuFunctionReadSzlRequest.java |  18 +-
 ...loadUserDataItemCpuFunctionReadSzlResponse.java | 126 +--
 ...serDataItemCyclicServicesChangeDrivenPush.java} | 127 +--
 ...clicServicesChangeDrivenSubscribeResponse.java} | 133 ++-
 ...adUserDataItemCyclicServicesErrorResponse.java} |  57 +-
 ...> S7PayloadUserDataItemCyclicServicesPush.java} | 123 +--
 ...UserDataItemCyclicServicesSubscribeRequest.java | 242 +++++
 ...erDataItemCyclicServicesSubscribeResponse.java} | 125 +--
 ...rDataItemCyclicServicesUnsubscribeRequest.java} | 114 +--
 ...DataItemCyclicServicesUnsubscribeResponse.java} |  57 +-
 .../java/s7/readwrite/S7VarPayloadDataItem.java    |   2 +-
 ...onMsgSubscriptionResponse.java => SubItem.java} | 106 ++-
 .../apache/plc4x/java/s7/readwrite/SzlSublist.java |   1 +
 .../s7/readwrite/{QueryType.java => TimeBase.java} |  16 +-
 .../apache/plc4x/java/s7/events/S7CyclicEvent.java | 607 +++++++++++++
 .../java/s7/readwrite/optimizer/S7Optimizer.java   |   7 +
 .../readwrite/protocol/S7ProtocolEventLogic.java   |  25 +-
 .../s7/readwrite/protocol/S7ProtocolLogic.java     | 998 ++++++++++++++++++---
 .../plc4x/java/s7/readwrite/tag/S7AckTag.java      |  82 ++
 .../java/s7/readwrite/tag/S7PlcTagHandler.java     |   4 +-
 .../java/s7/readwrite/tag/S7SubscriptionTag.java   | 214 ++++-
 .../readwrite/tag/{S7SslTag.java => S7SzlTag.java} |  20 +-
 .../s7/readwrite/types/S7SubscriptionType.java     |   1 +
 .../java/s7/readwrite/utils/StaticHelper.java      |  23 +-
 plc4j/examples/plc4j-s7event/pom.xml               |  10 +
 .../examples/plc4j/s7event/CycSubscription.java    | 127 +++
 .../examples/plc4j/s7event/EventSubscription.java  |  88 +-
 .../plc4x/examples/plc4j/s7event/SzlRequest.java   | 104 +++
 .../s7/src/main/resources/protocols/s7/s7.mspec    | 209 ++++-
 src/site/asciidoc/users/protocols/s7.adoc          | 682 +++++++++++++-
 62 files changed, 4818 insertions(+), 1386 deletions(-)

diff --git a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
index 7fe13e260b..f7b08d59f9 100644
--- a/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
+++ b/plc4j/drivers/bacnet/src/main/generated/org/apache/plc4x/java/bacnetip/readwrite/BACnetVendorId.java
@@ -1615,12 +1615,11 @@ public enum BACnetVendorId {
   THING_WAREHOUSELLC((int) 1404, (int) 1404, (String) "Thing Warehouse LLC"),
   INNOFRIENDS_GMBH((int) 1405, (int) 1405, (String) "Innofriends GmbH"),
   METRONICAKP_SPJ((int) 1406, (int) 1406, (String) "Metronic AKP Sp. J."),
-
   TECHKNAVE((int) 1407, (int) 1407, (String) "Techknave"),
   ELSNER_ELEKTRONIK((int) 1408, (int) 1408, (String) "Elsner Elektronik"),
   LEFOO_INDUSTRIAL_HANGZHOU_CO_LTD(
       (int) 1409, (int) 1409, (String) "LEFOO Industrial (Hangzhou) Co., Ltd."),
-
+  CALIBRATION_TECHNOLOGIES_INC((int) 1410, (int) 1410, (String) "Calibration Technologies, Inc."),
   UNKNOWN_VENDOR((int) 0xFFFF, (int) 0xFFFF, (String) "Unknown");
   private static final Map<Integer, BACnetVendorId> map;
 
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java
similarity index 57%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java
index be0109f5ea..4783b3b23b 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java
@@ -35,24 +35,38 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class AssociatedValueType implements Message {
+public class Alarm8MessageQueryType implements Message {
 
   // Properties.
+  protected final short functionId;
+  protected final short numberOfObjects;
   protected final DataTransportErrorCode returnCode;
   protected final DataTransportSize transportSize;
-  protected final int valueLength;
-  protected final List<Short> data;
+  protected final int byteCount;
+  protected final List<AlarmMessageObjectQueryType> messageObjects;
 
-  public AssociatedValueType(
+  public Alarm8MessageQueryType(
+      short functionId,
+      short numberOfObjects,
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      int valueLength,
-      List<Short> data) {
+      int byteCount,
+      List<AlarmMessageObjectQueryType> messageObjects) {
     super();
+    this.functionId = functionId;
+    this.numberOfObjects = numberOfObjects;
     this.returnCode = returnCode;
     this.transportSize = transportSize;
-    this.valueLength = valueLength;
-    this.data = data;
+    this.byteCount = byteCount;
+    this.messageObjects = messageObjects;
+  }
+
+  public short getFunctionId() {
+    return functionId;
+  }
+
+  public short getNumberOfObjects() {
+    return numberOfObjects;
   }
 
   public DataTransportErrorCode getReturnCode() {
@@ -63,19 +77,25 @@ public class AssociatedValueType implements Message {
     return transportSize;
   }
 
-  public int getValueLength() {
-    return valueLength;
+  public int getByteCount() {
+    return byteCount;
   }
 
-  public List<Short> getData() {
-    return data;
+  public List<AlarmMessageObjectQueryType> getMessageObjects() {
+    return messageObjects;
   }
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("AssociatedValueType");
+    writeBuffer.pushContext("Alarm8MessageQueryType");
+
+    // Simple Field (functionId)
+    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (numberOfObjects)
+    writeSimpleField("numberOfObjects", numberOfObjects, writeUnsignedShort(writeBuffer, 8));
 
     // Simple Field (returnCode)
     writeSimpleEnumField(
@@ -97,18 +117,13 @@ public class AssociatedValueType implements Message {
             DataTransportSize::name,
             writeUnsignedShort(writeBuffer, 8)));
 
-    // Manual Field (valueLength)
-    writeManualField(
-        "valueLength",
-        () ->
-            org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.LeftShift3(
-                writeBuffer, valueLength),
-        writeBuffer);
+    // Simple Field (byteCount)
+    writeSimpleField("byteCount", byteCount, writeUnsignedInt(writeBuffer, 16));
 
-    // Array Field (data)
-    writeSimpleTypeArrayField("data", data, writeUnsignedShort(writeBuffer, 8));
+    // Array Field (messageObjects)
+    writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
 
-    writeBuffer.popContext("AssociatedValueType");
+    writeBuffer.popContext("Alarm8MessageQueryType");
   }
 
   @Override
@@ -119,39 +134,53 @@ public class AssociatedValueType implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    AssociatedValueType _value = this;
+    Alarm8MessageQueryType _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
+    // Simple field (functionId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfObjects)
+    lengthInBits += 8;
+
     // Simple field (returnCode)
     lengthInBits += 8;
 
     // Simple field (transportSize)
     lengthInBits += 8;
 
-    // Manual Field (valueLength)
+    // Simple field (byteCount)
     lengthInBits += 16;
 
     // Array field
-    if (data != null) {
-      lengthInBits += 8 * data.size();
+    if (messageObjects != null) {
+      int i = 0;
+      for (AlarmMessageObjectQueryType element : messageObjects) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= messageObjects.size());
+        lengthInBits += element.getLengthInBits();
+      }
     }
 
     return lengthInBits;
   }
 
-  public static AssociatedValueType staticParse(ReadBuffer readBuffer, Object... args)
+  public static Alarm8MessageQueryType staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static AssociatedValueType staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("AssociatedValueType");
+  public static Alarm8MessageQueryType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("Alarm8MessageQueryType");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
+    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+
+    short numberOfObjects = readSimpleField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+
     DataTransportErrorCode returnCode =
         readEnumField(
             "returnCode",
@@ -166,27 +195,22 @@ public class AssociatedValueType implements Message {
             new DataReaderEnumDefault<>(
                 DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
 
-    int valueLength =
-        readManualField(
-            "valueLength",
-            readBuffer,
-            () ->
-                (int)
-                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.RightShift3(
-                        readBuffer)));
+    int byteCount = readSimpleField("byteCount", readUnsignedInt(readBuffer, 16));
 
-    List<Short> data =
+    List<AlarmMessageObjectQueryType> messageObjects =
         readCountArrayField(
-            "data",
-            readUnsignedShort(readBuffer, 8),
-            org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.EventItemLength(
-                readBuffer, valueLength));
+            "messageObjects",
+            new DataReaderComplexDefault<>(
+                () -> AlarmMessageObjectQueryType.staticParse(readBuffer), readBuffer),
+            (byteCount) / (12));
 
-    readBuffer.closeContext("AssociatedValueType");
+    readBuffer.closeContext("Alarm8MessageQueryType");
     // Create the instance
-    AssociatedValueType _associatedValueType;
-    _associatedValueType = new AssociatedValueType(returnCode, transportSize, valueLength, data);
-    return _associatedValueType;
+    Alarm8MessageQueryType _alarm8MessageQueryType;
+    _alarm8MessageQueryType =
+        new Alarm8MessageQueryType(
+            functionId, numberOfObjects, returnCode, transportSize, byteCount, messageObjects);
+    return _alarm8MessageQueryType;
   }
 
   @Override
@@ -194,20 +218,28 @@ public class AssociatedValueType implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof AssociatedValueType)) {
+    if (!(o instanceof Alarm8MessageQueryType)) {
       return false;
     }
-    AssociatedValueType that = (AssociatedValueType) o;
-    return (getReturnCode() == that.getReturnCode())
+    Alarm8MessageQueryType that = (Alarm8MessageQueryType) o;
+    return (getFunctionId() == that.getFunctionId())
+        && (getNumberOfObjects() == that.getNumberOfObjects())
+        && (getReturnCode() == that.getReturnCode())
         && (getTransportSize() == that.getTransportSize())
-        && (getValueLength() == that.getValueLength())
-        && (getData() == that.getData())
+        && (getByteCount() == that.getByteCount())
+        && (getMessageObjects() == that.getMessageObjects())
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(getReturnCode(), getTransportSize(), getValueLength(), getData());
+    return Objects.hash(
+        getFunctionId(),
+        getNumberOfObjects(),
+        getReturnCode(),
+        getTransportSize(),
+        getByteCount(),
+        getMessageObjects());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
similarity index 77%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
index be0109f5ea..035fc29fea 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
@@ -35,7 +35,7 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class AssociatedValueType implements Message {
+public class AssociatedQueryValueType implements Message {
 
   // Properties.
   protected final DataTransportErrorCode returnCode;
@@ -43,7 +43,7 @@ public class AssociatedValueType implements Message {
   protected final int valueLength;
   protected final List<Short> data;
 
-  public AssociatedValueType(
+  public AssociatedQueryValueType(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
       int valueLength,
@@ -75,7 +75,7 @@ public class AssociatedValueType implements Message {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("AssociatedValueType");
+    writeBuffer.pushContext("AssociatedQueryValueType");
 
     // Simple Field (returnCode)
     writeSimpleEnumField(
@@ -97,18 +97,13 @@ public class AssociatedValueType implements Message {
             DataTransportSize::name,
             writeUnsignedShort(writeBuffer, 8)));
 
-    // Manual Field (valueLength)
-    writeManualField(
-        "valueLength",
-        () ->
-            org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.LeftShift3(
-                writeBuffer, valueLength),
-        writeBuffer);
+    // Simple Field (valueLength)
+    writeSimpleField("valueLength", valueLength, writeUnsignedInt(writeBuffer, 16));
 
     // Array Field (data)
     writeSimpleTypeArrayField("data", data, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("AssociatedValueType");
+    writeBuffer.popContext("AssociatedQueryValueType");
   }
 
   @Override
@@ -119,7 +114,7 @@ public class AssociatedValueType implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    AssociatedValueType _value = this;
+    AssociatedQueryValueType _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (returnCode)
@@ -128,7 +123,7 @@ public class AssociatedValueType implements Message {
     // Simple field (transportSize)
     lengthInBits += 8;
 
-    // Manual Field (valueLength)
+    // Simple field (valueLength)
     lengthInBits += 16;
 
     // Array field
@@ -139,14 +134,14 @@ public class AssociatedValueType implements Message {
     return lengthInBits;
   }
 
-  public static AssociatedValueType staticParse(ReadBuffer readBuffer, Object... args)
+  public static AssociatedQueryValueType staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static AssociatedValueType staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("AssociatedValueType");
+  public static AssociatedQueryValueType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AssociatedQueryValueType");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
@@ -166,27 +161,16 @@ public class AssociatedValueType implements Message {
             new DataReaderEnumDefault<>(
                 DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
 
-    int valueLength =
-        readManualField(
-            "valueLength",
-            readBuffer,
-            () ->
-                (int)
-                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.RightShift3(
-                        readBuffer)));
-
-    List<Short> data =
-        readCountArrayField(
-            "data",
-            readUnsignedShort(readBuffer, 8),
-            org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.EventItemLength(
-                readBuffer, valueLength));
-
-    readBuffer.closeContext("AssociatedValueType");
+    int valueLength = readSimpleField("valueLength", readUnsignedInt(readBuffer, 16));
+
+    List<Short> data = readCountArrayField("data", readUnsignedShort(readBuffer, 8), valueLength);
+
+    readBuffer.closeContext("AssociatedQueryValueType");
     // Create the instance
-    AssociatedValueType _associatedValueType;
-    _associatedValueType = new AssociatedValueType(returnCode, transportSize, valueLength, data);
-    return _associatedValueType;
+    AssociatedQueryValueType _associatedQueryValueType;
+    _associatedQueryValueType =
+        new AssociatedQueryValueType(returnCode, transportSize, valueLength, data);
+    return _associatedQueryValueType;
   }
 
   @Override
@@ -194,10 +178,10 @@ public class AssociatedValueType implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof AssociatedValueType)) {
+    if (!(o instanceof AssociatedQueryValueType)) {
       return false;
     }
-    AssociatedValueType that = (AssociatedValueType) o;
+    AssociatedQueryValueType that = (AssociatedQueryValueType) o;
     return (getReturnCode() == that.getReturnCode())
         && (getTransportSize() == that.getTransportSize())
         && (getValueLength() == that.getValueLength())
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
index be0109f5ea..8b09036137 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
@@ -129,7 +129,7 @@ public class AssociatedValueType implements Message {
     lengthInBits += 8;
 
     // Manual Field (valueLength)
-    lengthInBits += 16;
+    lengthInBits += 2;
 
     // Array field
     if (data != null) {
@@ -173,7 +173,7 @@ public class AssociatedValueType implements Message {
             () ->
                 (int)
                     (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.RightShift3(
-                        readBuffer)));
+                        readBuffer, transportSize)));
 
     List<Short> data =
         readCountArrayField(
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java
new file mode 100644
index 0000000000..82cfa394db
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java
@@ -0,0 +1,252 @@
+/*
+ * 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
+ *
+ *   https://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.s7.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CycServiceItemAnyType extends CycServiceItemType implements Message {
+
+  // Accessors for discriminator values.
+
+  // Properties.
+  protected final TransportSize transportSize;
+  protected final int length;
+  protected final int dbNumber;
+  protected final MemoryArea memoryArea;
+  protected final long address;
+
+  public CycServiceItemAnyType(
+      short byteLength,
+      short syntaxId,
+      TransportSize transportSize,
+      int length,
+      int dbNumber,
+      MemoryArea memoryArea,
+      long address) {
+    super(byteLength, syntaxId);
+    this.transportSize = transportSize;
+    this.length = length;
+    this.dbNumber = dbNumber;
+    this.memoryArea = memoryArea;
+    this.address = address;
+  }
+
+  public TransportSize getTransportSize() {
+    return transportSize;
+  }
+
+  public int getLength() {
+    return length;
+  }
+
+  public int getDbNumber() {
+    return dbNumber;
+  }
+
+  public MemoryArea getMemoryArea() {
+    return memoryArea;
+  }
+
+  public long getAddress() {
+    return address;
+  }
+
+  @Override
+  protected void serializeCycServiceItemTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CycServiceItemAnyType");
+
+    // Simple Field (transportSize)
+    writeSimpleEnumField(
+        "transportSize",
+        "TransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            TransportSize::getValue, TransportSize::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (length)
+    writeSimpleField("length", length, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (dbNumber)
+    writeSimpleField("dbNumber", dbNumber, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (memoryArea)
+    writeSimpleEnumField(
+        "memoryArea",
+        "MemoryArea",
+        memoryArea,
+        new DataWriterEnumDefault<>(
+            MemoryArea::getValue, MemoryArea::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (address)
+    writeSimpleField("address", address, writeUnsignedLong(writeBuffer, 24));
+
+    writeBuffer.popContext("CycServiceItemAnyType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CycServiceItemAnyType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (transportSize)
+    lengthInBits += 8;
+
+    // Simple field (length)
+    lengthInBits += 16;
+
+    // Simple field (dbNumber)
+    lengthInBits += 16;
+
+    // Simple field (memoryArea)
+    lengthInBits += 8;
+
+    // Simple field (address)
+    lengthInBits += 24;
+
+    return lengthInBits;
+  }
+
+  public static CycServiceItemTypeBuilder staticParseCycServiceItemTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("CycServiceItemAnyType");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    TransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "TransportSize",
+            new DataReaderEnumDefault<>(
+                TransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    int length = readSimpleField("length", readUnsignedInt(readBuffer, 16));
+
+    int dbNumber = readSimpleField("dbNumber", readUnsignedInt(readBuffer, 16));
+
+    MemoryArea memoryArea =
+        readEnumField(
+            "memoryArea",
+            "MemoryArea",
+            new DataReaderEnumDefault<>(
+                MemoryArea::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    long address = readSimpleField("address", readUnsignedLong(readBuffer, 24));
+
+    readBuffer.closeContext("CycServiceItemAnyType");
+    // Create the instance
+    return new CycServiceItemAnyTypeBuilderImpl(
+        transportSize, length, dbNumber, memoryArea, address);
+  }
+
+  public static class CycServiceItemAnyTypeBuilderImpl
+      implements CycServiceItemType.CycServiceItemTypeBuilder {
+    private final TransportSize transportSize;
+    private final int length;
+    private final int dbNumber;
+    private final MemoryArea memoryArea;
+    private final long address;
+
+    public CycServiceItemAnyTypeBuilderImpl(
+        TransportSize transportSize,
+        int length,
+        int dbNumber,
+        MemoryArea memoryArea,
+        long address) {
+      this.transportSize = transportSize;
+      this.length = length;
+      this.dbNumber = dbNumber;
+      this.memoryArea = memoryArea;
+      this.address = address;
+    }
+
+    public CycServiceItemAnyType build(short byteLength, short syntaxId) {
+      CycServiceItemAnyType cycServiceItemAnyType =
+          new CycServiceItemAnyType(
+              byteLength, syntaxId, transportSize, length, dbNumber, memoryArea, address);
+      return cycServiceItemAnyType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CycServiceItemAnyType)) {
+      return false;
+    }
+    CycServiceItemAnyType that = (CycServiceItemAnyType) o;
+    return (getTransportSize() == that.getTransportSize())
+        && (getLength() == that.getLength())
+        && (getDbNumber() == that.getDbNumber())
+        && (getMemoryArea() == that.getMemoryArea())
+        && (getAddress() == that.getAddress())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getTransportSize(),
+        getLength(),
+        getDbNumber(),
+        getMemoryArea(),
+        getAddress());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
similarity index 57%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
index ec92892504..c2ca696f02 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
@@ -35,40 +35,44 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserData extends S7Payload implements Message {
+public class CycServiceItemDbReadType extends CycServiceItemType implements Message {
 
   // Accessors for discriminator values.
-  public Short getParameterParameterType() {
-    return (short) 0x00;
-  }
-
-  public Short getMessageType() {
-    return (short) 0x07;
-  }
 
   // Properties.
-  protected final List<S7PayloadUserDataItem> items;
+  protected final short numberOfAreas;
+  protected final List<SubItem> items;
 
-  public S7PayloadUserData(List<S7PayloadUserDataItem> items) {
-    super();
+  public CycServiceItemDbReadType(
+      short byteLength, short syntaxId, short numberOfAreas, List<SubItem> items) {
+    super(byteLength, syntaxId);
+    this.numberOfAreas = numberOfAreas;
     this.items = items;
   }
 
-  public List<S7PayloadUserDataItem> getItems() {
+  public short getNumberOfAreas() {
+    return numberOfAreas;
+  }
+
+  public List<SubItem> getItems() {
     return items;
   }
 
   @Override
-  protected void serializeS7PayloadChild(WriteBuffer writeBuffer) throws SerializationException {
+  protected void serializeCycServiceItemTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserData");
+    writeBuffer.pushContext("CycServiceItemDbReadType");
+
+    // Simple Field (numberOfAreas)
+    writeSimpleField("numberOfAreas", numberOfAreas, writeUnsignedShort(writeBuffer, 8));
 
     // Array Field (items)
     writeComplexTypeArrayField("items", items, writeBuffer);
 
-    writeBuffer.popContext("S7PayloadUserData");
+    writeBuffer.popContext("CycServiceItemDbReadType");
   }
 
   @Override
@@ -79,13 +83,16 @@ public class S7PayloadUserData extends S7Payload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserData _value = this;
+    CycServiceItemDbReadType _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
+    // Simple field (numberOfAreas)
+    lengthInBits += 8;
+
     // Array field
     if (items != null) {
       int i = 0;
-      for (S7PayloadUserDataItem element : items) {
+      for (SubItem element : items) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= items.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -94,49 +101,41 @@ public class S7PayloadUserData extends S7Payload implements Message {
     return lengthInBits;
   }
 
-  public static S7PayloadBuilder staticParseS7PayloadBuilder(
-      ReadBuffer readBuffer, Short messageType, S7Parameter parameter) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserData");
+  public static CycServiceItemTypeBuilder staticParseCycServiceItemTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("CycServiceItemDbReadType");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    List<S7PayloadUserDataItem> items =
+    short numberOfAreas = readSimpleField("numberOfAreas", readUnsignedShort(readBuffer, 8));
+
+    List<SubItem> items =
         readCountArrayField(
             "items",
-            new DataReaderComplexDefault<>(
-                () ->
-                    S7PayloadUserDataItem.staticParse(
-                        readBuffer,
-                        (byte)
-                            (CAST(
-                                    CAST(parameter, S7ParameterUserData.class).getItems().get(0),
-                                    S7ParameterUserDataItemCPUFunctions.class)
-                                .getCpuFunctionType()),
-                        (short)
-                            (CAST(
-                                    CAST(parameter, S7ParameterUserData.class).getItems().get(0),
-                                    S7ParameterUserDataItemCPUFunctions.class)
-                                .getCpuSubfunction())),
-                readBuffer),
-            COUNT(CAST(parameter, S7ParameterUserData.class).getItems()));
-
-    readBuffer.closeContext("S7PayloadUserData");
+            new DataReaderComplexDefault<>(() -> SubItem.staticParse(readBuffer), readBuffer),
+            numberOfAreas);
+
+    readBuffer.closeContext("CycServiceItemDbReadType");
     // Create the instance
-    return new S7PayloadUserDataBuilderImpl(items);
+    return new CycServiceItemDbReadTypeBuilderImpl(numberOfAreas, items);
   }
 
-  public static class S7PayloadUserDataBuilderImpl implements S7Payload.S7PayloadBuilder {
-    private final List<S7PayloadUserDataItem> items;
+  public static class CycServiceItemDbReadTypeBuilderImpl
+      implements CycServiceItemType.CycServiceItemTypeBuilder {
+    private final short numberOfAreas;
+    private final List<SubItem> items;
 
-    public S7PayloadUserDataBuilderImpl(List<S7PayloadUserDataItem> items) {
+    public CycServiceItemDbReadTypeBuilderImpl(short numberOfAreas, List<SubItem> items) {
+      this.numberOfAreas = numberOfAreas;
       this.items = items;
     }
 
-    public S7PayloadUserData build() {
-      S7PayloadUserData s7PayloadUserData = new S7PayloadUserData(items);
-      return s7PayloadUserData;
+    public CycServiceItemDbReadType build(short byteLength, short syntaxId) {
+      CycServiceItemDbReadType cycServiceItemDbReadType =
+          new CycServiceItemDbReadType(byteLength, syntaxId, numberOfAreas, items);
+      return cycServiceItemDbReadType;
     }
   }
 
@@ -145,16 +144,19 @@ public class S7PayloadUserData extends S7Payload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserData)) {
+    if (!(o instanceof CycServiceItemDbReadType)) {
       return false;
     }
-    S7PayloadUserData that = (S7PayloadUserData) o;
-    return (getItems() == that.getItems()) && super.equals(that) && true;
+    CycServiceItemDbReadType that = (CycServiceItemDbReadType) o;
+    return (getNumberOfAreas() == that.getNumberOfAreas())
+        && (getItems() == that.getItems())
+        && super.equals(that)
+        && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getItems());
+    return Objects.hash(super.hashCode(), getNumberOfAreas(), getItems());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java
new file mode 100644
index 0000000000..c7c6af1d4e
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java
@@ -0,0 +1,192 @@
+/*
+ * 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
+ *
+ *   https://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.s7.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public abstract class CycServiceItemType implements Message {
+
+  // Abstract accessors for discriminator values.
+
+  // Constant values.
+  public static final Short FUNCTIONID = 0x12;
+
+  // Properties.
+  protected final short byteLength;
+  protected final short syntaxId;
+
+  public CycServiceItemType(short byteLength, short syntaxId) {
+    super();
+    this.byteLength = byteLength;
+    this.syntaxId = syntaxId;
+  }
+
+  public short getByteLength() {
+    return byteLength;
+  }
+
+  public short getSyntaxId() {
+    return syntaxId;
+  }
+
+  public short getFunctionId() {
+    return FUNCTIONID;
+  }
+
+  protected abstract void serializeCycServiceItemTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CycServiceItemType");
+
+    // Const Field (functionId)
+    writeConstField("functionId", FUNCTIONID, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (byteLength)
+    writeSimpleField("byteLength", byteLength, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (syntaxId)
+    writeSimpleField("syntaxId", syntaxId, writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeCycServiceItemTypeChild(writeBuffer);
+
+    writeBuffer.popContext("CycServiceItemType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    CycServiceItemType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (functionId)
+    lengthInBits += 8;
+
+    // Simple field (byteLength)
+    lengthInBits += 8;
+
+    // Simple field (syntaxId)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static CycServiceItemType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static CycServiceItemType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("CycServiceItemType");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short functionId =
+        readConstField(
+            "functionId", readUnsignedShort(readBuffer, 8), CycServiceItemType.FUNCTIONID);
+
+    short byteLength = readSimpleField("byteLength", readUnsignedShort(readBuffer, 8));
+
+    short syntaxId = readSimpleField("syntaxId", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    CycServiceItemTypeBuilder builder = null;
+    if (EvaluationHelper.equals(syntaxId, (short) 0x10)) {
+      builder = CycServiceItemAnyType.staticParseCycServiceItemTypeBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(syntaxId, (short) 0xb0)) {
+      builder = CycServiceItemDbReadType.staticParseCycServiceItemTypeBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "syntaxId="
+              + syntaxId
+              + "]");
+    }
+
+    readBuffer.closeContext("CycServiceItemType");
+    // Create the instance
+    CycServiceItemType _cycServiceItemType = builder.build(byteLength, syntaxId);
+    return _cycServiceItemType;
+  }
+
+  public interface CycServiceItemTypeBuilder {
+    CycServiceItemType build(short byteLength, short syntaxId);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CycServiceItemType)) {
+      return false;
+    }
+    CycServiceItemType that = (CycServiceItemType) o;
+    return (getByteLength() == that.getByteLength())
+        && (getSyntaxId() == that.getSyntaxId())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getByteLength(), getSyntaxId());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java
index 102463f090..1d9931cc3e 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java
@@ -27,7 +27,8 @@ public enum EventType {
   MODE((short) 0x01),
   SYS((short) 0x02),
   USR((short) 0x04),
-  ALM((short) 0x80);
+  ALM((short) 0x80),
+  CYC((short) 0x69);
   private static final Map<Short, EventType> map;
 
   static {
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
index 1cf788f756..7a6eaf3204 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
@@ -26,7 +26,8 @@ import java.util.Map;
 public enum QueryType {
   BYALARMTYPE((short) 0x01),
   ALARM_8((short) 0x02),
-  ALARM_S((short) 0x04);
+  ALARM_S((short) 0x04),
+  ALARM_8P((short) 0x09);
   private static final Map<Short, QueryType> map;
 
   static {
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java
index f86c2cde64..03c8bafb7c 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java
@@ -215,14 +215,24 @@ public class S7ParameterUserDataItemCPUFunctions extends S7ParameterUserDataItem
 
     Short dataUnitReferenceNumber =
         readOptionalField(
-            "dataUnitReferenceNumber", readUnsignedShort(readBuffer, 8), (cpuFunctionType) == (8));
+            "dataUnitReferenceNumber",
+            readUnsignedShort(readBuffer, 8),
+            (((cpuFunctionType) == (8)))
+                || (((((cpuFunctionType) == (0))) && (((cpuFunctionGroup) == (2))))));
 
     Short lastDataUnit =
         readOptionalField(
-            "lastDataUnit", readUnsignedShort(readBuffer, 8), (cpuFunctionType) == (8));
+            "lastDataUnit",
+            readUnsignedShort(readBuffer, 8),
+            (((cpuFunctionType) == (8)))
+                || (((((cpuFunctionType) == (0))) && (((cpuFunctionGroup) == (2))))));
 
     Integer errorCode =
-        readOptionalField("errorCode", readUnsignedInt(readBuffer, 16), (cpuFunctionType) == (8));
+        readOptionalField(
+            "errorCode",
+            readUnsignedInt(readBuffer, 16),
+            (((cpuFunctionType) == (8)))
+                || (((((cpuFunctionType) == (0))) && (((cpuFunctionGroup) == (2))))));
 
     readBuffer.closeContext("S7ParameterUserDataItemCPUFunctions");
     // Create the instance
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java
index 5b6ef1f7db..d7369d05c5 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadAlarm8 extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,18 +50,15 @@ public class S7PayloadAlarm8 extends S7PayloadUserDataItem implements Message {
     return (short) 0x05;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final AlarmMessagePushType alarmMessage;
 
   public S7PayloadAlarm8(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       AlarmMessagePushType alarmMessage) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.alarmMessage = alarmMessage;
   }
 
@@ -97,7 +98,8 @@ public class S7PayloadAlarm8 extends S7PayloadUserDataItem implements Message {
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadAlarm8");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -124,9 +126,9 @@ public class S7PayloadAlarm8 extends S7PayloadUserDataItem implements Message {
     }
 
     public S7PayloadAlarm8 build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadAlarm8 s7PayloadAlarm8 =
-          new S7PayloadAlarm8(returnCode, transportSize, alarmMessage);
+          new S7PayloadAlarm8(returnCode, transportSize, dataLength, alarmMessage);
       return s7PayloadAlarm8;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java
index e167689c0c..1d0300ffa0 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadAlarmAckInd extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,18 +50,15 @@ public class S7PayloadAlarmAckInd extends S7PayloadUserDataItem implements Messa
     return (short) 0x0c;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final AlarmMessageAckPushType alarmMessage;
 
   public S7PayloadAlarmAckInd(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       AlarmMessageAckPushType alarmMessage) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.alarmMessage = alarmMessage;
   }
 
@@ -97,7 +98,8 @@ public class S7PayloadAlarmAckInd extends S7PayloadUserDataItem implements Messa
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadAlarmAckInd");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -124,9 +126,9 @@ public class S7PayloadAlarmAckInd extends S7PayloadUserDataItem implements Messa
     }
 
     public S7PayloadAlarmAckInd build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadAlarmAckInd s7PayloadAlarmAckInd =
-          new S7PayloadAlarmAckInd(returnCode, transportSize, alarmMessage);
+          new S7PayloadAlarmAckInd(returnCode, transportSize, dataLength, alarmMessage);
       return s7PayloadAlarmAckInd;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java
index 3a82298188..e589cd98c4 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadAlarmS extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,18 +50,15 @@ public class S7PayloadAlarmS extends S7PayloadUserDataItem implements Message {
     return (short) 0x12;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final AlarmMessagePushType alarmMessage;
 
   public S7PayloadAlarmS(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       AlarmMessagePushType alarmMessage) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.alarmMessage = alarmMessage;
   }
 
@@ -97,7 +98,8 @@ public class S7PayloadAlarmS extends S7PayloadUserDataItem implements Message {
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadAlarmS");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -124,9 +126,9 @@ public class S7PayloadAlarmS extends S7PayloadUserDataItem implements Message {
     }
 
     public S7PayloadAlarmS build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadAlarmS s7PayloadAlarmS =
-          new S7PayloadAlarmS(returnCode, transportSize, alarmMessage);
+          new S7PayloadAlarmS(returnCode, transportSize, dataLength, alarmMessage);
       return s7PayloadAlarmS;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java
index eef91899c3..a37b06e484 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadAlarmSC extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,18 +50,15 @@ public class S7PayloadAlarmSC extends S7PayloadUserDataItem implements Message {
     return (short) 0x13;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final AlarmMessagePushType alarmMessage;
 
   public S7PayloadAlarmSC(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       AlarmMessagePushType alarmMessage) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.alarmMessage = alarmMessage;
   }
 
@@ -97,7 +98,8 @@ public class S7PayloadAlarmSC extends S7PayloadUserDataItem implements Message {
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadAlarmSC");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -124,9 +126,9 @@ public class S7PayloadAlarmSC extends S7PayloadUserDataItem implements Message {
     }
 
     public S7PayloadAlarmSC build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadAlarmSC s7PayloadAlarmSC =
-          new S7PayloadAlarmSC(returnCode, transportSize, alarmMessage);
+          new S7PayloadAlarmSC(returnCode, transportSize, dataLength, alarmMessage);
       return s7PayloadAlarmSC;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java
index 6d7d4951ea..e69cd518f2 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadAlarmSQ extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,18 +50,15 @@ public class S7PayloadAlarmSQ extends S7PayloadUserDataItem implements Message {
     return (short) 0x11;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final AlarmMessagePushType alarmMessage;
 
   public S7PayloadAlarmSQ(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       AlarmMessagePushType alarmMessage) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.alarmMessage = alarmMessage;
   }
 
@@ -97,7 +98,8 @@ public class S7PayloadAlarmSQ extends S7PayloadUserDataItem implements Message {
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadAlarmSQ");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -124,9 +126,9 @@ public class S7PayloadAlarmSQ extends S7PayloadUserDataItem implements Message {
     }
 
     public S7PayloadAlarmSQ build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadAlarmSQ s7PayloadAlarmSQ =
-          new S7PayloadAlarmSQ(returnCode, transportSize, alarmMessage);
+          new S7PayloadAlarmSQ(returnCode, transportSize, dataLength, alarmMessage);
       return s7PayloadAlarmSQ;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java
index 648a25423e..b9392871ab 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadDiagnosticMessage extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,10 +50,6 @@ public class S7PayloadDiagnosticMessage extends S7PayloadUserDataItem implements
     return (short) 0x03;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final int EventId;
   protected final short PriorityClass;
@@ -62,6 +62,7 @@ public class S7PayloadDiagnosticMessage extends S7PayloadUserDataItem implements
   public S7PayloadDiagnosticMessage(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       int EventId,
       short PriorityClass,
       short ObNumber,
@@ -69,7 +70,7 @@ public class S7PayloadDiagnosticMessage extends S7PayloadUserDataItem implements
       int Info1,
       long Info2,
       DateAndTime TimeStamp) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.EventId = EventId;
     this.PriorityClass = PriorityClass;
     this.ObNumber = ObNumber;
@@ -175,7 +176,8 @@ public class S7PayloadDiagnosticMessage extends S7PayloadUserDataItem implements
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadDiagnosticMessage");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -233,11 +235,12 @@ public class S7PayloadDiagnosticMessage extends S7PayloadUserDataItem implements
     }
 
     public S7PayloadDiagnosticMessage build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadDiagnosticMessage s7PayloadDiagnosticMessage =
           new S7PayloadDiagnosticMessage(
               returnCode,
               transportSize,
+              dataLength,
               EventId,
               PriorityClass,
               ObNumber,
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java
index 423667a194..7bcdc3efd5 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadNotify extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,18 +50,15 @@ public class S7PayloadNotify extends S7PayloadUserDataItem implements Message {
     return (short) 0x06;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final AlarmMessagePushType alarmMessage;
 
   public S7PayloadNotify(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       AlarmMessagePushType alarmMessage) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.alarmMessage = alarmMessage;
   }
 
@@ -97,7 +98,8 @@ public class S7PayloadNotify extends S7PayloadUserDataItem implements Message {
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadNotify");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -124,9 +126,9 @@ public class S7PayloadNotify extends S7PayloadUserDataItem implements Message {
     }
 
     public S7PayloadNotify build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadNotify s7PayloadNotify =
-          new S7PayloadNotify(returnCode, transportSize, alarmMessage);
+          new S7PayloadNotify(returnCode, transportSize, dataLength, alarmMessage);
       return s7PayloadNotify;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java
index 453ec32b77..43960bb4a8 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java
@@ -38,6 +38,10 @@ import org.apache.plc4x.java.spi.generation.*;
 public class S7PayloadNotify8 extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x00;
   }
@@ -46,18 +50,15 @@ public class S7PayloadNotify8 extends S7PayloadUserDataItem implements Message {
     return (short) 0x16;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final AlarmMessagePushType alarmMessage;
 
   public S7PayloadNotify8(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       AlarmMessagePushType alarmMessage) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.alarmMessage = alarmMessage;
   }
 
@@ -97,7 +98,8 @@ public class S7PayloadNotify8 extends S7PayloadUserDataItem implements Message {
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadNotify8");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -124,9 +126,9 @@ public class S7PayloadNotify8 extends S7PayloadUserDataItem implements Message {
     }
 
     public S7PayloadNotify8 build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadNotify8 s7PayloadNotify8 =
-          new S7PayloadNotify8(returnCode, transportSize, alarmMessage);
+          new S7PayloadNotify8(returnCode, transportSize, dataLength, alarmMessage);
       return s7PayloadNotify8;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
index ec92892504..39b3de767c 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
@@ -109,6 +109,11 @@ public class S7PayloadUserData extends S7Payload implements Message {
                 () ->
                     S7PayloadUserDataItem.staticParse(
                         readBuffer,
+                        (byte)
+                            (CAST(
+                                    CAST(parameter, S7ParameterUserData.class).getItems().get(0),
+                                    S7ParameterUserDataItemCPUFunctions.class)
+                                .getCpuFunctionGroup()),
                         (byte)
                             (CAST(
                                     CAST(parameter, S7ParameterUserData.class).getItems().get(0),
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java
index 71eb82b2f8..b66f98148d 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java
@@ -38,20 +38,23 @@ import org.apache.plc4x.java.spi.generation.*;
 public abstract class S7PayloadUserDataItem implements Message {
 
   // Abstract accessors for discriminator values.
+  public abstract Byte getCpuFunctionGroup();
+
   public abstract Byte getCpuFunctionType();
 
   public abstract Short getCpuSubfunction();
 
-  public abstract Integer getDataLength();
-
   // Properties.
   protected final DataTransportErrorCode returnCode;
   protected final DataTransportSize transportSize;
+  protected final int dataLength;
 
-  public S7PayloadUserDataItem(DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+  public S7PayloadUserDataItem(
+      DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
     super();
     this.returnCode = returnCode;
     this.transportSize = transportSize;
+    this.dataLength = dataLength;
   }
 
   public DataTransportErrorCode getReturnCode() {
@@ -62,6 +65,10 @@ public abstract class S7PayloadUserDataItem implements Message {
     return transportSize;
   }
 
+  public int getDataLength() {
+    return dataLength;
+  }
+
   protected abstract void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer)
       throws SerializationException;
 
@@ -91,10 +98,8 @@ public abstract class S7PayloadUserDataItem implements Message {
             DataTransportSize::name,
             writeUnsignedShort(writeBuffer, 8)));
 
-    // Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly
-    // given by the objects content)
-    int dataLength = (int) ((getLengthInBytes()) - (4));
-    writeImplicitField("dataLength", dataLength, writeUnsignedInt(writeBuffer, 16));
+    // Simple Field (dataLength)
+    writeSimpleField("dataLength", dataLength, writeUnsignedInt(writeBuffer, 16));
 
     // Switch field (Serialize the sub-type)
     serializeS7PayloadUserDataItemChild(writeBuffer);
@@ -119,7 +124,7 @@ public abstract class S7PayloadUserDataItem implements Message {
     // Simple field (transportSize)
     lengthInBits += 8;
 
-    // Implicit Field (dataLength)
+    // Simple field (dataLength)
     lengthInBits += 16;
 
     // Length of sub-type elements will be added by sub-type...
@@ -130,35 +135,46 @@ public abstract class S7PayloadUserDataItem implements Message {
   public static S7PayloadUserDataItem staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
-    if ((args == null) || (args.length != 2)) {
+    if ((args == null) || (args.length != 3)) {
       throw new PlcRuntimeException(
-          "Wrong number of arguments, expected 2, but got " + args.length);
+          "Wrong number of arguments, expected 3, but got " + args.length);
     }
-    Byte cpuFunctionType;
+    Byte cpuFunctionGroup;
     if (args[0] instanceof Byte) {
-      cpuFunctionType = (Byte) args[0];
+      cpuFunctionGroup = (Byte) args[0];
     } else if (args[0] instanceof String) {
-      cpuFunctionType = Byte.valueOf((String) args[0]);
+      cpuFunctionGroup = Byte.valueOf((String) args[0]);
     } else {
       throw new PlcRuntimeException(
           "Argument 0 expected to be of type Byte or a string which is parseable but was "
               + args[0].getClass().getName());
     }
-    Short cpuSubfunction;
-    if (args[1] instanceof Short) {
-      cpuSubfunction = (Short) args[1];
+    Byte cpuFunctionType;
+    if (args[1] instanceof Byte) {
+      cpuFunctionType = (Byte) args[1];
     } else if (args[1] instanceof String) {
-      cpuSubfunction = Short.valueOf((String) args[1]);
+      cpuFunctionType = Byte.valueOf((String) args[1]);
     } else {
       throw new PlcRuntimeException(
-          "Argument 1 expected to be of type Short or a string which is parseable but was "
+          "Argument 1 expected to be of type Byte or a string which is parseable but was "
               + args[1].getClass().getName());
     }
-    return staticParse(readBuffer, cpuFunctionType, cpuSubfunction);
+    Short cpuSubfunction;
+    if (args[2] instanceof Short) {
+      cpuSubfunction = (Short) args[2];
+    } else if (args[2] instanceof String) {
+      cpuSubfunction = Short.valueOf((String) args[2]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 2 expected to be of type Short or a string which is parseable but was "
+              + args[2].getClass().getName());
+    }
+    return staticParse(readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
   }
 
   public static S7PayloadUserDataItem staticParse(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItem");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -179,108 +195,205 @@ public abstract class S7PayloadUserDataItem implements Message {
             new DataReaderEnumDefault<>(
                 DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
 
-    int dataLength = readImplicitField("dataLength", readUnsignedInt(readBuffer, 16));
+    int dataLength = readSimpleField("dataLength", readUnsignedInt(readBuffer, 16));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
     S7PayloadUserDataItemBuilder builder = null;
-    if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+    if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x01)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesPush.staticParseS7PayloadUserDataItemBuilder(
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x05)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesChangeDrivenPush
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x01)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesSubscribeRequest
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x04)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesUnsubscribeRequest
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x01)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesSubscribeResponse
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x04)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesUnsubscribeResponse
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x05)
+        && EvaluationHelper.equals(dataLength, (int) 0x00)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesErrorResponse.staticParseS7PayloadUserDataItemBuilder(
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x02)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x05)) {
+      builder =
+          S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x03)) {
       builder =
           S7PayloadDiagnosticMessage.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x05)) {
       builder =
           S7PayloadAlarm8.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x06)) {
       builder =
           S7PayloadNotify.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x0c)) {
       builder =
           S7PayloadAlarmAckInd.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x11)) {
       builder =
           S7PayloadAlarmSQ.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x12)) {
       builder =
           S7PayloadAlarmS.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x13)) {
       builder =
           S7PayloadAlarmSC.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x00)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x16)) {
       builder =
           S7PayloadNotify8.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x01)
+        && EvaluationHelper.equals(dataLength, (int) 0x00)) {
+      builder =
+          S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x01)) {
       builder =
           S7PayloadUserDataItemCpuFunctionReadSzlRequest.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x01)) {
       builder =
           S7PayloadUserDataItemCpuFunctionReadSzlResponse.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
+              readBuffer, dataLength, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x02)) {
       builder =
-          S7PayloadUserDataItemCpuFunctionMsgSubscription.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+          S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x02)
         && EvaluationHelper.equals(dataLength, (int) 0x00)) {
       builder =
           S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
-              .staticParseS7PayloadUserDataItemBuilder(readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x02)
         && EvaluationHelper.equals(dataLength, (int) 0x02)) {
       builder =
           S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
-              .staticParseS7PayloadUserDataItemBuilder(readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x02)
         && EvaluationHelper.equals(dataLength, (int) 0x05)) {
       builder =
           S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
-              .staticParseS7PayloadUserDataItemBuilder(readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x0b)) {
       builder =
-          S7PayloadUserDataItemCpuFunctionAlarmAck.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+          S7PayloadUserDataItemCpuFunctionAlarmAckRequest.staticParseS7PayloadUserDataItemBuilder(
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+        && EvaluationHelper.equals(cpuSubfunction, (short) 0x0b)
+        && EvaluationHelper.equals(dataLength, (int) 0x00)) {
+      builder =
+          S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x0b)) {
       builder =
           S7PayloadUserDataItemCpuFunctionAlarmAckResponse.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x13)) {
       builder =
-          S7PayloadUserDataItemCpuFunctionAlarmQuery.staticParseS7PayloadUserDataItemBuilder(
-              readBuffer, cpuFunctionType, cpuSubfunction);
-    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
+          S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.staticParseS7PayloadUserDataItemBuilder(
+              readBuffer, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
+    } else if (EvaluationHelper.equals(cpuFunctionGroup, (byte) 0x04)
+        && EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)
         && EvaluationHelper.equals(cpuSubfunction, (short) 0x13)) {
       builder =
           S7PayloadUserDataItemCpuFunctionAlarmQueryResponse
-              .staticParseS7PayloadUserDataItemBuilder(readBuffer, cpuFunctionType, cpuSubfunction);
+              .staticParseS7PayloadUserDataItemBuilder(
+                  readBuffer, dataLength, cpuFunctionGroup, cpuFunctionType, cpuSubfunction);
     }
     if (builder == null) {
       throw new ParseException(
           "Unsupported case for discriminated type"
               + " parameters ["
+              + "cpuFunctionGroup="
+              + cpuFunctionGroup
+              + " "
               + "cpuFunctionType="
               + cpuFunctionType
               + " "
@@ -294,12 +407,14 @@ public abstract class S7PayloadUserDataItem implements Message {
 
     readBuffer.closeContext("S7PayloadUserDataItem");
     // Create the instance
-    S7PayloadUserDataItem _s7PayloadUserDataItem = builder.build(returnCode, transportSize);
+    S7PayloadUserDataItem _s7PayloadUserDataItem =
+        builder.build(returnCode, transportSize, dataLength);
     return _s7PayloadUserDataItem;
   }
 
   public interface S7PayloadUserDataItemBuilder {
-    S7PayloadUserDataItem build(DataTransportErrorCode returnCode, DataTransportSize transportSize);
+    S7PayloadUserDataItem build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength);
   }
 
   @Override
@@ -313,12 +428,13 @@ public abstract class S7PayloadUserDataItem implements Message {
     S7PayloadUserDataItem that = (S7PayloadUserDataItem) o;
     return (getReturnCode() == that.getReturnCode())
         && (getTransportSize() == that.getTransportSize())
+        && (getDataLength() == that.getDataLength())
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(getReturnCode(), getTransportSize());
+    return Objects.hash(getReturnCode(), getTransportSize(), getDataLength());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse.java
similarity index 66%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse.java
index 6b7558f547..dfb5a9ef03 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse.java
@@ -35,25 +35,25 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
 
   public Short getCpuSubfunction() {
-    return (short) 0x02;
-  }
-
-  public Integer getDataLength() {
-    return (int) 0x00;
+    return (short) 0x0b;
   }
 
-  public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-      DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-    super(returnCode, transportSize);
+  public S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse(
+      DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+    super(returnCode, transportSize, dataLength);
   }
 
   @Override
@@ -62,9 +62,9 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
   }
 
   @Override
@@ -75,37 +75,38 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse _value = this;
+    S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl();
+    return new S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponseBuilderImpl();
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl
+  public static class S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponseBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl() {}
+    public S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponseBuilderImpl() {}
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
-          s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse =
-              new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-                  returnCode, transportSize);
-      return s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse;
+    public S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse
+          s7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse =
+              new S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse(
+                  returnCode, transportSize, dataLength);
+      return s7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse;
     }
   }
 
@@ -114,11 +115,11 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse)) {
+    if (!(o instanceof S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse that =
-        (S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse) o;
+    S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse that =
+        (S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse) o;
     return super.equals(that) && true;
   }
 
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAck.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.java
similarity index 72%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAck.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.java
index 18767c8ca9..77d23edeba 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAck.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.java
@@ -35,10 +35,14 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCpuFunctionAlarmAckRequest extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x04;
   }
@@ -47,42 +51,39 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
     return (short) 0x0b;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
+  // Constant values.
+  public static final Short FUNCTIONID = 0x09;
 
   // Properties.
-  protected final short functionId;
   protected final List<AlarmMessageObjectAckType> messageObjects;
 
-  public S7PayloadUserDataItemCpuFunctionAlarmAck(
+  public S7PayloadUserDataItemCpuFunctionAlarmAckRequest(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      short functionId,
+      int dataLength,
       List<AlarmMessageObjectAckType> messageObjects) {
-    super(returnCode, transportSize);
-    this.functionId = functionId;
+    super(returnCode, transportSize, dataLength);
     this.messageObjects = messageObjects;
   }
 
-  public short getFunctionId() {
-    return functionId;
-  }
-
   public List<AlarmMessageObjectAckType> getMessageObjects() {
     return messageObjects;
   }
 
+  public short getFunctionId() {
+    return FUNCTIONID;
+  }
+
   @Override
   protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmAckRequest");
 
-    // Simple Field (functionId)
-    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+    // Const Field (functionId)
+    writeConstField("functionId", FUNCTIONID, writeUnsignedShort(writeBuffer, 8));
 
     // Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
@@ -92,7 +93,7 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
     // Array Field (messageObjects)
     writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmAckRequest");
   }
 
   @Override
@@ -103,10 +104,10 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionAlarmAck _value = this;
+    S7PayloadUserDataItemCpuFunctionAlarmAckRequest _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (functionId)
+    // Const Field (functionId)
     lengthInBits += 8;
 
     // Implicit Field (numberOfObjects)
@@ -125,14 +126,19 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAckRequest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+    short functionId =
+        readConstField(
+            "functionId",
+            readUnsignedShort(readBuffer, 8),
+            S7PayloadUserDataItemCpuFunctionAlarmAckRequest.FUNCTIONID);
 
     short numberOfObjects = readImplicitField("numberOfObjects", readUnsignedShort(readBuffer, 8));
 
@@ -143,28 +149,27 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
                 () -> AlarmMessageObjectAckType.staticParse(readBuffer), readBuffer),
             numberOfObjects);
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmAckRequest");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionAlarmAckBuilderImpl(functionId, messageObjects);
+    return new S7PayloadUserDataItemCpuFunctionAlarmAckRequestBuilderImpl(messageObjects);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionAlarmAckBuilderImpl
+  public static class S7PayloadUserDataItemCpuFunctionAlarmAckRequestBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final short functionId;
     private final List<AlarmMessageObjectAckType> messageObjects;
 
-    public S7PayloadUserDataItemCpuFunctionAlarmAckBuilderImpl(
-        short functionId, List<AlarmMessageObjectAckType> messageObjects) {
-      this.functionId = functionId;
+    public S7PayloadUserDataItemCpuFunctionAlarmAckRequestBuilderImpl(
+        List<AlarmMessageObjectAckType> messageObjects) {
       this.messageObjects = messageObjects;
     }
 
-    public S7PayloadUserDataItemCpuFunctionAlarmAck build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionAlarmAck s7PayloadUserDataItemCpuFunctionAlarmAck =
-          new S7PayloadUserDataItemCpuFunctionAlarmAck(
-              returnCode, transportSize, functionId, messageObjects);
-      return s7PayloadUserDataItemCpuFunctionAlarmAck;
+    public S7PayloadUserDataItemCpuFunctionAlarmAckRequest build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCpuFunctionAlarmAckRequest
+          s7PayloadUserDataItemCpuFunctionAlarmAckRequest =
+              new S7PayloadUserDataItemCpuFunctionAlarmAckRequest(
+                  returnCode, transportSize, dataLength, messageObjects);
+      return s7PayloadUserDataItemCpuFunctionAlarmAckRequest;
     }
   }
 
@@ -173,19 +178,17 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionAlarmAck)) {
+    if (!(o instanceof S7PayloadUserDataItemCpuFunctionAlarmAckRequest)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionAlarmAck that = (S7PayloadUserDataItemCpuFunctionAlarmAck) o;
-    return (getFunctionId() == that.getFunctionId())
-        && (getMessageObjects() == that.getMessageObjects())
-        && super.equals(that)
-        && true;
+    S7PayloadUserDataItemCpuFunctionAlarmAckRequest that =
+        (S7PayloadUserDataItemCpuFunctionAlarmAckRequest) o;
+    return (getMessageObjects() == that.getMessageObjects()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getFunctionId(), getMessageObjects());
+    return Objects.hash(super.hashCode(), getMessageObjects());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java
index bd70e22484..c56ff8b8d6 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAckResponse extends S7PayloadU
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
@@ -47,10 +51,6 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAckResponse extends S7PayloadU
     return (short) 0x0b;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final short functionId;
   protected final List<Short> messageObjects;
@@ -58,9 +58,10 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAckResponse extends S7PayloadU
   public S7PayloadUserDataItemCpuFunctionAlarmAckResponse(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       short functionId,
       List<Short> messageObjects) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.functionId = functionId;
     this.messageObjects = messageObjects;
   }
@@ -121,7 +122,8 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAckResponse extends S7PayloadU
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAckResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -153,11 +155,11 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAckResponse extends S7PayloadU
     }
 
     public S7PayloadUserDataItemCpuFunctionAlarmAckResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionAlarmAckResponse
           s7PayloadUserDataItemCpuFunctionAlarmAckResponse =
               new S7PayloadUserDataItemCpuFunctionAlarmAckResponse(
-                  returnCode, transportSize, functionId, messageObjects);
+                  returnCode, transportSize, dataLength, functionId, messageObjects);
       return s7PayloadUserDataItemCpuFunctionAlarmAckResponse;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java
index 3e638ac5e1..4d37b96c42 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x04;
   }
@@ -47,10 +51,6 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
     return (short) 0x13;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Constant values.
   public static final Short FUNCTIONID = 0x00;
   public static final Short NUMBERMESSAGEOBJ = 0x01;
@@ -65,10 +65,11 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
   public S7PayloadUserDataItemCpuFunctionAlarmQuery(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       SyntaxIdType syntaxId,
       QueryType queryType,
       AlarmType alarmType) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.syntaxId = syntaxId;
     this.queryType = queryType;
     this.alarmType = alarmType;
@@ -197,7 +198,8 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmQuery");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -273,10 +275,10 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
     }
 
     public S7PayloadUserDataItemCpuFunctionAlarmQuery build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionAlarmQuery s7PayloadUserDataItemCpuFunctionAlarmQuery =
           new S7PayloadUserDataItemCpuFunctionAlarmQuery(
-              returnCode, transportSize, syntaxId, queryType, alarmType);
+              returnCode, transportSize, dataLength, syntaxId, queryType, alarmType);
       return s7PayloadUserDataItemCpuFunctionAlarmQuery;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.java
similarity index 84%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.java
index 3e638ac5e1..67f0ed073d 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQuery.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.java
@@ -35,10 +35,14 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCpuFunctionAlarmQueryRequest extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x04;
   }
@@ -47,10 +51,6 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
     return (short) 0x13;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Constant values.
   public static final Short FUNCTIONID = 0x00;
   public static final Short NUMBERMESSAGEOBJ = 0x01;
@@ -62,13 +62,14 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
   protected final QueryType queryType;
   protected final AlarmType alarmType;
 
-  public S7PayloadUserDataItemCpuFunctionAlarmQuery(
+  public S7PayloadUserDataItemCpuFunctionAlarmQueryRequest(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       SyntaxIdType syntaxId,
       QueryType queryType,
       AlarmType alarmType) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.syntaxId = syntaxId;
     this.queryType = queryType;
     this.alarmType = alarmType;
@@ -108,7 +109,7 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmQuery");
+    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmQueryRequest");
 
     // Const Field (functionId)
     writeConstField("functionId", FUNCTIONID, writeUnsignedShort(writeBuffer, 8));
@@ -152,7 +153,7 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
         new DataWriterEnumDefault<>(
             AlarmType::getValue, AlarmType::name, writeUnsignedShort(writeBuffer, 8)));
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmQuery");
+    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmQueryRequest");
   }
 
   @Override
@@ -163,7 +164,7 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionAlarmQuery _value = this;
+    S7PayloadUserDataItemCpuFunctionAlarmQueryRequest _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Const Field (functionId)
@@ -197,8 +198,9 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmQuery");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmQueryRequest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
@@ -208,25 +210,25 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
         readConstField(
             "functionId",
             readUnsignedShort(readBuffer, 8),
-            S7PayloadUserDataItemCpuFunctionAlarmQuery.FUNCTIONID);
+            S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.FUNCTIONID);
 
     short numberMessageObj =
         readConstField(
             "numberMessageObj",
             readUnsignedShort(readBuffer, 8),
-            S7PayloadUserDataItemCpuFunctionAlarmQuery.NUMBERMESSAGEOBJ);
+            S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.NUMBERMESSAGEOBJ);
 
     short variableSpec =
         readConstField(
             "variableSpec",
             readUnsignedShort(readBuffer, 8),
-            S7PayloadUserDataItemCpuFunctionAlarmQuery.VARIABLESPEC);
+            S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.VARIABLESPEC);
 
     short length =
         readConstField(
             "length",
             readUnsignedShort(readBuffer, 8),
-            S7PayloadUserDataItemCpuFunctionAlarmQuery.LENGTH);
+            S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.LENGTH);
 
     SyntaxIdType syntaxId =
         readEnumField(
@@ -253,31 +255,32 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
             "AlarmType",
             new DataReaderEnumDefault<>(AlarmType::enumForValue, readUnsignedShort(readBuffer, 8)));
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmQuery");
+    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmQueryRequest");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionAlarmQueryBuilderImpl(
+    return new S7PayloadUserDataItemCpuFunctionAlarmQueryRequestBuilderImpl(
         syntaxId, queryType, alarmType);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionAlarmQueryBuilderImpl
+  public static class S7PayloadUserDataItemCpuFunctionAlarmQueryRequestBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
     private final SyntaxIdType syntaxId;
     private final QueryType queryType;
     private final AlarmType alarmType;
 
-    public S7PayloadUserDataItemCpuFunctionAlarmQueryBuilderImpl(
+    public S7PayloadUserDataItemCpuFunctionAlarmQueryRequestBuilderImpl(
         SyntaxIdType syntaxId, QueryType queryType, AlarmType alarmType) {
       this.syntaxId = syntaxId;
       this.queryType = queryType;
       this.alarmType = alarmType;
     }
 
-    public S7PayloadUserDataItemCpuFunctionAlarmQuery build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionAlarmQuery s7PayloadUserDataItemCpuFunctionAlarmQuery =
-          new S7PayloadUserDataItemCpuFunctionAlarmQuery(
-              returnCode, transportSize, syntaxId, queryType, alarmType);
-      return s7PayloadUserDataItemCpuFunctionAlarmQuery;
+    public S7PayloadUserDataItemCpuFunctionAlarmQueryRequest build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCpuFunctionAlarmQueryRequest
+          s7PayloadUserDataItemCpuFunctionAlarmQueryRequest =
+              new S7PayloadUserDataItemCpuFunctionAlarmQueryRequest(
+                  returnCode, transportSize, dataLength, syntaxId, queryType, alarmType);
+      return s7PayloadUserDataItemCpuFunctionAlarmQueryRequest;
     }
   }
 
@@ -286,11 +289,11 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQuery extends S7PayloadUserDat
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionAlarmQuery)) {
+    if (!(o instanceof S7PayloadUserDataItemCpuFunctionAlarmQueryRequest)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionAlarmQuery that =
-        (S7PayloadUserDataItemCpuFunctionAlarmQuery) o;
+    S7PayloadUserDataItemCpuFunctionAlarmQueryRequest that =
+        (S7PayloadUserDataItemCpuFunctionAlarmQueryRequest) o;
     return (getSyntaxId() == that.getSyntaxId())
         && (getQueryType() == that.getQueryType())
         && (getAlarmType() == that.getAlarmType())
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java
index 6b1ec43758..1bff09b4c6 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQueryResponse extends S7Payloa
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
@@ -47,42 +51,20 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQueryResponse extends S7Payloa
     return (short) 0x13;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
-  // Constant values.
-  public static final Short FUNCTIONID = 0x00;
-  public static final Short NUMBERMESSAGEOBJ = 0x01;
-
   // Properties.
-  protected final DataTransportErrorCode pudicfReturnCode;
-  protected final DataTransportSize pudicftransportSize;
+  protected final byte[] items;
 
   public S7PayloadUserDataItemCpuFunctionAlarmQueryResponse(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      DataTransportErrorCode pudicfReturnCode,
-      DataTransportSize pudicftransportSize) {
-    super(returnCode, transportSize);
-    this.pudicfReturnCode = pudicfReturnCode;
-    this.pudicftransportSize = pudicftransportSize;
-  }
-
-  public DataTransportErrorCode getPudicfReturnCode() {
-    return pudicfReturnCode;
-  }
-
-  public DataTransportSize getPudicftransportSize() {
-    return pudicftransportSize;
-  }
-
-  public short getFunctionId() {
-    return FUNCTIONID;
+      int dataLength,
+      byte[] items) {
+    super(returnCode, transportSize, dataLength);
+    this.items = items;
   }
 
-  public short getNumberMessageObj() {
-    return NUMBERMESSAGEOBJ;
+  public byte[] getItems() {
+    return items;
   }
 
   @Override
@@ -93,34 +75,8 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQueryResponse extends S7Payloa
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse");
 
-    // Const Field (functionId)
-    writeConstField("functionId", FUNCTIONID, writeUnsignedShort(writeBuffer, 8));
-
-    // Const Field (numberMessageObj)
-    writeConstField("numberMessageObj", NUMBERMESSAGEOBJ, writeUnsignedShort(writeBuffer, 8));
-
-    // Simple Field (pudicfReturnCode)
-    writeSimpleEnumField(
-        "pudicfReturnCode",
-        "DataTransportErrorCode",
-        pudicfReturnCode,
-        new DataWriterEnumDefault<>(
-            DataTransportErrorCode::getValue,
-            DataTransportErrorCode::name,
-            writeUnsignedShort(writeBuffer, 8)));
-
-    // Simple Field (pudicftransportSize)
-    writeSimpleEnumField(
-        "pudicftransportSize",
-        "DataTransportSize",
-        pudicftransportSize,
-        new DataWriterEnumDefault<>(
-            DataTransportSize::getValue,
-            DataTransportSize::name,
-            writeUnsignedShort(writeBuffer, 8)));
-
-    // Reserved Field (reserved)
-    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+    // Array Field (items)
+    writeByteArrayField("items", items, writeByteArray(writeBuffer, 8));
 
     writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse");
   }
@@ -136,84 +92,48 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQueryResponse extends S7Payloa
     S7PayloadUserDataItemCpuFunctionAlarmQueryResponse _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Const Field (functionId)
-    lengthInBits += 8;
-
-    // Const Field (numberMessageObj)
-    lengthInBits += 8;
-
-    // Simple field (pudicfReturnCode)
-    lengthInBits += 8;
-
-    // Simple field (pudicftransportSize)
-    lengthInBits += 8;
-
-    // Reserved Field (reserved)
-    lengthInBits += 8;
+    // Array field
+    if (items != null) {
+      lengthInBits += 8 * items.length;
+    }
 
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer,
+      Integer dataLength,
+      Byte cpuFunctionGroup,
+      Byte cpuFunctionType,
+      Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    short functionId =
-        readConstField(
-            "functionId",
-            readUnsignedShort(readBuffer, 8),
-            S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.FUNCTIONID);
-
-    short numberMessageObj =
-        readConstField(
-            "numberMessageObj",
-            readUnsignedShort(readBuffer, 8),
-            S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.NUMBERMESSAGEOBJ);
-
-    DataTransportErrorCode pudicfReturnCode =
-        readEnumField(
-            "pudicfReturnCode",
-            "DataTransportErrorCode",
-            new DataReaderEnumDefault<>(
-                DataTransportErrorCode::enumForValue, readUnsignedShort(readBuffer, 8)));
-
-    DataTransportSize pudicftransportSize =
-        readEnumField(
-            "pudicftransportSize",
-            "DataTransportSize",
-            new DataReaderEnumDefault<>(
-                DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
-
-    Short reservedField0 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+    byte[] items = readBuffer.readByteArray("items", Math.toIntExact(dataLength));
 
     readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl(
-        pudicfReturnCode, pudicftransportSize);
+    return new S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl(items);
   }
 
   public static class S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final DataTransportErrorCode pudicfReturnCode;
-    private final DataTransportSize pudicftransportSize;
+    private final byte[] items;
 
-    public S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl(
-        DataTransportErrorCode pudicfReturnCode, DataTransportSize pudicftransportSize) {
-      this.pudicfReturnCode = pudicfReturnCode;
-      this.pudicftransportSize = pudicftransportSize;
+    public S7PayloadUserDataItemCpuFunctionAlarmQueryResponseBuilderImpl(byte[] items) {
+      this.items = items;
     }
 
     public S7PayloadUserDataItemCpuFunctionAlarmQueryResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionAlarmQueryResponse
           s7PayloadUserDataItemCpuFunctionAlarmQueryResponse =
               new S7PayloadUserDataItemCpuFunctionAlarmQueryResponse(
-                  returnCode, transportSize, pudicfReturnCode, pudicftransportSize);
+                  returnCode, transportSize, dataLength, items);
       return s7PayloadUserDataItemCpuFunctionAlarmQueryResponse;
     }
   }
@@ -228,15 +148,12 @@ public class S7PayloadUserDataItemCpuFunctionAlarmQueryResponse extends S7Payloa
     }
     S7PayloadUserDataItemCpuFunctionAlarmQueryResponse that =
         (S7PayloadUserDataItemCpuFunctionAlarmQueryResponse) o;
-    return (getPudicfReturnCode() == that.getPudicfReturnCode())
-        && (getPudicftransportSize() == that.getPudicftransportSize())
-        && super.equals(that)
-        && true;
+    return (getItems() == that.getItems()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getPudicfReturnCode(), getPudicftransportSize());
+    return Objects.hash(super.hashCode(), getItems());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java
index 1ee2f9a639..d6eb0ada76 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x04;
   }
@@ -47,10 +51,6 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     return (short) 0x02;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final short Subscription;
   protected final String magicKey;
@@ -60,11 +60,12 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
   public S7PayloadUserDataItemCpuFunctionMsgSubscription(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       short Subscription,
       String magicKey,
       AlarmStateType Alarmtype,
       Short Reserve) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.Subscription = Subscription;
     this.magicKey = magicKey;
     this.Alarmtype = Alarmtype;
@@ -153,7 +154,8 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscription");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -199,11 +201,17 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     }
 
     public S7PayloadUserDataItemCpuFunctionMsgSubscription build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionMsgSubscription
           s7PayloadUserDataItemCpuFunctionMsgSubscription =
               new S7PayloadUserDataItemCpuFunctionMsgSubscription(
-                  returnCode, transportSize, Subscription, magicKey, Alarmtype, Reserve);
+                  returnCode,
+                  transportSize,
+                  dataLength,
+                  Subscription,
+                  magicKey,
+                  Alarmtype,
+                  Reserve);
       return s7PayloadUserDataItemCpuFunctionMsgSubscription;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java
index b185d17131..b3456d53b1 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
     extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
@@ -47,10 +51,6 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
     return (short) 0x02;
   }
 
-  public Integer getDataLength() {
-    return (int) 0x05;
-  }
-
   // Properties.
   protected final short result;
   protected final short reserved01;
@@ -61,12 +61,13 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
   public S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       short result,
       short reserved01,
       AlarmType alarmType,
       short reserved02,
       short reserved03) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.result = result;
     this.reserved01 = reserved01;
     this.alarmType = alarmType;
@@ -155,7 +156,8 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -200,11 +202,18 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
     }
 
     public S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
           s7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse =
               new S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse(
-                  returnCode, transportSize, result, reserved01, alarmType, reserved02, reserved03);
+                  returnCode,
+                  transportSize,
+                  dataLength,
+                  result,
+                  reserved01,
+                  alarmType,
+                  reserved02,
+                  reserved03);
       return s7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest.java
similarity index 83%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest.java
index 1ee2f9a639..ad21923a35 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscription.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest.java
@@ -35,10 +35,14 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x04;
   }
@@ -47,24 +51,21 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     return (short) 0x02;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final short Subscription;
   protected final String magicKey;
   protected final AlarmStateType Alarmtype;
   protected final Short Reserve;
 
-  public S7PayloadUserDataItemCpuFunctionMsgSubscription(
+  public S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       short Subscription,
       String magicKey,
       AlarmStateType Alarmtype,
       Short Reserve) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.Subscription = Subscription;
     this.magicKey = magicKey;
     this.Alarmtype = Alarmtype;
@@ -93,7 +94,7 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscription");
+    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest");
 
     // Simple Field (Subscription)
     writeSimpleField("Subscription", Subscription, writeUnsignedShort(writeBuffer, 8));
@@ -116,7 +117,7 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     // Optional Field (Reserve) (Can be skipped, if the value is null)
     writeOptionalField("Reserve", Reserve, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscription");
+    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest");
   }
 
   @Override
@@ -127,7 +128,7 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionMsgSubscription _value = this;
+    S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (Subscription)
@@ -153,8 +154,9 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscription");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
@@ -177,20 +179,20 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     Short Reserve =
         readOptionalField("Reserve", readUnsignedShort(readBuffer, 8), (Subscription) >= (128));
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscription");
+    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionBuilderImpl(
+    return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequestBuilderImpl(
         Subscription, magicKey, Alarmtype, Reserve);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionBuilderImpl
+  public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequestBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
     private final short Subscription;
     private final String magicKey;
     private final AlarmStateType Alarmtype;
     private final Short Reserve;
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionBuilderImpl(
+    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequestBuilderImpl(
         short Subscription, String magicKey, AlarmStateType Alarmtype, Short Reserve) {
       this.Subscription = Subscription;
       this.magicKey = magicKey;
@@ -198,13 +200,19 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
       this.Reserve = Reserve;
     }
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscription build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionMsgSubscription
-          s7PayloadUserDataItemCpuFunctionMsgSubscription =
-              new S7PayloadUserDataItemCpuFunctionMsgSubscription(
-                  returnCode, transportSize, Subscription, magicKey, Alarmtype, Reserve);
-      return s7PayloadUserDataItemCpuFunctionMsgSubscription;
+    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest
+          s7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest =
+              new S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest(
+                  returnCode,
+                  transportSize,
+                  dataLength,
+                  Subscription,
+                  magicKey,
+                  Alarmtype,
+                  Reserve);
+      return s7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest;
     }
   }
 
@@ -213,11 +221,11 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscription extends S7PayloadUs
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionMsgSubscription)) {
+    if (!(o instanceof S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionMsgSubscription that =
-        (S7PayloadUserDataItemCpuFunctionMsgSubscription) o;
+    S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest that =
+        (S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest) o;
     return (getSubscription() == that.getSubscription())
         && (getMagicKey() == that.getMagicKey())
         && (getAlarmtype() == that.getAlarmtype())
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
index 6b7558f547..30778765ef 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
@@ -47,13 +51,9 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     return (short) 0x02;
   }
 
-  public Integer getDataLength() {
-    return (int) 0x00;
-  }
-
   public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-      DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-    super(returnCode, transportSize);
+      DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+    super(returnCode, transportSize, dataLength);
   }
 
   @Override
@@ -82,7 +82,8 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -100,11 +101,11 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl() {}
 
     public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
           s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse =
               new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-                  returnCode, transportSize);
+                  returnCode, transportSize, dataLength);
       return s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java
index bdc73ee60b..b4af396e7f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
     extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
@@ -47,10 +51,6 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
     return (short) 0x02;
   }
 
-  public Integer getDataLength() {
-    return (int) 0x02;
-  }
-
   // Properties.
   protected final short result;
   protected final short reserved01;
@@ -58,9 +58,10 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
   public S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       short result,
       short reserved01) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.result = result;
     this.reserved01 = reserved01;
   }
@@ -111,7 +112,8 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -140,11 +142,11 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
     }
 
     public S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
           s7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse =
               new S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse(
-                  returnCode, transportSize, result, reserved01);
+                  returnCode, transportSize, dataLength, result, reserved01);
       return s7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest.java
similarity index 66%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest.java
index 6b7558f547..2ef1caa82b 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest.java
@@ -35,25 +35,25 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
-  public Byte getCpuFunctionType() {
-    return (byte) 0x08;
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
   }
 
-  public Short getCpuSubfunction() {
-    return (short) 0x02;
+  public Byte getCpuFunctionType() {
+    return (byte) 0x04;
   }
 
-  public Integer getDataLength() {
-    return (int) 0x00;
+  public Short getCpuSubfunction() {
+    return (short) 0x01;
   }
 
-  public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-      DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-    super(returnCode, transportSize);
+  public S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest(
+      DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+    super(returnCode, transportSize, dataLength);
   }
 
   @Override
@@ -62,9 +62,9 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
   }
 
   @Override
@@ -75,37 +75,38 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse _value = this;
+    S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl();
+    return new S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequestBuilderImpl();
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl
+  public static class S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequestBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl() {}
+    public S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequestBuilderImpl() {}
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
-          s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse =
-              new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-                  returnCode, transportSize);
-      return s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse;
+    public S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest
+          s7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest =
+              new S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest(
+                  returnCode, transportSize, dataLength);
+      return s7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest;
     }
   }
 
@@ -114,11 +115,11 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse)) {
+    if (!(o instanceof S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse that =
-        (S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse) o;
+    S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest that =
+        (S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest) o;
     return super.equals(that) && true;
   }
 
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
index 43a3730ddb..a7ca1d2778 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x04;
   }
@@ -47,10 +51,6 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     return (short) 0x01;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
   protected final SzlId szlId;
   protected final int szlIndex;
@@ -58,9 +58,10 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
   public S7PayloadUserDataItemCpuFunctionReadSzlRequest(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
+      int dataLength,
       SzlId szlId,
       int szlIndex) {
-    super(returnCode, transportSize);
+    super(returnCode, transportSize, dataLength);
     this.szlId = szlId;
     this.szlIndex = szlIndex;
   }
@@ -111,7 +112,8 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
@@ -141,11 +143,11 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     }
 
     public S7PayloadUserDataItemCpuFunctionReadSzlRequest build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionReadSzlRequest
           s7PayloadUserDataItemCpuFunctionReadSzlRequest =
               new S7PayloadUserDataItemCpuFunctionReadSzlRequest(
-                  returnCode, transportSize, szlId, szlIndex);
+                  returnCode, transportSize, dataLength, szlId, szlIndex);
       return s7PayloadUserDataItemCpuFunctionReadSzlRequest;
     }
   }
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java
index 8d544e4958..53d665b693 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java
@@ -39,6 +39,10 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlResponse extends S7PayloadUs
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x04;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
@@ -47,46 +51,22 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlResponse extends S7PayloadUs
     return (short) 0x01;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
-  // Constant values.
-  public static final Integer SZLITEMLENGTH = 28;
-
   // Properties.
-  protected final SzlId szlId;
-  protected final int szlIndex;
-  protected final List<SzlDataTreeItem> items;
+  protected final byte[] items;
 
   public S7PayloadUserDataItemCpuFunctionReadSzlResponse(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      SzlId szlId,
-      int szlIndex,
-      List<SzlDataTreeItem> items) {
-    super(returnCode, transportSize);
-    this.szlId = szlId;
-    this.szlIndex = szlIndex;
+      int dataLength,
+      byte[] items) {
+    super(returnCode, transportSize, dataLength);
     this.items = items;
   }
 
-  public SzlId getSzlId() {
-    return szlId;
-  }
-
-  public int getSzlIndex() {
-    return szlIndex;
-  }
-
-  public List<SzlDataTreeItem> getItems() {
+  public byte[] getItems() {
     return items;
   }
 
-  public int getSzlItemLength() {
-    return SZLITEMLENGTH;
-  }
-
   @Override
   protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer)
       throws SerializationException {
@@ -95,22 +75,8 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlResponse extends S7PayloadUs
     int startPos = positionAware.getPos();
     writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlResponse");
 
-    // Simple Field (szlId)
-    writeSimpleField("szlId", szlId, new DataWriterComplexDefault<>(writeBuffer));
-
-    // Simple Field (szlIndex)
-    writeSimpleField("szlIndex", szlIndex, writeUnsignedInt(writeBuffer, 16));
-
-    // Const Field (szlItemLength)
-    writeConstField("szlItemLength", SZLITEMLENGTH, writeUnsignedInt(writeBuffer, 16));
-
-    // Implicit Field (szlItemCount) (Used for parsing, but its value is not stored as it's
-    // implicitly given by the objects content)
-    int szlItemCount = (int) (COUNT(getItems()));
-    writeImplicitField("szlItemCount", szlItemCount, writeUnsignedInt(writeBuffer, 16));
-
     // Array Field (items)
-    writeComplexTypeArrayField("items", items, writeBuffer);
+    writeByteArrayField("items", items, writeByteArray(writeBuffer, 8));
 
     writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionReadSzlResponse");
   }
@@ -126,84 +92,48 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlResponse extends S7PayloadUs
     S7PayloadUserDataItemCpuFunctionReadSzlResponse _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (szlId)
-    lengthInBits += szlId.getLengthInBits();
-
-    // Simple field (szlIndex)
-    lengthInBits += 16;
-
-    // Const Field (szlItemLength)
-    lengthInBits += 16;
-
-    // Implicit Field (szlItemCount)
-    lengthInBits += 16;
-
     // Array field
     if (items != null) {
-      int i = 0;
-      for (SzlDataTreeItem element : items) {
-        ThreadLocalHelper.lastItemThreadLocal.set(++i >= items.size());
-        lengthInBits += element.getLengthInBits();
-      }
+      lengthInBits += 8 * items.length;
     }
 
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
+      ReadBuffer readBuffer,
+      Integer dataLength,
+      Byte cpuFunctionGroup,
+      Byte cpuFunctionType,
+      Short cpuSubfunction)
+      throws ParseException {
     readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    SzlId szlId =
-        readSimpleField(
-            "szlId",
-            new DataReaderComplexDefault<>(() -> SzlId.staticParse(readBuffer), readBuffer));
-
-    int szlIndex = readSimpleField("szlIndex", readUnsignedInt(readBuffer, 16));
-
-    int szlItemLength =
-        readConstField(
-            "szlItemLength",
-            readUnsignedInt(readBuffer, 16),
-            S7PayloadUserDataItemCpuFunctionReadSzlResponse.SZLITEMLENGTH);
-
-    int szlItemCount = readImplicitField("szlItemCount", readUnsignedInt(readBuffer, 16));
-
-    List<SzlDataTreeItem> items =
-        readCountArrayField(
-            "items",
-            new DataReaderComplexDefault<>(
-                () -> SzlDataTreeItem.staticParse(readBuffer), readBuffer),
-            szlItemCount);
+    byte[] items = readBuffer.readByteArray("items", Math.toIntExact(dataLength));
 
     readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionReadSzlResponse");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionReadSzlResponseBuilderImpl(szlId, szlIndex, items);
+    return new S7PayloadUserDataItemCpuFunctionReadSzlResponseBuilderImpl(items);
   }
 
   public static class S7PayloadUserDataItemCpuFunctionReadSzlResponseBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final SzlId szlId;
-    private final int szlIndex;
-    private final List<SzlDataTreeItem> items;
-
-    public S7PayloadUserDataItemCpuFunctionReadSzlResponseBuilderImpl(
-        SzlId szlId, int szlIndex, List<SzlDataTreeItem> items) {
-      this.szlId = szlId;
-      this.szlIndex = szlIndex;
+    private final byte[] items;
+
+    public S7PayloadUserDataItemCpuFunctionReadSzlResponseBuilderImpl(byte[] items) {
       this.items = items;
     }
 
     public S7PayloadUserDataItemCpuFunctionReadSzlResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
       S7PayloadUserDataItemCpuFunctionReadSzlResponse
           s7PayloadUserDataItemCpuFunctionReadSzlResponse =
               new S7PayloadUserDataItemCpuFunctionReadSzlResponse(
-                  returnCode, transportSize, szlId, szlIndex, items);
+                  returnCode, transportSize, dataLength, items);
       return s7PayloadUserDataItemCpuFunctionReadSzlResponse;
     }
   }
@@ -218,16 +148,12 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlResponse extends S7PayloadUs
     }
     S7PayloadUserDataItemCpuFunctionReadSzlResponse that =
         (S7PayloadUserDataItemCpuFunctionReadSzlResponse) o;
-    return (getSzlId() == that.getSzlId())
-        && (getSzlIndex() == that.getSzlIndex())
-        && (getItems() == that.getItems())
-        && super.equals(that)
-        && true;
+    return (getItems() == that.getItems()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getSzlId(), getSzlIndex(), getItems());
+    return Objects.hash(super.hashCode(), getItems());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenPush.java
similarity index 51%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenPush.java
index 43a3730ddb..5befacafb6 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenPush.java
@@ -35,42 +35,43 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCyclicServicesChangeDrivenPush extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
-  public Byte getCpuFunctionType() {
-    return (byte) 0x04;
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
   }
 
-  public Short getCpuSubfunction() {
-    return (short) 0x01;
+  public Byte getCpuFunctionType() {
+    return (byte) 0x00;
   }
 
-  public Integer getDataLength() {
-    return 0;
+  public Short getCpuSubfunction() {
+    return (short) 0x05;
   }
 
   // Properties.
-  protected final SzlId szlId;
-  protected final int szlIndex;
+  protected final int itemsCount;
+  protected final List<AssociatedQueryValueType> items;
 
-  public S7PayloadUserDataItemCpuFunctionReadSzlRequest(
+  public S7PayloadUserDataItemCyclicServicesChangeDrivenPush(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      SzlId szlId,
-      int szlIndex) {
-    super(returnCode, transportSize);
-    this.szlId = szlId;
-    this.szlIndex = szlIndex;
+      int dataLength,
+      int itemsCount,
+      List<AssociatedQueryValueType> items) {
+    super(returnCode, transportSize, dataLength);
+    this.itemsCount = itemsCount;
+    this.items = items;
   }
 
-  public SzlId getSzlId() {
-    return szlId;
+  public int getItemsCount() {
+    return itemsCount;
   }
 
-  public int getSzlIndex() {
-    return szlIndex;
+  public List<AssociatedQueryValueType> getItems() {
+    return items;
   }
 
   @Override
@@ -79,15 +80,15 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesChangeDrivenPush");
 
-    // Simple Field (szlId)
-    writeSimpleField("szlId", szlId, new DataWriterComplexDefault<>(writeBuffer));
+    // Simple Field (itemsCount)
+    writeSimpleField("itemsCount", itemsCount, writeUnsignedInt(writeBuffer, 16));
 
-    // Simple Field (szlIndex)
-    writeSimpleField("szlIndex", szlIndex, writeUnsignedInt(writeBuffer, 16));
+    // Array Field (items)
+    writeComplexTypeArrayField("items", items, writeBuffer);
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesChangeDrivenPush");
   }
 
   @Override
@@ -98,55 +99,65 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest _value = this;
+    S7PayloadUserDataItemCyclicServicesChangeDrivenPush _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (szlId)
-    lengthInBits += szlId.getLengthInBits();
-
-    // Simple field (szlIndex)
+    // Simple field (itemsCount)
     lengthInBits += 16;
 
+    // Array field
+    if (items != null) {
+      int i = 0;
+      for (AssociatedQueryValueType element : items) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= items.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesChangeDrivenPush");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    SzlId szlId =
-        readSimpleField(
-            "szlId",
-            new DataReaderComplexDefault<>(() -> SzlId.staticParse(readBuffer), readBuffer));
+    int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
 
-    int szlIndex = readSimpleField("szlIndex", readUnsignedInt(readBuffer, 16));
+    List<AssociatedQueryValueType> items =
+        readCountArrayField(
+            "items",
+            new DataReaderComplexDefault<>(
+                () -> AssociatedQueryValueType.staticParse(readBuffer), readBuffer),
+            itemsCount);
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesChangeDrivenPush");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(szlId, szlIndex);
+    return new S7PayloadUserDataItemCyclicServicesChangeDrivenPushBuilderImpl(itemsCount, items);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl
+  public static class S7PayloadUserDataItemCyclicServicesChangeDrivenPushBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final SzlId szlId;
-    private final int szlIndex;
+    private final int itemsCount;
+    private final List<AssociatedQueryValueType> items;
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(SzlId szlId, int szlIndex) {
-      this.szlId = szlId;
-      this.szlIndex = szlIndex;
+    public S7PayloadUserDataItemCyclicServicesChangeDrivenPushBuilderImpl(
+        int itemsCount, List<AssociatedQueryValueType> items) {
+      this.itemsCount = itemsCount;
+      this.items = items;
     }
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequest build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionReadSzlRequest
-          s7PayloadUserDataItemCpuFunctionReadSzlRequest =
-              new S7PayloadUserDataItemCpuFunctionReadSzlRequest(
-                  returnCode, transportSize, szlId, szlIndex);
-      return s7PayloadUserDataItemCpuFunctionReadSzlRequest;
+    public S7PayloadUserDataItemCyclicServicesChangeDrivenPush build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesChangeDrivenPush
+          s7PayloadUserDataItemCyclicServicesChangeDrivenPush =
+              new S7PayloadUserDataItemCyclicServicesChangeDrivenPush(
+                  returnCode, transportSize, dataLength, itemsCount, items);
+      return s7PayloadUserDataItemCyclicServicesChangeDrivenPush;
     }
   }
 
@@ -155,20 +166,20 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionReadSzlRequest)) {
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesChangeDrivenPush)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest that =
-        (S7PayloadUserDataItemCpuFunctionReadSzlRequest) o;
-    return (getSzlId() == that.getSzlId())
-        && (getSzlIndex() == that.getSzlIndex())
+    S7PayloadUserDataItemCyclicServicesChangeDrivenPush that =
+        (S7PayloadUserDataItemCyclicServicesChangeDrivenPush) o;
+    return (getItemsCount() == that.getItemsCount())
+        && (getItems() == that.getItems())
         && super.equals(that)
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getSzlId(), getSzlIndex());
+    return Objects.hash(super.hashCode(), getItemsCount(), getItems());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAck.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse.java
similarity index 50%
rename from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAck.java
rename to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse.java
index 18767c8ca9..8653ab2f18 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAck.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse.java
@@ -35,42 +35,43 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataItem
-    implements Message {
+public class S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse
+    extends S7PayloadUserDataItem implements Message {
 
   // Accessors for discriminator values.
-  public Byte getCpuFunctionType() {
-    return (byte) 0x04;
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
   }
 
-  public Short getCpuSubfunction() {
-    return (short) 0x0b;
+  public Byte getCpuFunctionType() {
+    return (byte) 0x08;
   }
 
-  public Integer getDataLength() {
-    return 0;
+  public Short getCpuSubfunction() {
+    return (short) 0x05;
   }
 
   // Properties.
-  protected final short functionId;
-  protected final List<AlarmMessageObjectAckType> messageObjects;
+  protected final int itemsCount;
+  protected final List<AssociatedQueryValueType> items;
 
-  public S7PayloadUserDataItemCpuFunctionAlarmAck(
+  public S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      short functionId,
-      List<AlarmMessageObjectAckType> messageObjects) {
-    super(returnCode, transportSize);
-    this.functionId = functionId;
-    this.messageObjects = messageObjects;
+      int dataLength,
+      int itemsCount,
+      List<AssociatedQueryValueType> items) {
+    super(returnCode, transportSize, dataLength);
+    this.itemsCount = itemsCount;
+    this.items = items;
   }
 
-  public short getFunctionId() {
-    return functionId;
+  public int getItemsCount() {
+    return itemsCount;
   }
 
-  public List<AlarmMessageObjectAckType> getMessageObjects() {
-    return messageObjects;
+  public List<AssociatedQueryValueType> getItems() {
+    return items;
   }
 
   @Override
@@ -79,20 +80,15 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse");
 
-    // Simple Field (functionId)
-    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+    // Simple Field (itemsCount)
+    writeSimpleField("itemsCount", itemsCount, writeUnsignedInt(writeBuffer, 16));
 
-    // Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's
-    // implicitly given by the objects content)
-    short numberOfObjects = (short) (COUNT(getMessageObjects()));
-    writeImplicitField("numberOfObjects", numberOfObjects, writeUnsignedShort(writeBuffer, 8));
+    // Array Field (items)
+    writeComplexTypeArrayField("items", items, writeBuffer);
 
-    // Array Field (messageObjects)
-    writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
-
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse");
   }
 
   @Override
@@ -103,20 +99,17 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionAlarmAck _value = this;
+    S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (functionId)
-    lengthInBits += 8;
-
-    // Implicit Field (numberOfObjects)
-    lengthInBits += 8;
+    // Simple field (itemsCount)
+    lengthInBits += 16;
 
     // Array field
-    if (messageObjects != null) {
+    if (items != null) {
       int i = 0;
-      for (AlarmMessageObjectAckType element : messageObjects) {
-        ThreadLocalHelper.lastItemThreadLocal.set(++i >= messageObjects.size());
+      for (AssociatedQueryValueType element : items) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= items.size());
         lengthInBits += element.getLengthInBits();
       }
     }
@@ -125,46 +118,47 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
-
-    short numberOfObjects = readImplicitField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+    int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
 
-    List<AlarmMessageObjectAckType> messageObjects =
+    List<AssociatedQueryValueType> items =
         readCountArrayField(
-            "messageObjects",
+            "items",
             new DataReaderComplexDefault<>(
-                () -> AlarmMessageObjectAckType.staticParse(readBuffer), readBuffer),
-            numberOfObjects);
+                () -> AssociatedQueryValueType.staticParse(readBuffer), readBuffer),
+            itemsCount);
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmAck");
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionAlarmAckBuilderImpl(functionId, messageObjects);
+    return new S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponseBuilderImpl(
+        itemsCount, items);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionAlarmAckBuilderImpl
+  public static class S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponseBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final short functionId;
-    private final List<AlarmMessageObjectAckType> messageObjects;
+    private final int itemsCount;
+    private final List<AssociatedQueryValueType> items;
 
-    public S7PayloadUserDataItemCpuFunctionAlarmAckBuilderImpl(
-        short functionId, List<AlarmMessageObjectAckType> messageObjects) {
-      this.functionId = functionId;
-      this.messageObjects = messageObjects;
+    public S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponseBuilderImpl(
+        int itemsCount, List<AssociatedQueryValueType> items) {
+      this.itemsCount = itemsCount;
+      this.items = items;
     }
 
-    public S7PayloadUserDataItemCpuFunctionAlarmAck build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionAlarmAck s7PayloadUserDataItemCpuFunctionAlarmAck =
-          new S7PayloadUserDataItemCpuFunctionAlarmAck(
-              returnCode, transportSize, functionId, messageObjects);
-      return s7PayloadUserDataItemCpuFunctionAlarmAck;
+    public S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse
+          s7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse =
+              new S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse(
+                  returnCode, transportSize, dataLength, itemsCount, items);
+      return s7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse;
     }
   }
 
@@ -173,19 +167,20 @@ public class S7PayloadUserDataItemCpuFunctionAlarmAck extends S7PayloadUserDataI
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionAlarmAck)) {
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionAlarmAck that = (S7PayloadUserDataItemCpuFunctionAlarmAck) o;
-    return (getFunctionId() == that.getFunctionId())
-        && (getMessageObjects() == that.getMessageObjects())
+    S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse that =
+        (S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse) o;
+    return (getItemsCount() == that.getItemsCount())
+        && (getItems() == that.getItems())
         && super.equals(that)
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getFunctionId(), getMessageObjects());
+    return Objects.hash(super.hashCode(), getItemsCount(), getItems());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesErrorResponse.java
similarity index 67%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesErrorResponse.java
index 6b7558f547..e6638a7ad4 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesErrorResponse.java
@@ -35,25 +35,25 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCyclicServicesErrorResponse extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
 
   public Short getCpuSubfunction() {
-    return (short) 0x02;
-  }
-
-  public Integer getDataLength() {
-    return (int) 0x00;
+    return (short) 0x05;
   }
 
-  public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-      DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-    super(returnCode, transportSize);
+  public S7PayloadUserDataItemCyclicServicesErrorResponse(
+      DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+    super(returnCode, transportSize, dataLength);
   }
 
   @Override
@@ -62,9 +62,9 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
   }
 
   @Override
@@ -75,37 +75,38 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse _value = this;
+    S7PayloadUserDataItemCyclicServicesErrorResponse _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl();
+    return new S7PayloadUserDataItemCyclicServicesErrorResponseBuilderImpl();
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl
+  public static class S7PayloadUserDataItemCyclicServicesErrorResponseBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl() {}
+    public S7PayloadUserDataItemCyclicServicesErrorResponseBuilderImpl() {}
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
-          s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse =
-              new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-                  returnCode, transportSize);
-      return s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse;
+    public S7PayloadUserDataItemCyclicServicesErrorResponse build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesErrorResponse
+          s7PayloadUserDataItemCyclicServicesErrorResponse =
+              new S7PayloadUserDataItemCyclicServicesErrorResponse(
+                  returnCode, transportSize, dataLength);
+      return s7PayloadUserDataItemCyclicServicesErrorResponse;
     }
   }
 
@@ -114,11 +115,11 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse)) {
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesErrorResponse)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse that =
-        (S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse) o;
+    S7PayloadUserDataItemCyclicServicesErrorResponse that =
+        (S7PayloadUserDataItemCyclicServicesErrorResponse) o;
     return super.equals(that) && true;
   }
 
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesPush.java
similarity index 53%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesPush.java
index 43a3730ddb..0231b5d84b 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesPush.java
@@ -35,42 +35,43 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCyclicServicesPush extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
+  }
+
   public Byte getCpuFunctionType() {
-    return (byte) 0x04;
+    return (byte) 0x00;
   }
 
   public Short getCpuSubfunction() {
     return (short) 0x01;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
-  protected final SzlId szlId;
-  protected final int szlIndex;
+  protected final int itemsCount;
+  protected final List<AssociatedValueType> items;
 
-  public S7PayloadUserDataItemCpuFunctionReadSzlRequest(
+  public S7PayloadUserDataItemCyclicServicesPush(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      SzlId szlId,
-      int szlIndex) {
-    super(returnCode, transportSize);
-    this.szlId = szlId;
-    this.szlIndex = szlIndex;
+      int dataLength,
+      int itemsCount,
+      List<AssociatedValueType> items) {
+    super(returnCode, transportSize, dataLength);
+    this.itemsCount = itemsCount;
+    this.items = items;
   }
 
-  public SzlId getSzlId() {
-    return szlId;
+  public int getItemsCount() {
+    return itemsCount;
   }
 
-  public int getSzlIndex() {
-    return szlIndex;
+  public List<AssociatedValueType> getItems() {
+    return items;
   }
 
   @Override
@@ -79,15 +80,15 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesPush");
 
-    // Simple Field (szlId)
-    writeSimpleField("szlId", szlId, new DataWriterComplexDefault<>(writeBuffer));
+    // Simple Field (itemsCount)
+    writeSimpleField("itemsCount", itemsCount, writeUnsignedInt(writeBuffer, 16));
 
-    // Simple Field (szlIndex)
-    writeSimpleField("szlIndex", szlIndex, writeUnsignedInt(writeBuffer, 16));
+    // Array Field (items)
+    writeComplexTypeArrayField("items", items, writeBuffer);
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesPush");
   }
 
   @Override
@@ -98,55 +99,64 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest _value = this;
+    S7PayloadUserDataItemCyclicServicesPush _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (szlId)
-    lengthInBits += szlId.getLengthInBits();
-
-    // Simple field (szlIndex)
+    // Simple field (itemsCount)
     lengthInBits += 16;
 
+    // Array field
+    if (items != null) {
+      int i = 0;
+      for (AssociatedValueType element : items) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= items.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesPush");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    SzlId szlId =
-        readSimpleField(
-            "szlId",
-            new DataReaderComplexDefault<>(() -> SzlId.staticParse(readBuffer), readBuffer));
+    int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
 
-    int szlIndex = readSimpleField("szlIndex", readUnsignedInt(readBuffer, 16));
+    List<AssociatedValueType> items =
+        readCountArrayField(
+            "items",
+            new DataReaderComplexDefault<>(
+                () -> AssociatedValueType.staticParse(readBuffer), readBuffer),
+            itemsCount);
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesPush");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(szlId, szlIndex);
+    return new S7PayloadUserDataItemCyclicServicesPushBuilderImpl(itemsCount, items);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl
+  public static class S7PayloadUserDataItemCyclicServicesPushBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final SzlId szlId;
-    private final int szlIndex;
+    private final int itemsCount;
+    private final List<AssociatedValueType> items;
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(SzlId szlId, int szlIndex) {
-      this.szlId = szlId;
-      this.szlIndex = szlIndex;
+    public S7PayloadUserDataItemCyclicServicesPushBuilderImpl(
+        int itemsCount, List<AssociatedValueType> items) {
+      this.itemsCount = itemsCount;
+      this.items = items;
     }
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequest build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionReadSzlRequest
-          s7PayloadUserDataItemCpuFunctionReadSzlRequest =
-              new S7PayloadUserDataItemCpuFunctionReadSzlRequest(
-                  returnCode, transportSize, szlId, szlIndex);
-      return s7PayloadUserDataItemCpuFunctionReadSzlRequest;
+    public S7PayloadUserDataItemCyclicServicesPush build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesPush s7PayloadUserDataItemCyclicServicesPush =
+          new S7PayloadUserDataItemCyclicServicesPush(
+              returnCode, transportSize, dataLength, itemsCount, items);
+      return s7PayloadUserDataItemCyclicServicesPush;
     }
   }
 
@@ -155,20 +165,19 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionReadSzlRequest)) {
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesPush)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest that =
-        (S7PayloadUserDataItemCpuFunctionReadSzlRequest) o;
-    return (getSzlId() == that.getSzlId())
-        && (getSzlIndex() == that.getSzlIndex())
+    S7PayloadUserDataItemCyclicServicesPush that = (S7PayloadUserDataItemCyclicServicesPush) o;
+    return (getItemsCount() == that.getItemsCount())
+        && (getItems() == that.getItems())
         && super.equals(that)
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getSzlId(), getSzlIndex());
+    return Objects.hash(super.hashCode(), getItemsCount(), getItems());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeRequest.java
new file mode 100644
index 0000000000..fb33e91d2c
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeRequest.java
@@ -0,0 +1,242 @@
+/*
+ * 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
+ *
+ *   https://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.s7.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class S7PayloadUserDataItemCyclicServicesSubscribeRequest extends S7PayloadUserDataItem
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
+  }
+
+  public Byte getCpuFunctionType() {
+    return (byte) 0x04;
+  }
+
+  public Short getCpuSubfunction() {
+    return (short) 0x01;
+  }
+
+  // Properties.
+  protected final int itemsCount;
+  protected final TimeBase timeBase;
+  protected final short timeFactor;
+  protected final List<CycServiceItemType> item;
+
+  public S7PayloadUserDataItemCyclicServicesSubscribeRequest(
+      DataTransportErrorCode returnCode,
+      DataTransportSize transportSize,
+      int dataLength,
+      int itemsCount,
+      TimeBase timeBase,
+      short timeFactor,
+      List<CycServiceItemType> item) {
+    super(returnCode, transportSize, dataLength);
+    this.itemsCount = itemsCount;
+    this.timeBase = timeBase;
+    this.timeFactor = timeFactor;
+    this.item = item;
+  }
+
+  public int getItemsCount() {
+    return itemsCount;
+  }
+
+  public TimeBase getTimeBase() {
+    return timeBase;
+  }
+
+  public short getTimeFactor() {
+    return timeFactor;
+  }
+
+  public List<CycServiceItemType> getItem() {
+    return item;
+  }
+
+  @Override
+  protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesSubscribeRequest");
+
+    // Simple Field (itemsCount)
+    writeSimpleField("itemsCount", itemsCount, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (timeBase)
+    writeSimpleEnumField(
+        "timeBase",
+        "TimeBase",
+        timeBase,
+        new DataWriterEnumDefault<>(
+            TimeBase::getValue, TimeBase::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (timeFactor)
+    writeSimpleField("timeFactor", timeFactor, writeUnsignedShort(writeBuffer, 8));
+
+    // Array Field (item)
+    writeComplexTypeArrayField("item", item, writeBuffer);
+
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesSubscribeRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7PayloadUserDataItemCyclicServicesSubscribeRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (itemsCount)
+    lengthInBits += 16;
+
+    // Simple field (timeBase)
+    lengthInBits += 8;
+
+    // Simple field (timeFactor)
+    lengthInBits += 8;
+
+    // Array field
+    if (item != null) {
+      int i = 0;
+      for (CycServiceItemType element : item) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= item.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesSubscribeRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
+
+    TimeBase timeBase =
+        readEnumField(
+            "timeBase",
+            "TimeBase",
+            new DataReaderEnumDefault<>(TimeBase::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    short timeFactor = readSimpleField("timeFactor", readUnsignedShort(readBuffer, 8));
+
+    List<CycServiceItemType> item =
+        readCountArrayField(
+            "item",
+            new DataReaderComplexDefault<>(
+                () -> CycServiceItemType.staticParse(readBuffer), readBuffer),
+            itemsCount);
+
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesSubscribeRequest");
+    // Create the instance
+    return new S7PayloadUserDataItemCyclicServicesSubscribeRequestBuilderImpl(
+        itemsCount, timeBase, timeFactor, item);
+  }
+
+  public static class S7PayloadUserDataItemCyclicServicesSubscribeRequestBuilderImpl
+      implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
+    private final int itemsCount;
+    private final TimeBase timeBase;
+    private final short timeFactor;
+    private final List<CycServiceItemType> item;
+
+    public S7PayloadUserDataItemCyclicServicesSubscribeRequestBuilderImpl(
+        int itemsCount, TimeBase timeBase, short timeFactor, List<CycServiceItemType> item) {
+      this.itemsCount = itemsCount;
+      this.timeBase = timeBase;
+      this.timeFactor = timeFactor;
+      this.item = item;
+    }
+
+    public S7PayloadUserDataItemCyclicServicesSubscribeRequest build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesSubscribeRequest
+          s7PayloadUserDataItemCyclicServicesSubscribeRequest =
+              new S7PayloadUserDataItemCyclicServicesSubscribeRequest(
+                  returnCode, transportSize, dataLength, itemsCount, timeBase, timeFactor, item);
+      return s7PayloadUserDataItemCyclicServicesSubscribeRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesSubscribeRequest)) {
+      return false;
+    }
+    S7PayloadUserDataItemCyclicServicesSubscribeRequest that =
+        (S7PayloadUserDataItemCyclicServicesSubscribeRequest) o;
+    return (getItemsCount() == that.getItemsCount())
+        && (getTimeBase() == that.getTimeBase())
+        && (getTimeFactor() == that.getTimeFactor())
+        && (getItem() == that.getItem())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(), getItemsCount(), getTimeBase(), getTimeFactor(), getItem());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeResponse.java
similarity index 51%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeResponse.java
index 43a3730ddb..bc9aae2598 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeResponse.java
@@ -35,42 +35,43 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCyclicServicesSubscribeResponse extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
+  }
+
   public Byte getCpuFunctionType() {
-    return (byte) 0x04;
+    return (byte) 0x08;
   }
 
   public Short getCpuSubfunction() {
     return (short) 0x01;
   }
 
-  public Integer getDataLength() {
-    return 0;
-  }
-
   // Properties.
-  protected final SzlId szlId;
-  protected final int szlIndex;
+  protected final int itemsCount;
+  protected final List<AssociatedValueType> items;
 
-  public S7PayloadUserDataItemCpuFunctionReadSzlRequest(
+  public S7PayloadUserDataItemCyclicServicesSubscribeResponse(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      SzlId szlId,
-      int szlIndex) {
-    super(returnCode, transportSize);
-    this.szlId = szlId;
-    this.szlIndex = szlIndex;
+      int dataLength,
+      int itemsCount,
+      List<AssociatedValueType> items) {
+    super(returnCode, transportSize, dataLength);
+    this.itemsCount = itemsCount;
+    this.items = items;
   }
 
-  public SzlId getSzlId() {
-    return szlId;
+  public int getItemsCount() {
+    return itemsCount;
   }
 
-  public int getSzlIndex() {
-    return szlIndex;
+  public List<AssociatedValueType> getItems() {
+    return items;
   }
 
   @Override
@@ -79,15 +80,15 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesSubscribeResponse");
 
-    // Simple Field (szlId)
-    writeSimpleField("szlId", szlId, new DataWriterComplexDefault<>(writeBuffer));
+    // Simple Field (itemsCount)
+    writeSimpleField("itemsCount", itemsCount, writeUnsignedInt(writeBuffer, 16));
 
-    // Simple Field (szlIndex)
-    writeSimpleField("szlIndex", szlIndex, writeUnsignedInt(writeBuffer, 16));
+    // Array Field (items)
+    writeComplexTypeArrayField("items", items, writeBuffer);
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesSubscribeResponse");
   }
 
   @Override
@@ -98,55 +99,65 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest _value = this;
+    S7PayloadUserDataItemCyclicServicesSubscribeResponse _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (szlId)
-    lengthInBits += szlId.getLengthInBits();
-
-    // Simple field (szlIndex)
+    // Simple field (itemsCount)
     lengthInBits += 16;
 
+    // Array field
+    if (items != null) {
+      int i = 0;
+      for (AssociatedValueType element : items) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= items.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesSubscribeResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    SzlId szlId =
-        readSimpleField(
-            "szlId",
-            new DataReaderComplexDefault<>(() -> SzlId.staticParse(readBuffer), readBuffer));
+    int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
 
-    int szlIndex = readSimpleField("szlIndex", readUnsignedInt(readBuffer, 16));
+    List<AssociatedValueType> items =
+        readCountArrayField(
+            "items",
+            new DataReaderComplexDefault<>(
+                () -> AssociatedValueType.staticParse(readBuffer), readBuffer),
+            itemsCount);
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesSubscribeResponse");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(szlId, szlIndex);
+    return new S7PayloadUserDataItemCyclicServicesSubscribeResponseBuilderImpl(itemsCount, items);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl
+  public static class S7PayloadUserDataItemCyclicServicesSubscribeResponseBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final SzlId szlId;
-    private final int szlIndex;
+    private final int itemsCount;
+    private final List<AssociatedValueType> items;
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(SzlId szlId, int szlIndex) {
-      this.szlId = szlId;
-      this.szlIndex = szlIndex;
+    public S7PayloadUserDataItemCyclicServicesSubscribeResponseBuilderImpl(
+        int itemsCount, List<AssociatedValueType> items) {
+      this.itemsCount = itemsCount;
+      this.items = items;
     }
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequest build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionReadSzlRequest
-          s7PayloadUserDataItemCpuFunctionReadSzlRequest =
-              new S7PayloadUserDataItemCpuFunctionReadSzlRequest(
-                  returnCode, transportSize, szlId, szlIndex);
-      return s7PayloadUserDataItemCpuFunctionReadSzlRequest;
+    public S7PayloadUserDataItemCyclicServicesSubscribeResponse build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesSubscribeResponse
+          s7PayloadUserDataItemCyclicServicesSubscribeResponse =
+              new S7PayloadUserDataItemCyclicServicesSubscribeResponse(
+                  returnCode, transportSize, dataLength, itemsCount, items);
+      return s7PayloadUserDataItemCyclicServicesSubscribeResponse;
     }
   }
 
@@ -155,20 +166,20 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionReadSzlRequest)) {
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesSubscribeResponse)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest that =
-        (S7PayloadUserDataItemCpuFunctionReadSzlRequest) o;
-    return (getSzlId() == that.getSzlId())
-        && (getSzlIndex() == that.getSzlIndex())
+    S7PayloadUserDataItemCyclicServicesSubscribeResponse that =
+        (S7PayloadUserDataItemCyclicServicesSubscribeResponse) o;
+    return (getItemsCount() == that.getItemsCount())
+        && (getItems() == that.getItems())
         && super.equals(that)
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getSzlId(), getSzlIndex());
+    return Objects.hash(super.hashCode(), getItemsCount(), getItems());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeRequest.java
similarity index 55%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeRequest.java
index 43a3730ddb..b1b484f92c 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeRequest.java
@@ -35,42 +35,43 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCyclicServicesUnsubscribeRequest extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x04;
   }
 
   public Short getCpuSubfunction() {
-    return (short) 0x01;
-  }
-
-  public Integer getDataLength() {
-    return 0;
+    return (short) 0x04;
   }
 
   // Properties.
-  protected final SzlId szlId;
-  protected final int szlIndex;
+  protected final short function;
+  protected final short jobId;
 
-  public S7PayloadUserDataItemCpuFunctionReadSzlRequest(
+  public S7PayloadUserDataItemCyclicServicesUnsubscribeRequest(
       DataTransportErrorCode returnCode,
       DataTransportSize transportSize,
-      SzlId szlId,
-      int szlIndex) {
-    super(returnCode, transportSize);
-    this.szlId = szlId;
-    this.szlIndex = szlIndex;
+      int dataLength,
+      short function,
+      short jobId) {
+    super(returnCode, transportSize, dataLength);
+    this.function = function;
+    this.jobId = jobId;
   }
 
-  public SzlId getSzlId() {
-    return szlId;
+  public short getFunction() {
+    return function;
   }
 
-  public int getSzlIndex() {
-    return szlIndex;
+  public short getJobId() {
+    return jobId;
   }
 
   @Override
@@ -79,15 +80,15 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesUnsubscribeRequest");
 
-    // Simple Field (szlId)
-    writeSimpleField("szlId", szlId, new DataWriterComplexDefault<>(writeBuffer));
+    // Simple Field (function)
+    writeSimpleField("function", function, writeUnsignedShort(writeBuffer, 8));
 
-    // Simple Field (szlIndex)
-    writeSimpleField("szlIndex", szlIndex, writeUnsignedInt(writeBuffer, 16));
+    // Simple Field (jobId)
+    writeSimpleField("jobId", jobId, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesUnsubscribeRequest");
   }
 
   @Override
@@ -98,55 +99,54 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest _value = this;
+    S7PayloadUserDataItemCyclicServicesUnsubscribeRequest _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (szlId)
-    lengthInBits += szlId.getLengthInBits();
+    // Simple field (function)
+    lengthInBits += 8;
 
-    // Simple field (szlIndex)
-    lengthInBits += 16;
+    // Simple field (jobId)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesUnsubscribeRequest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    SzlId szlId =
-        readSimpleField(
-            "szlId",
-            new DataReaderComplexDefault<>(() -> SzlId.staticParse(readBuffer), readBuffer));
+    short function = readSimpleField("function", readUnsignedShort(readBuffer, 8));
 
-    int szlIndex = readSimpleField("szlIndex", readUnsignedInt(readBuffer, 16));
+    short jobId = readSimpleField("jobId", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesUnsubscribeRequest");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(szlId, szlIndex);
+    return new S7PayloadUserDataItemCyclicServicesUnsubscribeRequestBuilderImpl(function, jobId);
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl
+  public static class S7PayloadUserDataItemCyclicServicesUnsubscribeRequestBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
-    private final SzlId szlId;
-    private final int szlIndex;
+    private final short function;
+    private final short jobId;
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequestBuilderImpl(SzlId szlId, int szlIndex) {
-      this.szlId = szlId;
-      this.szlIndex = szlIndex;
+    public S7PayloadUserDataItemCyclicServicesUnsubscribeRequestBuilderImpl(
+        short function, short jobId) {
+      this.function = function;
+      this.jobId = jobId;
     }
 
-    public S7PayloadUserDataItemCpuFunctionReadSzlRequest build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionReadSzlRequest
-          s7PayloadUserDataItemCpuFunctionReadSzlRequest =
-              new S7PayloadUserDataItemCpuFunctionReadSzlRequest(
-                  returnCode, transportSize, szlId, szlIndex);
-      return s7PayloadUserDataItemCpuFunctionReadSzlRequest;
+    public S7PayloadUserDataItemCyclicServicesUnsubscribeRequest build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesUnsubscribeRequest
+          s7PayloadUserDataItemCyclicServicesUnsubscribeRequest =
+              new S7PayloadUserDataItemCyclicServicesUnsubscribeRequest(
+                  returnCode, transportSize, dataLength, function, jobId);
+      return s7PayloadUserDataItemCyclicServicesUnsubscribeRequest;
     }
   }
 
@@ -155,20 +155,20 @@ public class S7PayloadUserDataItemCpuFunctionReadSzlRequest extends S7PayloadUse
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionReadSzlRequest)) {
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesUnsubscribeRequest)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionReadSzlRequest that =
-        (S7PayloadUserDataItemCpuFunctionReadSzlRequest) o;
-    return (getSzlId() == that.getSzlId())
-        && (getSzlIndex() == that.getSzlIndex())
+    S7PayloadUserDataItemCyclicServicesUnsubscribeRequest that =
+        (S7PayloadUserDataItemCyclicServicesUnsubscribeRequest) o;
+    return (getFunction() == that.getFunction())
+        && (getJobId() == that.getJobId())
         && super.equals(that)
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getSzlId(), getSzlIndex());
+    return Objects.hash(super.hashCode(), getFunction(), getJobId());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeResponse.java
similarity index 66%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeResponse.java
index 6b7558f547..47608319a0 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeResponse.java
@@ -35,25 +35,25 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7PayloadUserDataItem
+public class S7PayloadUserDataItemCyclicServicesUnsubscribeResponse extends S7PayloadUserDataItem
     implements Message {
 
   // Accessors for discriminator values.
+  public Byte getCpuFunctionGroup() {
+    return (byte) 0x02;
+  }
+
   public Byte getCpuFunctionType() {
     return (byte) 0x08;
   }
 
   public Short getCpuSubfunction() {
-    return (short) 0x02;
-  }
-
-  public Integer getDataLength() {
-    return (int) 0x00;
+    return (short) 0x04;
   }
 
-  public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-      DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-    super(returnCode, transportSize);
+  public S7PayloadUserDataItemCyclicServicesUnsubscribeResponse(
+      DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+    super(returnCode, transportSize, dataLength);
   }
 
   @Override
@@ -62,9 +62,9 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
   }
 
   @Override
@@ -75,37 +75,38 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse _value = this;
+    S7PayloadUserDataItemCyclicServicesUnsubscribeResponse _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     return lengthInBits;
   }
 
   public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+      ReadBuffer readBuffer, Byte cpuFunctionGroup, Byte cpuFunctionType, Short cpuSubfunction)
+      throws ParseException {
+    readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
     // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl();
+    return new S7PayloadUserDataItemCyclicServicesUnsubscribeResponseBuilderImpl();
   }
 
-  public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl
+  public static class S7PayloadUserDataItemCyclicServicesUnsubscribeResponseBuilderImpl
       implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl() {}
+    public S7PayloadUserDataItemCyclicServicesUnsubscribeResponseBuilderImpl() {}
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
-          s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse =
-              new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-                  returnCode, transportSize);
-      return s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse;
+    public S7PayloadUserDataItemCyclicServicesUnsubscribeResponse build(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize, int dataLength) {
+      S7PayloadUserDataItemCyclicServicesUnsubscribeResponse
+          s7PayloadUserDataItemCyclicServicesUnsubscribeResponse =
+              new S7PayloadUserDataItemCyclicServicesUnsubscribeResponse(
+                  returnCode, transportSize, dataLength);
+      return s7PayloadUserDataItemCyclicServicesUnsubscribeResponse;
     }
   }
 
@@ -114,11 +115,11 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse)) {
+    if (!(o instanceof S7PayloadUserDataItemCyclicServicesUnsubscribeResponse)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse that =
-        (S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse) o;
+    S7PayloadUserDataItemCyclicServicesUnsubscribeResponse that =
+        (S7PayloadUserDataItemCyclicServicesUnsubscribeResponse) o;
     return super.equals(that) && true;
   }
 
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
index 0d6c861cb2..4483814eac 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
@@ -104,7 +104,7 @@ public class S7VarPayloadDataItem implements Message {
     // Padding Field (padding)
     writePaddingField(
         "padding",
-	(int) ((((!(_lastItem))) ? ((COUNT(data)) % (2)) : 0)),
+        (int) ((((!(_lastItem))) ? ((COUNT(data)) % (2)) : 0)),
         (short) 0x00,
         writeUnsignedShort(writeBuffer, 8));
 
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SubItem.java
similarity index 53%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SubItem.java
index 6b7558f547..ef70ef5de5 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SubItem.java
@@ -35,36 +35,48 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7PayloadUserDataItem
-    implements Message {
-
-  // Accessors for discriminator values.
-  public Byte getCpuFunctionType() {
-    return (byte) 0x08;
+public class SubItem implements Message {
+
+  // Properties.
+  protected final short bytesToRead;
+  protected final int dbNumber;
+  protected final int startAddress;
+
+  public SubItem(short bytesToRead, int dbNumber, int startAddress) {
+    super();
+    this.bytesToRead = bytesToRead;
+    this.dbNumber = dbNumber;
+    this.startAddress = startAddress;
   }
 
-  public Short getCpuSubfunction() {
-    return (short) 0x02;
+  public short getBytesToRead() {
+    return bytesToRead;
   }
 
-  public Integer getDataLength() {
-    return (int) 0x00;
+  public int getDbNumber() {
+    return dbNumber;
   }
 
-  public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-      DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-    super(returnCode, transportSize);
+  public int getStartAddress() {
+    return startAddress;
   }
 
-  @Override
-  protected void serializeS7PayloadUserDataItemChild(WriteBuffer writeBuffer)
-      throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    writeBuffer.pushContext("SubItem");
+
+    // Simple Field (bytesToRead)
+    writeSimpleField("bytesToRead", bytesToRead, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (dbNumber)
+    writeSimpleField("dbNumber", dbNumber, writeUnsignedInt(writeBuffer, 16));
 
-    writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+    // Simple Field (startAddress)
+    writeSimpleField("startAddress", startAddress, writeUnsignedInt(writeBuffer, 16));
+
+    writeBuffer.popContext("SubItem");
   }
 
   @Override
@@ -74,39 +86,45 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse _value = this;
+    int lengthInBits = 0;
+    SubItem _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
+    // Simple field (bytesToRead)
+    lengthInBits += 8;
+
+    // Simple field (dbNumber)
+    lengthInBits += 16;
+
+    // Simple field (startAddress)
+    lengthInBits += 16;
+
     return lengthInBits;
   }
 
-  public static S7PayloadUserDataItemBuilder staticParseS7PayloadUserDataItemBuilder(
-      ReadBuffer readBuffer, Byte cpuFunctionType, Short cpuSubfunction) throws ParseException {
-    readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
+  public static SubItem staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static SubItem staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SubItem");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
-    // Create the instance
-    return new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl();
-  }
+    short bytesToRead = readSimpleField("bytesToRead", readUnsignedShort(readBuffer, 8));
 
-  public static class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl
-      implements S7PayloadUserDataItem.S7PayloadUserDataItemBuilder {
+    int dbNumber = readSimpleField("dbNumber", readUnsignedInt(readBuffer, 16));
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponseBuilderImpl() {}
+    int startAddress = readSimpleField("startAddress", readUnsignedInt(readBuffer, 16));
 
-    public S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse build(
-        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
-      S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
-          s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse =
-              new S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse(
-                  returnCode, transportSize);
-      return s7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse;
-    }
+    readBuffer.closeContext("SubItem");
+    // Create the instance
+    SubItem _subItem;
+    _subItem = new SubItem(bytesToRead, dbNumber, startAddress);
+    return _subItem;
   }
 
   @Override
@@ -114,17 +132,19 @@ public class S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse extends S7P
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse)) {
+    if (!(o instanceof SubItem)) {
       return false;
     }
-    S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse that =
-        (S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse) o;
-    return super.equals(that) && true;
+    SubItem that = (SubItem) o;
+    return (getBytesToRead() == that.getBytesToRead())
+        && (getDbNumber() == that.getDbNumber())
+        && (getStartAddress() == that.getStartAddress())
+        && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(getBytesToRead(), getDbNumber(), getStartAddress());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java
index 2312b3295c..9c16e277e7 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java
@@ -24,6 +24,7 @@ import java.util.Map;
 // Code generated by code-generation. DO NOT EDIT.
 
 public enum SzlSublist {
+  NONE((short) 0x00),
   MODULE_IDENTIFICATION((short) 0x11),
   CPU_FEATURES((short) 0x12),
   USER_MEMORY_AREA((short) 0x13),
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TimeBase.java
similarity index 81%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
copy to plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TimeBase.java
index 1cf788f756..2552f37219 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TimeBase.java
@@ -23,22 +23,22 @@ import java.util.Map;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public enum QueryType {
-  BYALARMTYPE((short) 0x01),
-  ALARM_8((short) 0x02),
-  ALARM_S((short) 0x04);
-  private static final Map<Short, QueryType> map;
+public enum TimeBase {
+  B01SEC((short) 0x00),
+  B1SEC((short) 0x01),
+  B10SEC((short) 0X02);
+  private static final Map<Short, TimeBase> map;
 
   static {
     map = new HashMap<>();
-    for (QueryType value : QueryType.values()) {
+    for (TimeBase value : TimeBase.values()) {
       map.put((short) value.getValue(), value);
     }
   }
 
   private short value;
 
-  QueryType(short value) {
+  TimeBase(short value) {
     this.value = value;
   }
 
@@ -46,7 +46,7 @@ public enum QueryType {
     return value;
   }
 
-  public static QueryType enumForValue(short value) {
+  public static TimeBase enumForValue(short value) {
     return map.get(value);
   }
 
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7CyclicEvent.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7CyclicEvent.java
new file mode 100644
index 0000000000..9ca081a0bc
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7CyclicEvent.java
@@ -0,0 +1,607 @@
+/*
+ * 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.s7.events;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.charset.Charset;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.s7.readwrite.S7PayloadUserDataItemCyclicServicesChangeDrivenPush;
+import org.apache.plc4x.java.s7.readwrite.S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse;
+import org.apache.plc4x.java.s7.readwrite.S7PayloadUserDataItemCyclicServicesPush;
+import org.apache.plc4x.java.s7.readwrite.S7PayloadUserDataItemCyclicServicesSubscribeResponse;
+
+/**
+ *
+ * @author cgarcia
+ */
+public class S7CyclicEvent implements S7Event {
+
+    public enum Fields{
+        TYPE,
+        JOBID,
+        TIMESTAMP,        
+        ITEMSCOUNT,
+        REQUEST,
+        MAP,
+        RETURNCODE_,
+        TRANSPORTSIZE_,
+        DATA_
+    }    
+    
+    private final PlcSubscriptionRequest request;
+    
+    private final Instant timeStamp;
+    private final Map<String, Object> map;    
+    
+    private int j;
+    
+    public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesPush event) {
+        this.map = new HashMap();
+        this.timeStamp = Instant.now(); 
+        this.request = request;
+        map.put(Fields.TYPE.name(), "CYCEVENT");         
+        map.put(Fields.TIMESTAMP.name(),this.timeStamp);
+        map.put(Fields.JOBID.name(), jobid);
+        map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());        
+        for (int i=0; i<event.getItemsCount(); i++){
+            //map.put(Fields.RETURNCODE_.name()+i, event.getItems()[i].getReturnCode().getValue());
+            map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+            map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+            byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+            j = 0;
+            event.getItems().get(i).getData().forEach(s->{
+                    buffer[j] = s.byteValue();
+                    j ++;                
+                });
+            map.put(Fields.DATA_.name()+i, buffer);  
+        }
+    }
+    
+    public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesChangeDrivenPush event) {
+        this.map = new HashMap();
+        this.timeStamp = Instant.now(); 
+        this.request = request;
+        map.put(Fields.TYPE.name(), "CYCEVENT");         
+        map.put(Fields.TIMESTAMP.name(),this.timeStamp);
+        map.put(Fields.JOBID.name(), jobid);
+        map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());        
+        for (int i=0; i<event.getItemsCount(); i++){
+            map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+            map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+            byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+            j = 0;
+            event.getItems().get(i).getData().forEach(s->{
+                    buffer[j] = s.byteValue();
+                    j ++;                
+                });
+            map.put(Fields.DATA_.name()+i, buffer);  
+        }
+    }    
+    
+    public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesSubscribeResponse event) {
+        this.map = new HashMap();
+        this.timeStamp = Instant.now(); 
+        this.request = request;
+        map.put(Fields.TYPE.name(), "CYCEVENT");         
+        map.put(Fields.TIMESTAMP.name(),this.timeStamp);
+        map.put(Fields.JOBID.name(), jobid);
+        map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
+        for (int i=0; i<event.getItemsCount(); i++){
+            map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+            map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+            byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+            j = 0;
+            event.getItems().get(i).getData().forEach(s->{
+                    buffer[j] = s.byteValue();
+                    j ++;                
+                });
+            map.put(Fields.DATA_.name()+i, buffer); 
+        }            
+    }
+
+    public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse event) {
+        this.map = new HashMap();
+        this.timeStamp = Instant.now(); 
+        this.request = request;
+        map.put(Fields.TYPE.name(), "CYCEVENT");         
+        map.put(Fields.TIMESTAMP.name(),this.timeStamp);
+        map.put(Fields.JOBID.name(), jobid);
+        map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
+        for (int i=0; i<event.getItemsCount(); i++){
+            map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+            map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+            byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+            j = 0;
+            event.getItems().get(i).getData().forEach(s->{
+                    buffer[j] = s.byteValue();
+                    j ++;                
+                });
+            map.put(Fields.DATA_.name()+i, buffer); 
+        }            
+    }    
+    
+    @Override
+    public Map<String, Object> getMap() {
+        return this.map;
+    }
+
+    @Override
+    public Instant getTimestamp() {
+        return this.timeStamp;
+    }
+
+    @Override
+    public PlcReadRequest getRequest() {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public PlcValue getAsPlcValue() {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public PlcValue getPlcValue(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public int getNumberOfValues(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Object getObject(String name) {
+        if ("REQUEST".equals(name)) return request;
+        return null;
+    }
+
+    @Override
+    public Object getObject(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<Object> getAllObjects(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidBoolean(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidBoolean(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Boolean getBoolean(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Boolean getBoolean(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<Boolean> getAllBooleans(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidByte(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidByte(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Byte getByte(String name) {
+       if (!(map.get(name) instanceof Byte)) 
+            throw new UnsupportedOperationException("Field is not a Byte. Required Byte type.");
+        return (byte) map.get(name);
+    }
+
+    @Override
+    public Byte getByte(String name, int index) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");     
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        int pos = index*Byte.BYTES;
+        return byteBuf.getByte(pos);
+    }
+
+    @Override
+    public Collection<Byte> getAllBytes(String name) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+        byte[] array = (byte[]) map.get(name);
+        
+        List<Byte> list = IntStream.range(0, array.length).
+                mapToObj(i -> array[i]).collect(Collectors.toList());
+        
+        return list;
+    }
+
+    @Override
+    public boolean isValidShort(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidShort(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Short getShort(String name) {
+        if (!(map.get(name) instanceof Short)) return null;
+        return (short) map.get(name);
+    }
+
+    @Override
+    public Short getShort(String name, int index) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");    
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        int pos = index*Short.BYTES;
+        return byteBuf.getShort(index);
+    }
+
+    @Override
+    public Collection<Short> getAllShorts(String name) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        List<Short> list = new ArrayList();
+        while(byteBuf.isReadable(Short.BYTES)) list.add(byteBuf.readShort());        
+        return list;
+    }
+
+    @Override
+    public boolean isValidInteger(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidInteger(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Integer getInteger(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Integer getInteger(String name, int index) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");     
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        int pos = index*Integer.BYTES;
+        return byteBuf.getInt(pos);
+    }
+
+    @Override
+    public Collection<Integer> getAllIntegers(String name) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");        
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        List<Integer> list = new ArrayList();
+        while(byteBuf.isReadable(Integer.BYTES)) list.add(byteBuf.readInt());        
+        return list;
+    }
+
+    @Override
+    public boolean isValidBigInteger(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidBigInteger(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public BigInteger getBigInteger(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public BigInteger getBigInteger(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<BigInteger> getAllBigIntegers(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidLong(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidLong(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Long getLong(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Long getLong(String name, int index) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");     
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        int pos = index*Long.BYTES;
+        return byteBuf.getLong(pos);
+    }
+
+    @Override
+    public Collection<Long> getAllLongs(String name) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");     
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        List<Long> list = new ArrayList();
+        while(byteBuf.isReadable(Long.BYTES)) list.add(byteBuf.readLong());        
+        return list;
+    }
+
+    @Override
+    public boolean isValidFloat(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidFloat(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Float getFloat(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Float getFloat(String name, int index) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");     
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        int pos = index*Float.BYTES;
+        return byteBuf.getFloat(pos);
+    }
+
+    @Override
+    public Collection<Float> getAllFloats(String name) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");       
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        List<Float> list = new ArrayList();
+        while(byteBuf.isReadable(Float.BYTES)) list.add(byteBuf.readFloat());        
+        return list;
+    }
+
+    @Override
+    public boolean isValidDouble(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidDouble(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Double getDouble(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Double getDouble(String name, int index) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");    
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        int pos = index*Double.BYTES;
+        return byteBuf.getDouble(pos);
+    }
+
+    @Override
+    public Collection<Double> getAllDoubles(String name) {
+       if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");      
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        List<Double> list = new ArrayList();
+        while(byteBuf.isReadable(Double.BYTES)) list.add(byteBuf.readDouble());        
+        return list;
+    }
+
+    @Override
+    public boolean isValidBigDecimal(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidBigDecimal(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<BigDecimal> getAllBigDecimals(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidString(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidString(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public String getString(String name) {
+        if (!(map.get(name) instanceof byte[])) 
+            throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+        ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+        return byteBuf.toString(Charset.defaultCharset());
+    }
+
+    @Override
+    public String getString(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<String> getAllStrings(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidTime(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidTime(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public LocalTime getTime(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public LocalTime getTime(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<LocalTime> getAllTimes(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidDate(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidDate(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public LocalDate getDate(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public LocalDate getDate(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<LocalDate> getAllDates(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidDateTime(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public boolean isValidDateTime(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public LocalDateTime getDateTime(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public LocalDateTime getDateTime(String name, int index) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<LocalDateTime> getAllDateTimes(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+
+    @Override
+    public Collection<String> getTagNames() {
+        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+    }
+
+    @Override
+    public PlcTag getTag(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+    }      
+
+    @Override
+    public PlcResponseCode getResponseCode(String name) {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }  
+  
+    
+}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
index 120c96ee69..d33ca435be 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
@@ -34,6 +34,7 @@ import org.apache.plc4x.java.spi.messages.utils.TagValueItem;
 import org.apache.plc4x.java.spi.optimizer.BaseOptimizer;
 
 import java.util.*;
+import org.apache.plc4x.java.s7.readwrite.tag.S7SzlTag;
 
 public class S7Optimizer extends BaseOptimizer {
 
@@ -62,6 +63,12 @@ public class S7Optimizer extends BaseOptimizer {
         LinkedHashMap<String, PlcTag> curTags = new LinkedHashMap<>();
 
         for (String tagName : readRequest.getTagNames()) {
+            
+            if (readRequest.getTag(tagName) instanceof S7SzlTag){
+                curTags.put(tagName, readRequest.getTag(tagName));
+                continue;
+            }
+            
             S7Tag tag = (S7Tag) readRequest.getTag(tagName);
 
             int readRequestItemSize = S7_ADDRESS_ANY_SIZE;
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
index a46b496bdb..56835b7e17 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
@@ -36,6 +36,7 @@ import org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse;
 import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
 import org.apache.plc4x.java.s7.events.S7AlarmEvent;
+import org.apache.plc4x.java.s7.events.S7CyclicEvent;
 import org.apache.plc4x.java.s7.events.S7ModeEvent;
 import org.apache.plc4x.java.s7.events.S7SysEvent;
 import org.apache.plc4x.java.s7.events.S7UserEvent;
@@ -119,7 +120,7 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
         private final BlockingQueue eventqueue;
         private final BlockingQueue dispathqueue;        
         private boolean shutdown = false;
-        private int delay = 5000;
+        private int delay = 100;
         
         public ObjectProcessor(BlockingQueue eventqueue, BlockingQueue dispathqueue) {
             this.eventqueue = eventqueue;
@@ -145,6 +146,9 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
                                 S7SysEvent sysevent = new S7SysEvent(msg);
                                 dispathqueue.add(sysevent);
                             }
+                        } else                           
+                        if (obj instanceof S7CyclicEvent){
+                                dispathqueue.add(obj);  
                         } else {
                             S7AlarmEvent alarmevent = new S7AlarmEvent(obj);
                             dispathqueue.add(alarmevent);
@@ -165,7 +169,8 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
     private class EventDispacher implements Runnable {
         private final BlockingQueue dispachqueue; 
         private boolean shutdown = false;
-        private int delay = 5000;  
+        private int delay = 100;  
+        private Object cycDelayedObject = null;        
 
         public EventDispacher(BlockingQueue dispachqueue) {
             this.dispachqueue = dispachqueue;
@@ -173,6 +178,11 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
         
         @Override
         public void run() {
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException ex) {
+                logger.warn(ex.toString());
+            }
             while(!shutdown){
                 try {
                     Object obj = dispachqueue.poll(delay, TimeUnit.MILLISECONDS);
@@ -197,6 +207,17 @@ public class S7ProtocolEventLogic implements PlcSubscriber {
                                 Map<PlcConsumerRegistration, Consumer> mapConsumers = mapIndex.get(EventType.ALM);
                                 mapConsumers.forEach((x,y) -> y.accept(obj)); 
                             }
+                        }else if (obj instanceof S7CyclicEvent) {  
+                            if (mapIndex.containsKey(EventType.CYC)) {
+                                Map<PlcConsumerRegistration, Consumer> mapConsumers = mapIndex.get(EventType.CYC);
+                                    if (cycDelayedObject != null) {                                                                          
+                                        mapConsumers.forEach((x,y) -> y.accept(cycDelayedObject)); 
+                                        cycDelayedObject = null;
+                                    }                                                                       
+                                    mapConsumers.forEach((x,y) -> y.accept(obj)); 
+                            } else {
+                                cycDelayedObject = obj;
+                            }                           
                         }                         
                     }
                 } catch (Exception ex) {
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
index eb3ed7afed..deb30e57af 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
@@ -21,6 +21,7 @@ package org.apache.plc4x.java.s7.readwrite.protocol;
 import org.apache.plc4x.java.api.model.PlcTag;
 import org.apache.plc4x.java.s7.readwrite.utils.S7PlcSubscriptionHandle;
 import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
 import io.netty.buffer.Unpooled;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
@@ -53,6 +54,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
 import java.time.Duration;
 import java.util.*;
 import java.util.concurrent.ArrayBlockingQueue;
@@ -73,10 +75,17 @@ import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
 import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
 import org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse;
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
+import org.apache.plc4x.java.api.model.PlcSubscriptionTag;
+import org.apache.plc4x.java.s7.events.S7CyclicEvent;
+import org.apache.plc4x.java.s7.readwrite.tag.S7AckTag;
 import org.apache.plc4x.java.s7.readwrite.tag.S7SubscriptionTag;
+import org.apache.plc4x.java.s7.readwrite.tag.S7SzlTag;
+import org.apache.plc4x.java.s7.utils.S7ParamErrorCode;
 import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionRequest;
 import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionResponse;
 import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionRequest;
+import org.apache.plc4x.java.spi.values.PlcList;
+import org.apache.plc4x.java.spi.values.PlcSINT;
 
 /**
  * The S7 Protocol states that there can not be more then {min(maxAmqCaller, maxAmqCallee} "ongoing" requests.
@@ -84,10 +93,10 @@ import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionRequest;
  * Thus, each request goes to a Work Queue and this Queue ensures, that only 3 are open at the same time.
  */
 public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
-
-    public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
-
+    
     private final Logger logger = LoggerFactory.getLogger(S7ProtocolLogic.class);
+    
+    public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
     private final AtomicInteger tpduGenerator = new AtomicInteger(10);
     
     /*
@@ -107,12 +116,13 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
      * (Examples of this are PCS7 and Braumat).
      * Alarm filtering, ack, etc. must be performed by the client application.
      */
-    private final BlockingQueue<Message> eventQueue = new ArrayBlockingQueue<>(1024);
+    private final BlockingQueue eventQueue = new ArrayBlockingQueue<>(1024);
     private final S7ProtocolEventLogic EventLogic = new S7ProtocolEventLogic(eventQueue);
     private final S7PlcSubscriptionHandle modeHandle = new S7PlcSubscriptionHandle(EventType.MODE, EventLogic);
     private final S7PlcSubscriptionHandle sysHandle = new S7PlcSubscriptionHandle(EventType.SYS, EventLogic);
     private final S7PlcSubscriptionHandle usrHandle = new S7PlcSubscriptionHandle(EventType.USR, EventLogic);
     private final S7PlcSubscriptionHandle almHandle = new S7PlcSubscriptionHandle(EventType.ALM, EventLogic);
+    private final S7PlcSubscriptionHandle cycHandle = new S7PlcSubscriptionHandle(EventType.CYC,EventLogic);    
 
     /*
     * For the reconnection functionality by a "TimeOut" of the connection,
@@ -250,8 +260,44 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
    
     @Override
     public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
+        if (!isConnected()) {
+            CompletableFuture<PlcReadResponse> future = new CompletableFuture<PlcReadResponse>();
+            future.completeExceptionally(new PlcRuntimeException("Disconnected"));                       
+            return future;
+        }        
         DefaultPlcReadRequest request = (DefaultPlcReadRequest) readRequest;
         List<S7VarRequestParameterItem> requestItems = new ArrayList<>(request.getNumberOfTags());
+        
+        if (request.getTags().get(0) instanceof S7SzlTag) {
+            S7SzlTag szltag = (S7SzlTag) request.getTags().get(0);
+            
+            final S7MessageUserData s7SzlMessageRequest = new S7MessageUserData(1, new S7ParameterUserData(Arrays.asList(
+                new S7ParameterUserDataItemCPUFunctions((short) 0x11, (byte) 0x4, (byte) 0x4, (short) 0x01, (short) 0x00, null, null, null)
+            )), new S7PayloadUserData(Arrays.asList(
+                new S7PayloadUserDataItemCpuFunctionReadSzlRequest(DataTransportErrorCode.OK, 
+                        DataTransportSize.OCTET_STRING, 
+                        0x04,
+                        new SzlId(SzlModuleTypeClass.enumForValue((byte) ((szltag.getSzlId() & 0xf000) >> 12)), 
+                                (byte) ((szltag.getSzlId() & 0x0f00) >> 8), 
+                                SzlSublist.enumForValue((short) (szltag.getSzlId() & 0x00ff))), 
+                        szltag.getIndex())
+            )));     
+
+            return toPlcReadResponse(readRequest, readInternal(s7SzlMessageRequest));   
+            
+        } else if (request.getTags().get(0) instanceof S7AckTag) {
+            
+            List<S7ParameterUserDataItem> parameterItems = new ArrayList<>(request.getNumberOfTags());
+            List<S7PayloadUserDataItem> payloadItems = new ArrayList<>(request.getNumberOfTags());
+            encodeAlarmAckRequest(request, parameterItems, payloadItems);
+            final S7MessageUserData s7MessageRequest = new S7MessageUserData(-1, 
+                new S7ParameterUserData(parameterItems),
+                new S7PayloadUserData(payloadItems));                    
+            return toPlcReadResponse(readRequest, readInternal(s7MessageRequest ));  
+            
+        }        
+        
+        
         for (PlcTag tag : request.getTags()) {
             requestItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag)));
         }
@@ -287,7 +333,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
      * Assumes that the {@link S7MessageRequest} and its expected {@link S7MessageResponseData}
      * and does not further check that!
      */
-    private CompletableFuture<S7Message> readInternal(S7MessageRequest request) {
+    private CompletableFuture<S7Message> readInternal(S7Message request) {
         CompletableFuture<S7Message> future = new CompletableFuture<>();
         int tpduId = tpduGenerator.getAndIncrement();
         // If we've reached the max value for a 16 bit transaction identifier, reset back to 1
@@ -295,10 +341,14 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
             tpduGenerator.set(1);
         }
 
-        // Create a new Request with correct tpuId (is not known before)
-        S7MessageRequest s7MessageRequest = new S7MessageRequest(tpduId, request.getParameter(), request.getPayload());
-
-        TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, s7MessageRequest, true, (short) tpduId));
+        S7Message message = (request instanceof S7MessageUserData) ?
+                             new S7MessageUserData(tpduId, request.getParameter(), request.getPayload()) :
+                             new S7MessageRequest(tpduId, request.getParameter(), request.getPayload());
+        
+        TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, message, true, (short) tpduId));
+        
+        System.out.println(tpktPacket.toString());
+        
         // Start a new request-transaction (Is ended in the response-handler)
         RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
         transaction.submit(() -> context.sendRequest(tpktPacket)
@@ -389,79 +439,145 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
 
     @Override
     public CompletableFuture<PlcSubscriptionResponse> subscribe(PlcSubscriptionRequest subscriptionRequest) {
-        CompletableFuture<PlcSubscriptionResponse> future = new CompletableFuture<>();
+        if (!isConnected()) {
+            CompletableFuture<PlcSubscriptionResponse> future = new CompletableFuture<PlcSubscriptionResponse>();
+            future.completeExceptionally(new PlcRuntimeException("Disconnected"));                       
+            return future;
+        } 
+        if (!isFeatureSupported()) {
+            CompletableFuture<PlcSubscriptionResponse> future = new CompletableFuture<PlcSubscriptionResponse>();
+            future.completeExceptionally(new PlcRuntimeException("Not Supported"));                       
+            return future;
+        }    
+        
+        CompletableFuture<PlcSubscriptionResponse> future = new CompletableFuture<>();        
+        HashMap<String, PlcSubscriptionResponse> valuesResponse = new HashMap<>();          
+        HashMap<String, CompletableFuture<S7Message>> futures = new HashMap<>();
+        
+        //Initialize multiple requests.
+        CompletableFuture<PlcSubscriptionResponse> response =  new CompletableFuture<>();
+        subscriptionRequest.getTagNames().forEach(fieldname -> futures.put(fieldname,  new CompletableFuture<>()));    
+        
 
         DefaultPlcSubscriptionRequest request = (DefaultPlcSubscriptionRequest) subscriptionRequest;
 
         List<S7ParameterUserDataItem> parameterItems = new ArrayList<>(request.getNumberOfTags());
         List<S7PayloadUserDataItem> payloadItems = new ArrayList<>(request.getNumberOfTags());
+        
+        //The main task that runs the subscriptions.
+        CompletableFuture<Void> maintask; 
+        maintask = CompletableFuture.
+                allOf(futures.values().toArray(new CompletableFuture[0]));        
+        
+        Thread t1 = new Thread(()->{
 
-        for (String tagName : request.getTagNames()) {
-            final DefaultPlcSubscriptionTag sf = (DefaultPlcSubscriptionTag) request.getTag(tagName);
-            final S7SubscriptionTag tag = (S7SubscriptionTag) sf.getTag();
-
-            switch (tag.getTagType()) {
-                case EVENT_SUBSCRIPTION:
-                    encodeEventSubscriptionRequest(request, parameterItems, payloadItems);
-                    break;
-                case EVENT_UNSUBSCRIPTION:
-                    //encodeEventUnSubscriptionRequest(msg, out);
-                    break;
-                case ALARM_ACK:
-                    //encodeAlarmAckRequest(msg, out);
-                    break;
-                case ALARM_QUERY:
-                    //encodeAlarmQueryRequest(msg, out);
-                    break;
-                case CYCLIC_SUBSCRIPTION:
-                    //encodeCycledSubscriptionRequest(msg, out);
-                    break;
-                case CYCLIC_UNSUBSCRIPTION:
-                    //encodeCycledUnSubscriptionRequest(msg, out);
-                    break;
-                default:
-            }
-            //final PlcValue plcValue = request.getPlcValue(tagName);
-            //parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag)));
-            //payloadItems.add(serializePlcValue(tag, plcValue));
-        }
-        final int tpduId = tpduGenerator.getAndIncrement();
-        // If we've reached the max value for a 16 bit transaction identifier, reset back to 1
-        if (tpduGenerator.get() == 0xFFFF) {
-            tpduGenerator.set(1);
-        }
+            for (String tagName : request.getTagNames()) {
+                final DefaultPlcSubscriptionTag sf = (DefaultPlcSubscriptionTag) request.getTag(tagName);
+                final S7SubscriptionTag tag = (S7SubscriptionTag) sf.getTag();
 
-        TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null,
-            new S7MessageUserData(tpduId,
-                new S7ParameterUserData(parameterItems),
-                new S7PayloadUserData(payloadItems)),
-            true, (short) tpduId));
+                switch (tag.getTagType()) {
+                    case EVENT_SUBSCRIPTION:
+                        encodeEventSubscriptionRequest(request, parameterItems, payloadItems);
+                        break;
+                    case EVENT_UNSUBSCRIPTION:
+                        //encodeEventUnSubscriptionRequest(request, parameterItems, payloadItems);
+                        break;
+                    case ALARM_ACK:
+                        //encodeAlarmAckRequest(request, parameterItems, payloadItems);
+                        break;
+                    case ALARM_QUERY:
+                        encodeAlarmQueryRequest(request, parameterItems, payloadItems);
+                        break;
+                    case CYCLIC_SUBSCRIPTION:
+                        encodeCycledS7ANYSubscriptionRequest(request.getTag(tagName), parameterItems, payloadItems);
+                        break;
+                    case CYCLIC_DB_SUBSCRIPTION:
+                        encodeCycledDBREADSubscriptionRequest(request.getTag(tagName), parameterItems, payloadItems);
+                        break;
+                    case CYCLIC_UNSUBSCRIPTION:
+                        //encodeCycledUnSubscriptionRequest(request, parameterItems, payloadItems);
+                        break;
+                    default:
+                }
+                //final PlcValue plcValue = request.getPlcValue(tagName);
+                //parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag)));
+                //payloadItems.add(serializePlcValue(tag, plcValue));
+                final int tpduId = tpduGenerator.getAndIncrement();
+                // If we've reached the max value for a 16 bit transaction identifier, reset back to 1
+                if (tpduGenerator.get() == 0xFFFF) {
+                    tpduGenerator.set(1);
+                }
 
-        // Start a new request-transaction (Is ended in the response-handler)
-        RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
-        transaction.submit(() -> context.sendRequest(tpktPacket)
-            .onTimeout(new TransactionErrorCallback<>(future, transaction))
-            .onError(new TransactionErrorCallback<>(future, transaction))
-            .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
-            .check(p -> p.getPayload() instanceof COTPPacketData)
-            .unwrap(p -> ((COTPPacketData) p.getPayload()))
-            .unwrap(COTPPacket::getPayload)
-            .check(p -> p.getTpduReference() == tpduId)
-            .handle(p -> {
+                TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null,
+                    new S7MessageUserData(tpduId,
+                        new S7ParameterUserData(parameterItems),
+                        new S7PayloadUserData(payloadItems)),
+                    true, (short) tpduId));
+
+                // Start a new request-transaction (Is ended in the response-handler)
+                RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
+                transaction.submit(() -> context.sendRequest(tpktPacket)
+                    .onTimeout(new TransactionErrorCallback<>(future, transaction))
+                    .onError(new TransactionErrorCallback<>(future, transaction))
+                    .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+                    .check(p -> p.getPayload() instanceof COTPPacketData)
+                    .unwrap(p -> ((COTPPacketData) p.getPayload()))
+                    .unwrap(COTPPacket::getPayload)
+                    .check(p -> p.getTpduReference() == tpduId)
+                    .handle(p -> {
+                        try {
+                            //future.complete(decodeEventSubscriptionRequest(tagName, p, subscriptionRequest));
+                            futures.get(tagName).complete(p);
+                        } catch (Exception e) {
+                            logger.warn("Error sending 'write' message: '{}'", e.getMessage(), e);
+                        }
+                        // Finish the request-transaction.
+                        transaction.endRequest();
+                    }));                
+                
                 try {
-                    future.complete(decodeEventSubscriptionRequest(p, subscriptionRequest));
-                } catch (PlcProtocolException e) {
-                    logger.warn("Error sending 'write' message: '{}'", e.getMessage(), e);
+                    valuesResponse.put(tagName, decodeEventSubscriptionRequest(tagName, subscriptionRequest, futures.get(tagName).get()));
+                } catch (Exception ex) {
+                    logger.warn(ex.toString());
                 }
-                // Finish the request-transaction.
-                transaction.endRequest();
-            }));
-        return future;
+                
+            } //Next
+            
+            try {
+                maintask.get();     
+                HashMap<String, ResponseItem<PlcSubscriptionHandle>> values = new HashMap<>();
+                
+                valuesResponse.forEach((s,p)->{
+                    if (p != null)
+                    values.putAll(((DefaultPlcSubscriptionResponse)p).getValues());                    
+                });          
+                
+                response.complete(new DefaultPlcSubscriptionResponse(subscriptionRequest, values));                
+
+            } catch (Exception ex) {
+                logger.warn(ex.getMessage());
+            }                  
+
+        });
+        
+        t1.start();
+        
+        return response;
     }
 
 
     @Override
     public CompletableFuture<PlcUnsubscriptionResponse> unsubscribe(PlcUnsubscriptionRequest unsubscriptionRequest) {
+        if (!isConnected()) {
+            CompletableFuture<PlcUnsubscriptionResponse> future = new CompletableFuture<PlcUnsubscriptionResponse>();
+            future.completeExceptionally(new PlcRuntimeException("Disconnected"));                       
+            return future;
+        }      
+        if (!isFeatureSupported()) {
+            CompletableFuture<PlcUnsubscriptionResponse> future = new CompletableFuture<PlcUnsubscriptionResponse>();
+            future.completeExceptionally(new PlcRuntimeException("Not Supported"));                       
+            return future;
+        }          
         CompletableFuture<PlcUnsubscriptionResponse> future = new CompletableFuture<>();
         DefaultPlcUnsubscriptionRequest request = (DefaultPlcUnsubscriptionRequest) unsubscriptionRequest;
 
@@ -471,12 +587,12 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
     private void encodeEventSubscriptionRequest(DefaultPlcSubscriptionRequest request,
                                                 List<S7ParameterUserDataItem> parameterItems,
                                                 List<S7PayloadUserDataItem> payloadItems) {
-        byte subsevent = 0;
+        byte subsevent = 0x00;
         for (String tagName : request.getTagNames()) {
-
             if (request.getTag(tagName) instanceof DefaultPlcSubscriptionTag) {
                 PlcTag event = ((DefaultPlcSubscriptionTag) request.getTag(tagName)).getTag();
                 if (event instanceof S7SubscriptionTag) {
+                    if (((S7SubscriptionTag) event).getTagType() == S7SubscriptionType.EVENT_SUBSCRIPTION)                    
                     subsevent = (byte) (subsevent | ((S7SubscriptionTag) event).getEventType().getValue());
                 }
             }
@@ -496,12 +612,13 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
         parameterItems.add(parameter);
 
 
-        S7PayloadUserDataItemCpuFunctionMsgSubscription payload;
-
+        S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest payload;
+        System.out.println("Subsevent: " + subsevent + " : " + String.format("0x%04X", subsevent));
         if (subsevent > 0) {
-            payload = new S7PayloadUserDataItemCpuFunctionMsgSubscription(
+            payload = new S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest(
                 DataTransportErrorCode.OK,
                 DataTransportSize.OCTET_STRING,
+                0x0a,
                 subsevent,
                 "HmiRtm  ",
                 null,
@@ -514,22 +631,29 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
             } else {
                 alarmtype = AlarmStateType.ALARM_S_INITIATE;
             }
-            payload = new S7PayloadUserDataItemCpuFunctionMsgSubscription(
+            
+            short auxsubsevent  = (short) (subsevent & 0xFF);
+            
+            payload = new S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest(
                 DataTransportErrorCode.OK,
                 DataTransportSize.OCTET_STRING,
-                subsevent,
+                (short) 0x0c,
+                auxsubsevent,
                 "HmiRtm  ",
                 alarmtype,
                 (short) 0x00);
         }
+        System.out.println(payload.toString());
         payloadItems.clear();
         payloadItems.add(payload);
 
     }
 
-    private PlcSubscriptionResponse decodeEventSubscriptionRequest(S7Message responseMessage,
-                                                                   PlcSubscriptionRequest plcSubscriptionRequest)
+    private PlcSubscriptionResponse decodeEventSubscriptionRequest(String strTagName,
+                                        PlcSubscriptionRequest plcSubscriptionRequest,
+                                        S7Message responseMessage)
         throws PlcProtocolException {
+        System.out.println("Paso por aqui...");
         Map<String, ResponseItem<PlcSubscriptionHandle>> values = new HashMap<>();
         short errorClass = 0;
         short errorCode = 0;
@@ -569,6 +693,12 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
                 return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest, values);
             }
         }
+        
+        S7ParameterUserData parameter = (S7ParameterUserData) responseMessage.getParameter();
+        List<S7ParameterUserDataItem> parameters = parameter.getItems();
+        S7ParameterUserDataItemCPUFunctions itemparameter = (S7ParameterUserDataItemCPUFunctions) parameters.get(0);        
+        errorCode = itemparameter.getErrorCode().shortValue();                                
+        
         // In all other cases all went well.
         S7PayloadUserData payload = (S7PayloadUserData) responseMessage.getPayload();
 
@@ -602,7 +732,155 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
                 (item.getTransportSize() == DataTransportSize.OCTET_STRING)) {
                 responseOk = true;
             }
-        }
+        }  else if (payloadItems.get(0) instanceof S7PayloadUserDataItemCpuFunctionAlarmAckResponse) {
+            S7PayloadUserDataItemCpuFunctionAlarmAckResponse items =
+                (S7PayloadUserDataItemCpuFunctionAlarmAckResponse) 
+            payloadItems.get(0) ;
+            //String tagName = (String) plcSubscriptionRequest.getTagNames().toArray()[0];
+            //TODO: Chequear si tagName es el correcto           
+            logger.info("strTagName: " + strTagName);
+            values.put(strTagName, new ResponseItem(PlcResponseCode.OK, null));            
+            for (short s:items.getMessageObjects()){
+
+                if (s == 0x0000) {
+                     values.put(Integer.toHexString(s), new ResponseItem(PlcResponseCode.OK, null));
+                } else if (s == 0x000a) {
+                     values.put(Integer.toHexString(s), new ResponseItem(PlcResponseCode.NOT_FOUND, null));
+                }
+            }
+
+            return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);    
+           
+        }   else if (payloadItems.get(0)  instanceof S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse) {
+            
+                S7PayloadUserDataItemCpuFunctionAlarmAckResponse items =
+                (S7PayloadUserDataItemCpuFunctionAlarmAckResponse) 
+                payloadItems.get(0);
+                //String fieldName = (String) S7PayloadUserDataItemCyclicServicesPush .getFieldNames().toArray()[0];
+                logger.warn("Request field: " + strTagName + ": " + S7ParamErrorCode.valueOf(errorCode)+ " " + S7ParamErrorCode.valueOf(errorCode).getEvent());          
+                values.put(strTagName, new ResponseItem(PlcResponseCode.NOT_FOUND, null));              
+                return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);  
+           
+        }   else if (payloadItems.get(0) instanceof S7PayloadUserDataItemCpuFunctionAlarmQueryResponse) {
+
+            S7PayloadUserDataItemCpuFunctionAlarmQueryResponse items =
+            (S7PayloadUserDataItemCpuFunctionAlarmQueryResponse)  payloadItems.get(0);
+
+            ByteBuf buffer = Unpooled.directBuffer(items.getItems().length * 2);
+            ByteBuf rxbuffer = Unpooled.directBuffer(items.getItems().length * 2);
+            buffer.writeBytes(items.getItems());
+           
+            
+            int numberOfItems = 1;
+                   
+            if (itemparameter.getLastDataUnit() == 1){
+
+                short loop = 0xff;          
+                CompletableFuture<S7MessageUserData> loopfuture = null;
+                S7MessageUserData msg = null; 
+                S7ParameterUserDataItemCPUFunctions loopparameter = null;
+                S7PayloadUserDataItemCpuFunctionAlarmQueryResponse looppayload = null;        
+                               
+                do {
+                    loopfuture = reassembledAlarmEvents(itemparameter.getSequenceNumber());
+                    
+                    try {
+                      
+                        msg = loopfuture.get();
+                        if (msg != null) {
+                            loopparameter =  (S7ParameterUserDataItemCPUFunctions) ((S7ParameterUserData) msg.getParameter()).getItems().get(0);
+                            looppayload = (S7PayloadUserDataItemCpuFunctionAlarmQueryResponse) ((S7PayloadUserData) msg.getPayload()).getItems().get(0);
+
+                            buffer.writeBytes(looppayload.getItems());
+
+                            loop = loopparameter.getLastDataUnit();
+
+                        } else loop = 0x00;
+                     
+                    } catch (Exception ex) {
+                        logger.warn(ex.toString());
+                    }
+                } while (loop > 0x00);
+
+                rxbuffer.writeByte(looppayload .getReturnCode().getValue());
+                rxbuffer.writeByte(looppayload .getTransportSize().getValue());
+                rxbuffer.writeShort(looppayload.getDataLength());
+                rxbuffer.writeBytes(buffer);
+
+            } else {
+               rxbuffer.writeByte(payloadItems.get(0).getReturnCode().getValue());
+               rxbuffer.writeByte(payloadItems.get(0).getTransportSize().getValue());
+               rxbuffer.writeShort(payloadItems.get(0).getDataLength());               
+               rxbuffer.writeBytes(buffer);                
+            }
+          
+            ReadBuffer readBuffer = new ReadBufferByteBased(ByteBufUtil.getBytes(rxbuffer));
+
+            try {
+                
+                short cpuSubfunction = 0x00;
+                
+                if (s7DriverContext.getControllerType() == S7ControllerType.S7_300) {
+                    cpuSubfunction = 0x13; 
+                } else cpuSubfunction = 0xf0 ;
+
+                S7PayloadUserDataItem payloaditem = 
+                        S7PayloadUserDataItem.staticParse(readBuffer, 
+                        (byte) 0x04,
+                        (byte) 0x00, 
+                        cpuSubfunction);
+
+                eventQueue.add(payloaditem);
+            } catch (Exception ex) {                
+                logger.info(ex.toString());
+            }                  
+            
+            PlcResponseCode rescode = (items.getReturnCode() == DataTransportErrorCode.OK) ? PlcResponseCode.OK : PlcResponseCode.INTERNAL_ERROR;
+            values.put(strTagName, new ResponseItem(rescode, null));
+            return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values); 
+            
+        }   else if (payloadItems.get(0) instanceof S7PayloadUserDataItemCyclicServicesSubscribeResponse) {
+            //S7ParameterUserData parameter = (S7ParameterUserData) responseMessage.getParameter();  
+            //logger.info("Aqui debe responder a Cyclic transfer");
+            S7ParameterUserDataItemCPUFunctions msgparameter = (S7ParameterUserDataItemCPUFunctions)
+                    parameter.getItems().get(0);
+            
+            S7CyclicEvent cycevent = new S7CyclicEvent(plcSubscriptionRequest,
+                    msgparameter.getSequenceNumber(), 
+                    (S7PayloadUserDataItemCyclicServicesSubscribeResponse) payloadItems.get(0)); 
+                
+            eventQueue.add(cycevent);                  
+            values.put(strTagName, new ResponseItem(PlcResponseCode.OK, cycHandle));  
+            return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);    
+            
+        } else if (payloadItems.get(0) instanceof S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse) {  
+            //logger.info("Aqui debe responder a Cyclic transfer Change Driven");
+            S7ParameterUserDataItemCPUFunctions msgparameter = (S7ParameterUserDataItemCPUFunctions)
+                    parameter.getItems().get(0);
+            
+            S7CyclicEvent cycevent = new S7CyclicEvent(plcSubscriptionRequest,
+                    msgparameter.getSequenceNumber(), 
+                    (S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse) payloadItems.get(0)); 
+            
+            eventQueue.add(cycevent);                  
+            values.put(strTagName, new ResponseItem(PlcResponseCode.OK, cycHandle));  
+            return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);  
+            
+        }  else if (payloadItems.get(0) instanceof S7PayloadUserDataItemCyclicServicesErrorResponse) {
+            //S7ParameterUserData parameter = (S7ParameterUserData) responseMessage.getParameter();
+            //S7ParameterUserDataItem[] parameters = parameter.getItems();
+            //S7ParameterUserDataItemCPUFunctions itemparameter = (S7ParameterUserDataItemCPUFunctions) parameters[0];
+            //errorCode = itemparameter.getErrorCode().shortValue();
+            logger.warn("Request field: " + strTagName + ": " + S7ParamErrorCode.valueOf(errorCode)+ " " + S7ParamErrorCode.valueOf(errorCode).getEvent());
+            if (errorCode == 0x8104){
+                values.put(strTagName, new ResponseItem(PlcResponseCode.UNSUPPORTED, null));              
+            } else 
+                values.put(strTagName, new ResponseItem(PlcResponseCode.INTERNAL_ERROR, null));
+            return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);                          
+        } else if (payloadItems.get(0) instanceof S7PayloadUserDataItemCyclicServicesUnsubscribeResponse) {
+            values.put(strTagName, new ResponseItem(PlcResponseCode.OK, null));  
+            return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);             
+        }   
 
         if (responseOk) {
             for (String tagName : plcSubscriptionRequest.getTagNames()) {
@@ -636,27 +914,265 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
 
     }
 
-    private void encodeAlarmAckRequest(DefaultPlcSubscriptionRequest request,
-                                       List<S7VarRequestParameterItem> parameterItems,
-                                       List<S7VarPayloadDataItem> payloadItems) {
+    private void encodeAlarmAckRequest( DefaultPlcReadRequest request,
+                                        List<S7ParameterUserDataItem> parameterItems,
+                                        List<S7PayloadUserDataItem> payloadItems) {
+        
+        S7ParameterUserDataItemCPUFunctions parameter = new S7ParameterUserDataItemCPUFunctions(
+                                                                (short) 0x11,   //Method
+                                                                (byte) 0x04,    //FunctionType
+                                                                (byte) 0x04,    //FunctionGroup
+                                                                (short) 0x0b,   //SubFunction
+                                                                (short) 0x00,   //SequenceNumber
+                                                                null,   //DataUnitReferenceNumber
+                                                                null,   //LastDataUnit
+                                                                null         //errorCode
+                                                    );
+        parameterItems.clear();
+        parameterItems.add(parameter);
+        
+        ArrayList<AlarmMessageObjectAckType> messageObjects = null;
+        BitSet bs = new BitSet();
+        for (String fieldName : request.getTagNames()) {
+            if (request.getTag(fieldName) instanceof S7AckTag) {
+                PlcTag field = request.getTag(fieldName);
+                if (field instanceof S7AckTag) {
+                    ArrayList<Integer> arrAlarmIds = ((S7AckTag) field).getAlarmIds();
+                    ArrayList<Integer> arrAlarmSigs = ((S7AckTag) field).getAlarmSigs();
+                    //messageObjects = new AlarmMessageObjectAckType[arrAlarmIds.size()];
+                    messageObjects = new ArrayList();
+                    int j = 0;
+                    for (int i = 0; i < arrAlarmIds.size(); i++) {
+                            bs = BitSet.valueOf(new byte[]{arrAlarmSigs.get(i).byteValue()});
+                           
+                            AlarmMessageObjectAckType messageObject = new AlarmMessageObjectAckType(
+                                                                              SyntaxIdType.ALARM_ACKSET,
+                                                                              (short) 0,
+                                                                              arrAlarmIds.get(i),
+                                                                              new State(bs.get(7),bs.get(6),bs.get(5),bs.get(4),bs.get(3),bs.get(2),bs.get(1),bs.get(0)),
+                                                                              new State(bs.get(7),bs.get(6),bs.get(5),bs.get(4),bs.get(3),bs.get(2),bs.get(1),bs.get(0))                                
+                                                                        );
+                            //messageObjects[i] = messageObject;
+                            messageObjects.add(messageObject);
+                    }
+                }
+            }
+        }
+        
 
-    }
+        S7PayloadUserDataItemCpuFunctionAlarmAckRequest payload =
+            new S7PayloadUserDataItemCpuFunctionAlarmAckRequest(
+                    DataTransportErrorCode.OK,
+                    DataTransportSize.OCTET_STRING,
+                    0x0c,
+                    messageObjects);
+//
+        payloadItems.clear();
+        payloadItems.add(payload);        
+        
+    }         
 
     private void encodeAlarmQueryRequest(DefaultPlcSubscriptionRequest request,
-                                         List<S7VarRequestParameterItem> parameterItems,
-                                         List<S7VarPayloadDataItem> payloadItems) {
-
+                                        List<S7ParameterUserDataItem> parameterItems,
+                                        List<S7PayloadUserDataItem> payloadItems) {
+        
+        S7ParameterUserDataItemCPUFunctions parameter = new S7ParameterUserDataItemCPUFunctions(
+                                                                (short) 0x11,   //Method
+                                                                (byte) 0x04,    //FunctionType
+                                                                (byte) 0x04,    //FunctionGroup
+                                                                (short) 0x13,   //SubFunction
+                                                                (short) 0x00,   //SequenceNumber
+                                                                null,   //DataUnitReferenceNumber
+                                                                null,   //LastDataUnit
+                                                                null         //errorCode
+                                                    );
+                                
+        parameterItems.clear();
+        parameterItems.add(parameter);
+ 
+        //TODO: Chequear el tipo dfe larma.
+        S7PayloadUserDataItemCpuFunctionAlarmQueryRequest payload =
+            new S7PayloadUserDataItemCpuFunctionAlarmQueryRequest(
+                    DataTransportErrorCode.OK,
+                    DataTransportSize.OCTET_STRING,
+                    0x0c,                    
+                    SyntaxIdType.ALARM_QUERYREQSET,
+                    QueryType.ALARM_8P,
+                    AlarmType.ALARM_8);
+        
+        payloadItems.clear();
+        payloadItems.add(payload);   
     }
 
     private void encodeCycledSubscriptionRequest(DefaultPlcSubscriptionRequest request,
-                                                 List<S7VarRequestParameterItem> parameterItems,
-                                                 List<S7VarPayloadDataItem> payloadItems) {
+                                        List<S7ParameterUserDataItem> parameterItems,
+                                        List<S7PayloadUserDataItem> payloadItem) {
 
     }
 
+    private void encodeCycledS7ANYSubscriptionRequest(PlcSubscriptionTag plctag,
+                                                List<S7ParameterUserDataItem> parameterItems,
+                                                 List<S7PayloadUserDataItem> payloadItems){
+        S7ParameterUserDataItemCPUFunctions parameter = new S7ParameterUserDataItemCPUFunctions(
+                                                                (short) 0x11,   //Method
+                                                                (byte) 0x04,    //FunctionType
+                                                                (byte) 0x02,    //FunctionGroup
+                                                                (short) 0x01,   //SubFunction
+                                                                (short) 0x00,   //SequenceNumber
+                                                                null,   //DataUnitReferenceNumber
+                                                                null,   //LastDataUnit
+                                                                null         //errorCode
+                                                    );
+                                
+        parameterItems.clear();
+        parameterItems.add(parameter);
+        
+        //TODO: Chequear la asignacionde tipo
+        
+        PlcTag tag = ((DefaultPlcSubscriptionTag) plctag).getTag();
+        S7SubscriptionTag s7tag = (S7SubscriptionTag) tag;
+//
+        List<CycServiceItemType> items = new ArrayList();        
+//        
+        int i=0;
+        for (S7Tag userfield:s7tag.getS7Tags()) {
+            items.add(new CycServiceItemAnyType(
+                    (short) 0x0a,
+                    (short) 0x10, //S7ANY
+                    userfield.getDataType(),
+                    userfield.getNumberOfElements(),                    
+                    userfield.getBlockNumber(),
+                    userfield.getMemoryArea(),
+                    (long) (((userfield.getByteOffset() << 3) | (userfield.getBitOffset() & 0x0007)))                    
+            ));
+            i++;
+        }
+//        
+//        //Length in bytes
+//        //4+12*items.legth
+        int lengthInBytes = 4 + items.size() * 12;
+//
+        S7PayloadUserDataItemCyclicServicesSubscribeRequest payload =
+                new S7PayloadUserDataItemCyclicServicesSubscribeRequest(
+                        DataTransportErrorCode.OK,
+                        DataTransportSize.OCTET_STRING,
+                        lengthInBytes,
+                        items.size(),
+                        s7tag.getTimeBase(),
+                        s7tag.getMultiplier(),
+                        items
+                );
+        
+        payloadItems.clear();
+        payloadItems.add(payload);
+    }
+    
+
+    private void encodeCycledDBREADSubscriptionRequest(PlcSubscriptionTag plctag,
+                                                List<S7ParameterUserDataItem> parameterItems,
+                                                 List<S7PayloadUserDataItem> payloadItems){
+        S7ParameterUserDataItemCPUFunctions parameter = new S7ParameterUserDataItemCPUFunctions(
+                                                                (short) 0x11,   //Method
+                                                                (byte) 0x04,    //FunctionType
+                                                                (byte) 0x02,    //FunctionGroup
+                                                                (short) 0x01,   //SubFunction
+                                                                (short) 0x00,   //SequenceNumber
+                                                                null,   //DataUnitReferenceNumber
+                                                                null,   //LastDataUnit
+                                                                null         //errorCode
+                                                    );
+                                
+        parameterItems.clear();
+        parameterItems.add(parameter);
+        
+        //TODO: Chequear la asignacionde tipo
+
+        PlcTag tag = ((DefaultPlcSubscriptionTag) plctag).getTag();
+        S7SubscriptionTag s7tag = (S7SubscriptionTag) tag;
+
+
+        double cycitemcount = Math.ceil(((double)s7tag.getS7Tags().length / (double) 50));
+        
+        //CycServiceItemDbReadType[] cycitems = new CycServiceItemDbReadType[(int) cycitemcount];
+        List<CycServiceItemType> cycitems = new ArrayList();
+        ArrayList<SubItem> subitems = new ArrayList(); 
+        for (S7Tag userfield:s7tag.getS7Tags()){
+            subitems.add(new SubItem((short) userfield.getNumberOfElements(),
+                            userfield.getBlockNumber(),
+                            userfield.getByteOffset()));
+        }        
+        
+        int initpos = 0;
+        int endpos = (subitems.size() < 50)?subitems.size():49;
+        int j=0;   
+        int lengthInBytes = 4;        
+        do{
+            List<SubItem> arraysubitems = subitems.subList(initpos, endpos);   
+                    
+            cycitems.add(j,new CycServiceItemDbReadType(                                        
+                    (short) (arraysubitems.size()*5+2),
+                    (short) 0xb0,
+                    (short) arraysubitems.size(),
+                    arraysubitems));
+            
+            lengthInBytes += 4 + arraysubitems.size() * 5;
+            initpos = endpos++;
+            endpos = ((initpos+49) < subitems.size())?(initpos+49):subitems.size();
+            j++;
+        } while (j < cycitems.size());
+
+        S7PayloadUserDataItemCyclicServicesSubscribeRequest payload =
+                new S7PayloadUserDataItemCyclicServicesSubscribeRequest(
+                        DataTransportErrorCode.OK,
+                        DataTransportSize.OCTET_STRING,
+                        lengthInBytes,
+                        cycitems.size(),
+                        s7tag.getTimeBase(),
+                        s7tag.getMultiplier(),
+                        cycitems
+                );
+        
+        payloadItems.clear();
+        payloadItems.add(payload);
+    }
+      
+    
     private void encodeCycledUnSubscriptionRequest(DefaultPlcSubscriptionRequest request,
-                                                   List<S7VarRequestParameterItem> parameterItems,
-                                                   List<S7VarPayloadDataItem> payloadItems) {
+                                                List<S7ParameterUserDataItem> parameterItems,
+                                                List<S7PayloadUserDataItem> payloadItems) {
+        
+        S7ParameterUserDataItemCPUFunctions parameter = new S7ParameterUserDataItemCPUFunctions(
+                                                                        (short) 0x11,   //Method
+                                                                        (byte) 0x04,    //FunctionType
+                                                                        (byte) 0x02,    //FunctionGroup
+                                                                        (short) 0x04,   //SubFunction
+                                                                        (short) 0x00,   //SequenceNumber
+                                                                        null,   //DataUnitReferenceNumber
+                                                                        null,   //LastDataUnit
+                                                                        null         //errorCode
+                                                            );
+                                
+        parameterItems.clear();
+        parameterItems.add(parameter);
+        
+        PlcSubscriptionTag tag = request.getTags().get(0);
+        S7SubscriptionTag s7tag = (S7SubscriptionTag) tag;        
+
+        //PlcField field = ((DefaultPlcSubscriptionField) plcfield).getPlcField(); 
+        //S7SubscriptionField s7field = (S7SubscriptionField) field;
+        
+        //TODO:Check CPU type
+        S7PayloadUserDataItemCyclicServicesUnsubscribeRequest payload =
+                new S7PayloadUserDataItemCyclicServicesUnsubscribeRequest (
+                        DataTransportErrorCode.OK,
+                        DataTransportSize.OCTET_STRING,
+                        0x02,
+                        (short) 0x05,
+                        s7tag.getAckAlarms().get(0).byteValue()
+                );        
+        
+        payloadItems.clear();
+        payloadItems.add(payload);        
 
     }
 
@@ -665,6 +1181,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
      */
     @Override
     protected void decode(ConversationContext<TPKTPacket> context, TPKTPacket msg) throws Exception {
+        System.out.println(msg.toString());
         S7Message s7msg = msg.getPayload().getPayload();
         S7Parameter parameter = s7msg.getParameter();
         if (parameter instanceof S7ParameterModeTransition) {
@@ -697,6 +1214,43 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
                         eventQueue.addAll(items);
                     } else if ((myparameter.getCpuFunctionType() == 0x00) && (myparameter.getCpuSubfunction() == 0x13)) {
 
+                    } else if ((myparameter.getCpuFunctionGroup() == 0x02) && (myparameter.getCpuFunctionType() == 0x00) && (myparameter.getCpuSubfunction() == 0x01)){
+                        
+                            S7ParameterUserDataItemCPUFunctions parameteritem = 
+                                    (S7ParameterUserDataItemCPUFunctions)
+                                    ((S7ParameterUserData) parameter).getItems().get(0);
+                            
+                            S7PayloadUserData payload = (S7PayloadUserData) s7msg.getPayload();
+                            
+                            S7PayloadUserDataItemCyclicServicesPush payloaditem = 
+                                    (S7PayloadUserDataItemCyclicServicesPush)
+                                    payload.getItems().get(0);
+                            
+                            S7CyclicEvent cycevent = new S7CyclicEvent(null,
+                                    parameteritem.getSequenceNumber(),
+                                    payloaditem);
+                            eventQueue.add(cycevent);
+                    
+                    } else if  ((myparameter.getCpuFunctionGroup() == 0x02) && (myparameter.getCpuFunctionType() == 0x00) && (myparameter.getCpuSubfunction() == 0x05)) {   
+                            S7ParameterUserDataItemCPUFunctions parameteritem = 
+                                    (S7ParameterUserDataItemCPUFunctions)
+                                    ((S7ParameterUserData) parameter).getItems().get(0);
+                            
+                            S7PayloadUserData payload = (S7PayloadUserData) s7msg.getPayload();
+                            
+                            S7PayloadUserDataItemCyclicServicesChangeDrivenPush payloaditem = 
+                                    (S7PayloadUserDataItemCyclicServicesChangeDrivenPush)
+                                    payload.getItems().get(0);
+                            
+                            S7CyclicEvent cycevent = new S7CyclicEvent(null,
+                                    parameteritem.getSequenceNumber(),
+                                    payloaditem);                           
+                            eventQueue.add(cycevent);                        
+                        
+                    } else if ((myparameter.getCpuFunctionType() == 0x08) && (myparameter.getCpuSubfunction() == 0x01)) {
+
+                    } else if ((myparameter.getCpuFunctionType() == 0x08) && (myparameter.getCpuSubfunction() == 0x04)) {
+
                     }
                 }
             }
@@ -716,16 +1270,21 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
             }
             S7PayloadUserDataItemCpuFunctionReadSzlResponse readSzlResponseItem =
                 (S7PayloadUserDataItemCpuFunctionReadSzlResponse) item;
-            for (SzlDataTreeItem readSzlResponseItemItem : readSzlResponseItem.getItems()) {
-                if (readSzlResponseItemItem.getItemIndex() != 0x0001) {
-                    continue;
-                }
-                final String articleNumber = new String(readSzlResponseItemItem.getMlfb());
-                s7DriverContext.setControllerType(decodeControllerType(articleNumber));
-
-                // Send an event that connection setup is complete.
-                context.fireConnected();
-            }
+            
+//            for (SzlDataTreeItem readSzlResponseItemItem : readSzlResponseItem.getItems()) {
+//                if (readSzlResponseItemItem.getItemIndex() != 0x0001) {
+//                    continue;
+//                }
+//                final String articleNumber = new String(readSzlResponseItemItem.getMlfb());
+//                s7DriverContext.setControllerType(decodeControllerType(articleNumber));
+//
+//                // Send an event that connection setup is complete.
+//                context.fireConnected();
+//            }
+            ByteBuf szlitem = Unpooled.wrappedBuffer(readSzlResponseItem.getItems());
+            String articleNumber = szlitem.toString(2, 20, Charset.defaultCharset());
+            s7DriverContext.setControllerType(decodeControllerType(articleNumber));            
+            context.fireConnected(); 
         }
     }
 
@@ -733,7 +1292,13 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
         S7MessageUserData identifyRemoteMessage = new S7MessageUserData(1, new S7ParameterUserData(Collections.singletonList(
             new S7ParameterUserDataItemCPUFunctions((short) 0x11, (byte) 0x4, (byte) 0x4, (short) 0x01, (short) 0x00, null, null, null)
         )), new S7PayloadUserData(Collections.singletonList(
-            new S7PayloadUserDataItemCpuFunctionReadSzlRequest(DataTransportErrorCode.OK, DataTransportSize.OCTET_STRING, new SzlId(SzlModuleTypeClass.CPU, (byte) 0x00, SzlSublist.MODULE_IDENTIFICATION), 0x0000)
+            new S7PayloadUserDataItemCpuFunctionReadSzlRequest(DataTransportErrorCode.OK,
+                    DataTransportSize.OCTET_STRING,
+                    0x0C,
+                    new SzlId(SzlModuleTypeClass.CPU,
+                    (byte) 0x00,
+                    SzlSublist.MODULE_IDENTIFICATION), 
+                    0x0000)
         )));
         COTPPacketData cotpPacketData = new COTPPacketData(null, identifyRemoteMessage, true, (short) 2);
         return new TPKTPacket(cotpPacketData);
@@ -781,6 +1346,8 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
         Map<String, ResponseItem<PlcValue>> values = new HashMap<>();
         short errorClass;
         short errorCode;
+        System.out.println(">>> " + responseMessage.toString());
+        S7ParameterUserDataItemCPUFunctions parameteritem = null;        
         if (responseMessage instanceof S7MessageResponseData) {
             S7MessageResponseData messageResponseData = (S7MessageResponseData) responseMessage;
             errorClass = messageResponseData.getErrorClass();
@@ -789,7 +1356,13 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
             S7MessageResponse messageResponse = (S7MessageResponse) responseMessage;
             errorClass = messageResponse.getErrorClass();
             errorCode = messageResponse.getErrorCode();
-        } else {
+        } else if(responseMessage instanceof S7MessageUserData) {
+            S7MessageUserData messageResponse = (S7MessageUserData) responseMessage;
+            S7ParameterUserData parameters = (S7ParameterUserData) messageResponse.getParameter();
+            parameteritem = (S7ParameterUserDataItemCPUFunctions) parameters.getItems().get(0);
+            errorClass = 0;
+            errorCode = parameteritem.getErrorCode().shortValue();
+        }  else {
             throw new PlcProtocolException("Unsupported message type " + responseMessage.getClass().getName());
         }
         // If the result contains any form of non-null error code, handle this instead.
@@ -817,6 +1390,76 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
             }
         }
 
+        //TODO: Reemsambling message.
+        if (responseMessage instanceof S7MessageUserData) {
+            
+            S7PayloadUserData payload = (S7PayloadUserData) responseMessage.getPayload();             
+            if (plcReadRequest.getNumberOfTags() != payload.getItems().size()) {
+                throw new PlcProtocolException(
+                    "The number of requested items doesn't match the number of returned items");
+            } 
+            
+            List<S7PayloadUserDataItem> payloadItems = payload.getItems();             
+
+            PlcResponseCode responseCode = PlcResponseCode.INTERNAL_ERROR;
+            PlcValue plcValue = null;            
+            int index = 0;
+            for (String tagName : plcReadRequest.getTagNames()) {
+                
+                if (plcReadRequest.getTag(tagName) instanceof S7SzlTag ) {
+
+                    S7SzlTag tag = (S7SzlTag) plcReadRequest.getTag(tagName);
+                    S7PayloadUserDataItemCpuFunctionReadSzlResponse payloadItem = (S7PayloadUserDataItemCpuFunctionReadSzlResponse) payloadItems.get(index);               
+                    responseCode = decodeResponseCode(payloadItem.getReturnCode());
+                    
+                    if (responseCode == PlcResponseCode.OK) {
+                        try {
+                            LinkedList plcvalues = null;
+                            byte[] data = payloadItem.getItems();
+
+                            plcvalues = new LinkedList<PlcSINT>();
+                            for (byte b:data ) plcvalues.add(new PlcSINT(b));
+
+                            if (parameteritem.getLastDataUnit() == 1) {
+
+                                //TODO: reemsamble multiples mensajes
+                                CompletableFuture<S7MessageUserData> future  = reassembledMessage(parameteritem.getSequenceNumber(), plcvalues);
+                                S7MessageUserData msg = future.get();
+                                if (msg != null) {
+                                    S7ParameterUserData parameter = (S7ParameterUserData) msg.getParameter();
+                                    S7PayloadUserData payload2 = (S7PayloadUserData) msg.getPayload();
+                                    S7PayloadUserDataItemCpuFunctionReadSzlResponse payloadItem2 = (S7PayloadUserDataItemCpuFunctionReadSzlResponse) payload2.getItems().get(0);
+                                    for (byte b:payloadItem2.getItems()) plcvalues.add(new PlcSINT(b));
+                                }
+                               plcValue = new PlcList(plcvalues); 
+                            } else {
+                               plcValue = new PlcList(plcvalues);                            
+                            }
+                        } catch(Exception e) {
+                            throw new PlcProtocolException("Error decoding PlcValue", e);
+                        }
+
+                    }
+                } if (plcReadRequest.getTag(tagName) instanceof S7AckTag ) {
+                    S7AckTag field = (S7AckTag) plcReadRequest.getTag(tagName);
+                    S7PayloadUserDataItemCpuFunctionAlarmAckResponse payloadItem = 
+                        (S7PayloadUserDataItemCpuFunctionAlarmAckResponse) payloadItems.get(index);               
+                    responseCode = decodeResponseCode(payloadItem.getReturnCode());  
+                    List<Short> data = payloadItem.getMessageObjects();
+                    LinkedList plcvalues = new LinkedList<PlcSINT>();
+                    for (short b:data ) plcvalues.add(new PlcSINT((byte) b));  
+                    plcValue = new PlcList(plcvalues);                       
+                }
+                
+                ResponseItem<PlcValue> result = new ResponseItem<>(responseCode, plcValue);
+                values.put(tagName, result);
+                index++;
+            }
+
+            return new DefaultPlcReadResponse(plcReadRequest, values);   
+ 
+        }        
+        
         // In all other cases all went well.
         S7PayloadReadVarResponse payload = (S7PayloadReadVarResponse) responseMessage.getPayload();
 
@@ -1053,6 +1696,139 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
             s7Tag.getMemoryArea(), s7Tag.getByteOffset(), s7Tag.getBitOffset());
     }
 
+    
+    private void cleanFutures(){
+        //TODO: Debe ser ejecutado si la conexion esta levanta.
+        active_requests.forEach((f,p)->{
+            CompletableFuture<Object> cf = (CompletableFuture<Object>) f;
+            try {
+                if (!cf.isDone()) {
+                    logger.info("CF");
+                    cf.cancel(true);
+                    logger.info("ClientCF");
+                    ((CompletableFuture<Object>) p.getRight()).completeExceptionally(new PlcRuntimeException("Disconnected"));                     
+                    logger.info("TM");
+                    p.getLeft().endRequest();
+                };
+            } catch (Exception ex){
+                logger.info(ex.toString());
+            }
+        });
+        active_requests.clear();   
+
+    }    
+    
+    private boolean isConnected(){
+        //return context.getChannel().attr(S7HMuxImpl.IS_CONNECTED).get();
+        return true;
+    }
+    
+    private boolean isPrimaryChannel(){
+        //boolean b = (context.getChannel().attr(S7HMuxImpl.IS_PRIMARY).get() == null)?true:context.getChannel().attr(S7HMuxImpl.IS_PRIMARY).get();        
+       //return b;
+       return true;
+    }   
+    
+    private boolean isFeatureSupported(){
+        boolean b = ((s7DriverContext.getControllerType() == S7ControllerType.S7_300) ||
+                    (s7DriverContext.getControllerType() == S7ControllerType.S7_400))
+                    ?true:false;
+        return b;
+    }          
+
+    private CompletableFuture<S7MessageUserData> reassembledMessage(short sequenceNumber, LinkedList<PlcSINT> plcValues){
+        
+        CompletableFuture<S7MessageUserData> future = new CompletableFuture<>();
+        
+        //TODO: PDU id is the same, we need check.
+        int tpduId = tpduGenerator.getAndIncrement();
+        // If we've reached the max value for a 16 bit transaction identifier, reset back to 1
+        if(tpduGenerator.get() == 0xFFFF) {
+            tpduGenerator.set(1);
+        }        
+                
+        TPKTPacket request = createSzlReassembledRequest(tpduId, sequenceNumber);
+
+        context.sendRequest(request)
+        .onTimeout(e -> {
+            logger.warn("Timeout during Connection establishing, closing channel...");
+            //context.getChannel().close();
+        })
+        .expectResponse(TPKTPacket.class, Duration.ofMillis(1000))
+        .check(p -> p.getPayload() instanceof COTPPacketData)
+        .unwrap(p -> ((COTPPacketData) p.getPayload()))
+        .check(p -> p.getPayload() instanceof S7MessageUserData)
+        .unwrap(p -> ((S7MessageUserData) p.getPayload()))
+        .check(p -> p.getPayload() instanceof S7PayloadUserData)
+        .handle(messageUserData -> {
+            future.complete(messageUserData);           
+        });
+
+        return future;
+    }
+    
+    /*
+    * 
+    */
+    private TPKTPacket createSzlReassembledRequest(int tpduId, short sequenceNumber) {
+        S7MessageUserData identifyRemoteMessage = new S7MessageUserData(tpduId, new S7ParameterUserData(Arrays.asList(
+                new S7ParameterUserDataItemCPUFunctions((short) 0x12, (byte) 0x4, (byte) 0x4, (short) 0x01, sequenceNumber, (short) 0x00, (short) 0x00, 0)
+        )), new S7PayloadUserData(Arrays.asList(
+                new S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest(
+                        DataTransportErrorCode.NOT_FOUND, 
+                        DataTransportSize.NULL, 
+                        0x00)
+        )));
+        COTPPacketData cotpPacketData = new COTPPacketData(null, identifyRemoteMessage, true, (short) 2);
+        return new TPKTPacket(cotpPacketData);
+    }     
+    
+    private CompletableFuture<S7MessageUserData>  reassembledAlarmEvents(short sequenceNumber) {
+        CompletableFuture<S7MessageUserData> future = new CompletableFuture<>();
+        
+        //TODO: PDU id is the same, we need check.
+        int tpduId = tpduGenerator.getAndIncrement();
+        // If we've reached the max value for a 16 bit transaction identifier, reset back to 1
+        if(tpduGenerator.get() == 0xFFFF) {
+            tpduGenerator.set(1);
+        }        
+                
+        TPKTPacket request = createAlarmQueryReassembledRequest(tpduId, sequenceNumber);
+
+        context.sendRequest(request)
+        .onTimeout(e -> {
+            logger.warn("Timeout during Connection establishing, closing channel...");
+            //context.getChannel().close();
+        })
+        .expectResponse(TPKTPacket.class, Duration.ofMillis(1000))
+        .check(p -> p.getPayload() instanceof COTPPacketData)
+        .unwrap(p -> ((COTPPacketData) p.getPayload()))
+        .check(p -> p.getPayload() instanceof S7MessageUserData)
+        .unwrap(p -> ((S7MessageUserData) p.getPayload()))
+        .check(p -> p.getPayload() instanceof S7PayloadUserData)
+        .handle(messageUserData -> {
+            future.complete(messageUserData);           
+        });
+
+        return future;       
+    }
+
+    //TODO: S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest to S7PayloadUserDataItemCpuFunctionAlarmQueryNoDataRequest 
+    private TPKTPacket createAlarmQueryReassembledRequest(int tpduId, short sequenceNumber) {
+        S7MessageUserData identifyRemoteMessage = new S7MessageUserData(tpduId, new S7ParameterUserData(Arrays.asList(
+                new S7ParameterUserDataItemCPUFunctions((short) 0x12, (byte) 0x4, (byte) 0x4, (short) 0x13, sequenceNumber, (short) 0x00, (short) 0x00, 0)
+        )), new S7PayloadUserData(Arrays.asList(
+                new S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest (
+                        DataTransportErrorCode.NOT_FOUND, 
+                        DataTransportSize.NULL, 
+                        0x00)
+            )));
+        COTPPacketData cotpPacketData = new COTPPacketData(null, identifyRemoteMessage, true, (short) 2);
+        return new TPKTPacket(cotpPacketData);
+    }       
+    
+    
+    
     /**
      * A generic purpose error handler which terminates transaction and calls back given future with error message.
      */
@@ -1078,27 +1854,5 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
             future.completeExceptionally(e);
         }
     }
-    
-    private void cleanFutures(){
-        //TODO: Debe ser ejecutado si la conexion esta levanta.
-        active_requests.forEach((f,p)->{
-            CompletableFuture<Object> cf = (CompletableFuture<Object>) f;
-            try {
-                if (!cf.isDone()) {
-                    logger.info("CF");
-                    cf.cancel(true);
-                    logger.info("ClientCF");
-                    ((CompletableFuture<Object>) p.getRight()).completeExceptionally(new PlcRuntimeException("Disconnected"));                     
-                    logger.info("TM");
-                    p.getLeft().endRequest();
-                };
-            } catch (Exception ex){
-                logger.info(ex.toString());
-            }
-        });
-        active_requests.clear();   
-
-    }    
-    
 
 }
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7AckTag.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7AckTag.java
new file mode 100644
index 0000000000..a474d08ed2
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7AckTag.java
@@ -0,0 +1,82 @@
+/*
+ * 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.s7.readwrite.tag;
+
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.s7.readwrite.types.S7SubscriptionType;
+
+/**
+ *
+ * @author cgarcia
+ */
+public class S7AckTag implements PlcTag {
+    
+    private static final Pattern EVENT_ALARM_ACK_PATTERN = 
+        Pattern.compile("(^ACK:)(((?:,{0,1})(16#[0-9a-fA-F]{8})(;([0-9a-fA-F]{2})))+)");
+    
+    private final ArrayList<Integer> ackAlarmIds;
+    private final ArrayList<Integer> ackAlarmSigs;    
+    
+    public S7AckTag(ArrayList<Integer> ackAlarmIds, ArrayList<Integer> ackAlarmSigs){
+        this.ackAlarmIds = ackAlarmIds;
+        this.ackAlarmSigs = ackAlarmSigs;
+    };    
+    
+    
+    public ArrayList<Integer> getAlarmIds() {
+        return ackAlarmIds;
+    }
+
+    public ArrayList<Integer> getAlarmSigs() {
+        return ackAlarmSigs;
+    }    
+    
+    public static boolean matches(String fieldString) {
+        return EVENT_ALARM_ACK_PATTERN.matcher(fieldString).matches();
+    }      
+    
+    public static S7AckTag of(String fieldString) {
+        //TODO: Actually only ALARM_S (SIG_1)
+        Matcher matcher = EVENT_ALARM_ACK_PATTERN.matcher(fieldString);
+        if (matcher.matches()){
+            String[] arrIdAndSig;
+            String EventIds = matcher.group(2);
+            String[] arrStrEventId = EventIds.split(",");
+            ArrayList<Integer> arrAlarmIds = new ArrayList<>();
+            ArrayList<Integer> arrAlarmSigs = new ArrayList<>();                
+            for (String EventId:arrStrEventId){
+                EventId = EventId.replaceAll("16#", "");
+                arrIdAndSig =  EventId.split(";");
+                arrAlarmIds.add(Integer.parseInt(arrIdAndSig[0], 16));
+                arrAlarmSigs.add(Integer.parseInt(arrIdAndSig[1], 16));                    
+            }
+            return new S7AckTag(arrAlarmIds, arrAlarmSigs);                
+        } else return null;                
+    };    
+
+    @Override
+    public String getAddressString() {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+    
+    
+}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7PlcTagHandler.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7PlcTagHandler.java
index ae983ba5eb..c42cdd4867 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7PlcTagHandler.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7PlcTagHandler.java
@@ -31,8 +31,8 @@ public class S7PlcTagHandler implements PlcTagHandler {
             return S7Tag.of(tagAddress);
         } else if (S7SubscriptionTag.matches(tagAddress)){
             return S7SubscriptionTag.of(tagAddress);
-        } else if (S7SslTag.matches(tagAddress)){
-            return S7SslTag.of(tagAddress);
+        } else if (S7SzlTag.matches(tagAddress)){
+            return S7SzlTag.of(tagAddress);
         }
         throw new PlcInvalidTagException(tagAddress);
     }
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SubscriptionTag.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SubscriptionTag.java
index 63a66a2c03..c23e0c5013 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SubscriptionTag.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SubscriptionTag.java
@@ -25,7 +25,8 @@ import org.apache.plc4x.java.api.types.PlcValueType;
 import org.apache.plc4x.java.s7.readwrite.AlarmType;
 import org.apache.plc4x.java.s7.readwrite.EventType;
 import org.apache.plc4x.java.s7.readwrite.types.S7SubscriptionType;
-
+import org.apache.plc4x.java.s7.readwrite.TimeBase;
+        
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -46,53 +47,111 @@ public class S7SubscriptionTag implements PlcTag {
     //TODO: Query SCAN 
     private static final Pattern EVENT_ALARM_QUERY_PATTERN =
         Pattern.compile("(^QUERY:)((ALARM_S)|(ALARM_8))");
+    
+    //byteOffset theoretically can reach up to 2097151 ... see checkByteOffset() below --> 7digits
+    private static final Pattern ADDRESS_PATTERN =
+        Pattern.compile("%(?<memoryArea>.)(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?");
+
+    //blockNumber usually has its max hat around 64000 --> 5digits
+    private static final Pattern DATA_BLOCK_ADDRESS_PATTERN =
+        Pattern.compile("%DB(?<blockNumber>\\d{1,5}).DB(?<transferDBSizeCode>[XBWD]?)(?<byteDBOffset>\\d{1,7})(.(?<bitDBOffset>[0-7]))?:(?<dataDBType>[a-zA-Z_]+)(\\[(?<numDBElements>\\d+)])?");
+
+    //All fields index 9
+    private static final Pattern EVENT_SUBSCRIPTION_S7ANY_QUERY_PATTERN =
+        Pattern.compile("(^CYC(\\((?<timeBase>((B01SEC)|(B1SEC)|(B10SEC))):(?<multiplier>[1-99])\\)):)(((?:,{0,1})((" + ADDRESS_PATTERN + ")|(" + DATA_BLOCK_ADDRESS_PATTERN + ")))+)");
+
+    private static final Pattern EVENT_SUBSCRIPTION_DB_QUERY_PATTERN =
+        Pattern.compile("(^CYC(\\((?<timeBase>((B01SEC)|(B1SEC)|(B10SEC))):(?<multiplier>[1-99])\\)):)(((?:,{0,1})(%DB(?<blockNumber>\\d{1,5}).DB(?<transferDBSizeCode>[B]?)(?<byteDBOffset>\\d{1,7})(\\[(?<numDBElements>\\d+)]))?)+)");
+
+    private static final Pattern EVENT_CANCEL_JOB_QUERY_PATTERN =
+        Pattern.compile("(^CANCEL:)((((?:,{0,1})(\\d+{1,3})))+)");    
+    
+    private static final String MEMORY_AREA = "memoryArea";
+    private static final String TRANSFER_SIZE_CODE = "transferSizeCode";
+    private static final String BYTE_OFFSET = "byteOffset";
+    private static final String BIT_OFFSET = "bitOffset";
+    private static final String DATA_TYPE = "dataType";
+    private static final String NUM_ELEMENTS = "numElements";
+
+    private static final String BLOCK_NUMBER = "blockNumber";
+    private static final String TRANSFER_DB_SIZE_CODE = "transferSizeCode";
+    private static final String BYTE_DB_OFFSET = "byteOffset";
+    private static final String BIT_DB_OFFSET = "bitOffset";
+    private static final String DATA_DB_TYPE = "dataType";
+    private static final String NUM_DB_ELEMENTS = "numElements";
 
-    private final String address;
+    private static final String STRING_LENGTH = "stringLength";
+    private static final String TIME_BASE = "timeBase";
+    private static final String TIME_BASE_MULTIPLIER = "multiplier";
+    
+    
+//    private final String address;
     private final S7SubscriptionType subscriptionType;
     private final EventType eventtype;
-    private final S7Tag s7Tag;
+    private final S7Tag[] s7tags;
     private final ArrayList<Integer> ackAlarms;
     private final AlarmType alarmQueryType;
+    private final TimeBase timebase;
+    private final short multiplier;    
 
-    public S7SubscriptionTag(String address, S7SubscriptionType subscriptionType, EventType eventtype) {
-        this.address = address;
+    public S7SubscriptionTag(S7SubscriptionType subscriptionType, EventType eventtype) {
+//        this.address = address;
         this.subscriptionType = subscriptionType;
         this.eventtype = eventtype;
-        this.s7Tag = null;
+        this.s7tags = null;
         this.ackAlarms = null;
         this.alarmQueryType = null;
+        this.timebase = null;
+        this.multiplier = 0;
     }
 
-    public S7SubscriptionTag(String address, S7SubscriptionType subscriptionType, ArrayList<Integer> ackAlarms) {
-        this.address = address;
+    public S7SubscriptionTag(S7SubscriptionType subscriptionType, ArrayList<Integer> ackAlarms) {
+//        this.address = address;
         this.subscriptionType = subscriptionType;
         this.eventtype = null;
-        this.s7Tag = null;
+        this.s7tags = null;
         this.ackAlarms = ackAlarms;
         this.alarmQueryType = null;
+        this.timebase = null;
+        this.multiplier = 0;        
     }
 
-    public S7SubscriptionTag(String address, S7SubscriptionType subscriptionType, AlarmType alarmQueryType) {
-        this.address = address;
+    public S7SubscriptionTag(S7SubscriptionType subscriptionType, AlarmType alarmQueryType) {
+//        this.address = address;
         this.subscriptionType = subscriptionType;
         this.eventtype = null;
-        this.s7Tag = null;
+        this.s7tags = null;
         this.ackAlarms = null;
         this.alarmQueryType = alarmQueryType;
+        this.timebase = null;
+        this.multiplier = 0;        
     }
 
-    public S7SubscriptionTag(String address, S7SubscriptionType subscriptionType, S7Tag s7Tag) {
-        this.address = address;
+//    public S7SubscriptionTag(S7SubscriptionType subscriptionType, S7Tag s7Tag) {
+////        this.address = address;
+//        this.subscriptionType = subscriptionType;
+//        this.eventtype = null;
+//        this.s7tags = s7Tag;
+//        this.ackAlarms = null;
+//        this.alarmQueryType = null;
+//        this.timebase = null;
+//        this.multiplier = 0;        
+//    }
+    
+    public S7SubscriptionTag(S7SubscriptionType subscriptionType, S7Tag[] s7tags, TimeBase timebase, short multiplier) {
+//        this.address = address;
         this.subscriptionType = subscriptionType;
-        this.eventtype = null;
-        this.s7Tag = s7Tag;
-        this.ackAlarms = null;
+        this.eventtype  = null;
+        this.s7tags   = s7tags;
+        this.ackAlarms   = null;  
         this.alarmQueryType = null;
-    }
+        this.timebase   = timebase;
+        this.multiplier = multiplier;
+    }      
 
     @Override
     public String getAddressString() {
-        return address;
+        return null;
     }
 
     @Override
@@ -113,8 +172,8 @@ public class S7SubscriptionTag implements PlcTag {
         return eventtype;
     }
 
-    public S7Tag getS7Tag() {
-        return s7Tag;
+    public S7Tag[] getS7Tags() {
+        return s7tags;
     }
 
     public ArrayList<Integer> getAckAlarms() {
@@ -124,19 +183,35 @@ public class S7SubscriptionTag implements PlcTag {
     public AlarmType getAlarmQueryType() {
         return alarmQueryType;
     }
+    
+    public TimeBase getTimeBase() {
+        return timebase;
+    }
+
+    public short getMultiplier() {
+        return multiplier;
+    }        
 
     public static boolean matches(String tagString) {
+        
         return EVENT_SUBSCRIPTION_TYPE_PATTERN.matcher(tagString).matches() ||
             EVENT_ALARM_ACK_PATTERN.matcher(tagString).matches() ||
             EVENT_ALARM_QUERY_PATTERN.matcher(tagString).matches() ||
-            S7Tag.matches(tagString);
+            EVENT_SUBSCRIPTION_S7ANY_QUERY_PATTERN.matcher(tagString).matches() ||
+            EVENT_SUBSCRIPTION_DB_QUERY_PATTERN.matcher(tagString).matches() ||
+            EVENT_CANCEL_JOB_QUERY_PATTERN.matcher(tagString).matches();
+        
+//        return EVENT_SUBSCRIPTION_TYPE_PATTERN.matcher(tagString).matches() ||
+//            EVENT_ALARM_ACK_PATTERN.matcher(tagString).matches() ||
+//            EVENT_ALARM_QUERY_PATTERN.matcher(tagString).matches() ||
+//            S7Tag.matches(tagString);
     }
 
     public static S7SubscriptionTag of(String tagString) {
         {
             Matcher matcher = EVENT_SUBSCRIPTION_TYPE_PATTERN.matcher(tagString);
             if (matcher.matches()) {
-                return new S7SubscriptionTag(tagString, S7SubscriptionType.EVENT_SUBSCRIPTION,
+                return new S7SubscriptionTag(S7SubscriptionType.EVENT_SUBSCRIPTION,
                     EventType.valueOf(tagString));
             }
         }
@@ -144,39 +219,96 @@ public class S7SubscriptionTag implements PlcTag {
         {
             //TODO: Actually only ALARM_S (SIG_1)
             Matcher matcher = EVENT_ALARM_ACK_PATTERN.matcher(tagString);
-            if (matcher.matches()) {
+            if (matcher.matches()){
+                String[] arrIdAndSig;
                 String EventIds = matcher.group(2);
                 String[] arrStrEventId = EventIds.split(",");
                 ArrayList<Integer> arrEventId = new ArrayList<>();
-                for (String EventId : arrStrEventId) {
+                for (String EventId:arrStrEventId){
                     EventId = EventId.replaceAll("16#", "");
-                    arrEventId.add(Integer.parseInt(EventId, 16));
+                    arrIdAndSig =  EventId.split(";");
+                    arrEventId.add(Integer.parseInt(arrIdAndSig[0], 16));
+                    arrEventId.add(Integer.parseInt(arrIdAndSig[1], 16));                    
                 }
-                return new S7SubscriptionTag(tagString, S7SubscriptionType.ALARM_ACK, arrEventId);
-            }
+                return new S7SubscriptionTag(S7SubscriptionType.ALARM_ACK,
+                            arrEventId);
+                
+            }            
         }
 
         {
             //TODO: Support for ALARM_8            
-            Matcher matcher = EVENT_ALARM_QUERY_PATTERN.matcher(tagString);
-            if (matcher.matches()) {
-                return new S7SubscriptionTag(tagString, S7SubscriptionType.ALARM_QUERY, AlarmType.ALARM_S);
+            Matcher matcher = EVENT_ALARM_QUERY_PATTERN.matcher(tagString); 
+            TimeBase tb = null;
+            short multi = 0;            
+            if (matcher.matches()){
+
+                return new S7SubscriptionTag(S7SubscriptionType.ALARM_QUERY,
+                            AlarmType.ALARM_S);    
             }
         }
 
         {
-            if (S7Tag.matches(tagString)) {
-                S7Tag s7Tag = S7Tag.of(tagString);
-                switch (s7Tag.getDataType()) {
-                    case BYTE:
-
-                    default:
-
-                }
-                return new S7SubscriptionTag(tagString, S7SubscriptionType.CYCLIC_SUBSCRIPTION,
-                    s7Tag);
+            Matcher matcher = EVENT_SUBSCRIPTION_DB_QUERY_PATTERN.matcher(tagString);          
+            if (matcher.matches()){
+                TimeBase tb = TimeBase.valueOf(matcher.group(TIME_BASE));
+                short multi = Short.parseShort(matcher.group(TIME_BASE_MULTIPLIER));                
+                String strAddress = matcher.group(9);
+                strAddress = strAddress.replaceAll("\\[", ".0:BYTE[");
+                String[] dbAddress = strAddress.split(",");       
+                S7Tag[] s7tags = new S7Tag[dbAddress.length];
+                int i=0;
+                for (String address:dbAddress) {
+                    s7tags[i] = S7Tag.of(address);
+                    i++;
+                }                
+                return new S7SubscriptionTag(S7SubscriptionType.CYCLIC_DB_SUBSCRIPTION,
+                            s7tags,
+                            tb,
+                            multi);    
+            }            
+            
+        }   
+        
+        {
+            Matcher matcher = EVENT_SUBSCRIPTION_S7ANY_QUERY_PATTERN.matcher(tagString);
+            if (matcher.matches()){     
+                TimeBase tb = TimeBase.valueOf(matcher.group(TIME_BASE));
+                short multi = Short.parseShort(matcher.group(TIME_BASE_MULTIPLIER));
+                S7Tag[] myTags = null;
+                String strAddress = matcher.group(9);  
+                String[] fieldAddress = strAddress.split(","); 
+                myTags = new S7Tag[fieldAddress.length];            
+                int i=0;
+                for (String address:fieldAddress) {
+                    myTags[i] = S7Tag.of(address);
+                    i++;
+                }         
+                return new S7SubscriptionTag(S7SubscriptionType.CYCLIC_SUBSCRIPTION,
+                            myTags,
+                tb,
+                multi);                
             }
         }
+
+         {
+            Matcher matcher = EVENT_CANCEL_JOB_QUERY_PATTERN.matcher(tagString);
+            if (matcher.matches()){
+                String[] arrIdAndSig;
+                String strJobIds = matcher.group(2);
+                String[] arrStrEventId = strJobIds.split(",");
+                ArrayList<Integer> arrJobId = new ArrayList<>();
+                for (String jobId:arrStrEventId){
+                    arrJobId.add(Integer.parseInt(jobId));                   
+                }
+                return new S7SubscriptionTag(S7SubscriptionType.CYCLIC_UNSUBSCRIPTION,
+                            arrJobId);
+                
+            }            
+        } 
+        
+        
+        
         throw new PlcInvalidTagException("Unable to parse address: " + tagString);
     }
 
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SslTag.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SzlTag.java
similarity index 82%
rename from plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SslTag.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SzlTag.java
index cdb88b6f99..26a9ffd3a0 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SslTag.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/tag/S7SzlTag.java
@@ -27,26 +27,26 @@ import org.apache.plc4x.java.api.model.ArrayInfo;
 import org.apache.plc4x.java.api.model.PlcTag;
 import org.apache.plc4x.java.api.types.PlcValueType;
 
-public class S7SslTag implements PlcTag {
+public class S7SzlTag implements PlcTag {
     
    //SZL_ID=0xYYYY;INDEX=0xZZZZ
     private static final Pattern SSL_ADDRESS_PATTERN =
-        Pattern.compile("^SSL_ID=(?<sslId>16#[0-9a-fA-F]{4});INDEX=(?<index>16#[0-9a-fA-F]{4})");  
+        Pattern.compile("^SZL_ID=(?<szlId>16#[0-9a-fA-F]{4});INDEX=(?<index>16#[0-9a-fA-F]{4})");  
     
-    private static final String SSL_ID = "sslId";    
+    private static final String SZL_ID = "szlId";    
     private static final String INDEX = "index";    
     
     private final int szlId;
     private final int index;
 
-    public S7SslTag(int sslId, int index) {
-        this.szlId = sslId;
+    public S7SzlTag(int szlId, int index) {
+        this.szlId = szlId;
         this.index = index;
     }
 
     @Override
     public String getAddressString() {
-        return String.format("SSL_ID=%s;INDEX=16#%d", szlId, index);
+        return String.format("SZL_ID=%s;INDEX=16#%d", szlId, index);
     }
 
     @Override
@@ -59,7 +59,7 @@ public class S7SslTag implements PlcTag {
         return Collections.emptyList();
     }
 
-    public int getSslId() {
+    public int getSzlId() {
         return szlId;
     }
 
@@ -71,14 +71,14 @@ public class S7SslTag implements PlcTag {
         return SSL_ADDRESS_PATTERN.matcher(tagString).matches();
     }   
     
-    public static S7SslTag of(String tagString) {
+    public static S7SzlTag of(String tagString) {
         Matcher matcher = SSL_ADDRESS_PATTERN.matcher(tagString);
         if (matcher.matches()){
-            String strSxlId = matcher.group(SSL_ID);
+            String strSxlId = matcher.group(SZL_ID);
             String strIndex = matcher.group(INDEX);
             strSxlId = strSxlId.replaceAll("16#", "");
             strIndex = strIndex.replaceAll("16#", "");
-            return new S7SslTag(Integer.parseInt(strSxlId, 16),Integer.parseInt(strIndex, 16));
+            return new S7SzlTag(Integer.parseInt(strSxlId, 16),Integer.parseInt(strIndex, 16));
         }  
         throw new PlcInvalidTagException("Unable to parse address: " + tagString);
     }       
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7SubscriptionType.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7SubscriptionType.java
index ec718e8ede..2b3062af0b 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7SubscriptionType.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7SubscriptionType.java
@@ -24,5 +24,6 @@ public enum S7SubscriptionType {
     ALARM_ACK,
     ALARM_QUERY,
     CYCLIC_SUBSCRIPTION,
+    CYCLIC_DB_SUBSCRIPTION,    
     CYCLIC_UNSUBSCRIPTION;    
 }
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
index 3fda942897..727a624dd5 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
@@ -50,6 +50,7 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.apache.plc4x.java.s7.readwrite.DataTransportSize;
 
 /**
  * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
@@ -397,7 +398,7 @@ public class StaticHelper {
     /**
      *
      */
-    public enum SSL {
+    public enum SZL {
         ID_0x0011(0x0011, "Module identification.") {
             @Override
             public StringBuilder execute(ByteBuf data) {
@@ -570,16 +571,16 @@ public class StaticHelper {
         private final int code;
         private final String description;
 
-        private static final Map<Integer, SSL> map;
+        private static final Map<Integer, SZL> map;
 
         static {
             map = new HashMap<>();
-            for (SSL subssl : SSL.values()) {
-                map.put(subssl.code, subssl);
+            for (SZL subszl : SZL.values()) {
+                map.put(subszl.code, subszl);
             }
         }
 
-        SSL(final int code, final String description) {
+        SZL(final int code, final String description) {
             this.code = code;
             this.description = description;
         }
@@ -592,7 +593,7 @@ public class StaticHelper {
             return description;
         }
 
-        public static SSL valueOf(int code) {
+        public static SZL valueOf(int code) {
             return map.get(code);
         }
 
@@ -1416,6 +1417,16 @@ public class StaticHelper {
     public static int RightShift3(final ReadBuffer buffer) throws ParseException {
         return buffer.readUnsignedInt(16) >> 3;
     }
+    
+    public static int RightShift3(final ReadBuffer buffer, DataTransportSize tsize) throws ParseException {
+        int value = 0;
+        if (tsize == DataTransportSize.OCTET_STRING){
+            value = buffer.readUnsignedInt(16);
+        } else {
+            value = buffer.readUnsignedInt(16) >> 3;
+        }
+        return value;    
+    }
 
     //TODO: apply only if not the last item
     public static int EventItemLength(final ReadBuffer buffer, int valueLength) {
diff --git a/plc4j/examples/plc4j-s7event/pom.xml b/plc4j/examples/plc4j-s7event/pom.xml
index 46940b6276..d460eee4fe 100644
--- a/plc4j/examples/plc4j-s7event/pom.xml
+++ b/plc4j/examples/plc4j-s7event/pom.xml
@@ -76,5 +76,15 @@
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-simple</artifactId>
+      <version>2.0.6</version>
+    </dependency>
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+      <version>1.15</version>
+    </dependency>
   </dependencies>
 </project>
\ No newline at end of file
diff --git a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/CycSubscription.java b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/CycSubscription.java
new file mode 100644
index 0000000000..3c6cc73efd
--- /dev/null
+++ b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/CycSubscription.java
@@ -0,0 +1,127 @@
+/*
+ * 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
+ *
+ *   https://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.examples.plc4j.s7event;
+
+import java.util.Map;
+
+import org.apache.plc4x.java.DefaultPlcDriverManager;
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
+import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
+import org.apache.plc4x.java.s7.events.S7AlarmEvent;
+import org.apache.plc4x.java.s7.events.S7CyclicEvent;
+import org.apache.plc4x.java.s7.events.S7ModeEvent;
+import org.apache.plc4x.java.s7.events.S7SysEvent;
+import org.apache.plc4x.java.s7.events.S7UserEvent;
+import org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.simple.SimpleLogger;
+import org.apache.commons.codec.binary.Hex;
+
+
+/**
+ * Example for capturing events generated from a Siemens S7-300, S7-400 or VIPA PLC.
+ * Support for mode events ("MODE"), system events ("SYS"), user events ("USR")
+ * and alarms ("ALM").
+ * Each consumer shows the tags and associated values of the "map" containing
+ * the event parameters.
+ */
+public class CycSubscription {
+
+    private static final Logger logger = LoggerFactory.getLogger(CycSubscription.class);    
+    
+    /**
+     * @param args the command line arguments
+     */
+    public static void main(String[] args) throws Exception {
+        System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "trace");                   
+        
+        try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://10.10.1.33?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
+            final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder();
+            
+            //subscription.addEventTagAddress("myCYC", "CYC(B01SEC:5):%DB9002.DBB0[1]");
+            subscription.addEventTagAddress("myCYC", "CYC(B01SEC:5):%MB190:BYTE");
+            
+            final PlcSubscriptionRequest sub = subscription.build();
+            final PlcSubscriptionResponse subresponse = sub.execute().get();
+
+            //Si todo va bien con la subscripción puedo
+//            subresponse
+//                .getSubscriptionHandle("myMODE")
+//                .register(msg -> {
+//                    System.out.println("******** S7ModeEvent ********");
+//                    Map<String, Object> map = ((S7ModeEvent) msg).getMap();
+//                    map.forEach((x, y) -> {
+//                        System.out.println(x + " : " + y);
+//                    });
+//                    System.out.println("****************************");
+//                });
+//
+//            subresponse
+//                .getSubscriptionHandle("mySYS")
+//                .register(msg -> {
+//                    System.out.println("******** S7SysEvent ********");
+//                    Map<String, Object> map = ((S7SysEvent) msg).getMap();
+//                    map.forEach((x, y) -> {
+//                        if ("INFO1".equals(x)) {
+//                            System.out.println(x + " : " + String.format("0x%04X", y));
+//                        } else if ("INFO2".equals(x)) {
+//                            System.out.println(x + " : " + String.format("0x%08X", y));    
+//                        } else System.out.println(x + " : " + y);
+//                    });
+//                    System.out.println("****************************");
+//                });
+//
+//            subresponse
+//                .getSubscriptionHandle("myUSR")
+//                .register(msg -> {
+//                    System.out.println("******** S7UserEvent *******");
+//                    Map<String, Object> map = ((S7UserEvent) msg).getMap();
+//                    map.forEach((x, y) -> {
+//                        System.out.println(x + " : " + y);
+//                    });
+//                    System.out.println("****************************");
+//                });
+
+            subresponse
+                .getSubscriptionHandle("myCYC")
+                .register(msg -> {
+                    System.out.println("******** CYC Event *********");
+                    Map<String, Object> map = ((S7CyclicEvent) msg).getMap();
+                    map.forEach((x, y) -> {
+                        if (x.startsWith("DATA_", 0)) {
+                            System.out.println("Longitud de datos: " + ((byte[]) y).length);
+                            System.out.println(x + ": " + Hex.encodeHexString((byte[]) y));
+                        } else
+                        System.out.println(x + " : " + y);
+                    });
+                    System.out.println("****************************");
+                });
+                
+            System.out.println("Waiting for events");
+
+            Thread.sleep(120000000);
+
+            System.out.println("Bye...");
+
+        }
+    }
+
+}
diff --git a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
index 242bf4704f..99048d9997 100644
--- a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
+++ b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
@@ -28,6 +28,10 @@ import org.apache.plc4x.java.s7.events.S7AlarmEvent;
 import org.apache.plc4x.java.s7.events.S7ModeEvent;
 import org.apache.plc4x.java.s7.events.S7SysEvent;
 import org.apache.plc4x.java.s7.events.S7UserEvent;
+import org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.simple.SimpleLogger;
 
 /**
  * Example for capturing events generated from a Siemens S7-300, S7-400 or VIPA PLC.
@@ -38,54 +42,62 @@ import org.apache.plc4x.java.s7.events.S7UserEvent;
  */
 public class EventSubscription {
 
+    private static final Logger logger = LoggerFactory.getLogger(EventSubscription.class);    
+    
     /**
      * @param args the command line arguments
      */
     public static void main(String[] args) throws Exception {
-        try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://192.168.1.51?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
+        System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "trace");                   
+        
+        try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://10.10.1.33?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
             final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder();
-
-            subscription.addEventTagAddress("myMODE", "MODE");
-            subscription.addEventTagAddress("mySYS", "SYS");
-            subscription.addEventTagAddress("myUSR", "USR");
+            
+//            subscription.addEventTagAddress("myMODE", "MODE");
+//            subscription.addEventTagAddress("mySYS", "SYS");
+//            subscription.addEventTagAddress("myUSR", "USR");
             subscription.addEventTagAddress("myALM", "ALM");
 
             final PlcSubscriptionRequest sub = subscription.build();
             final PlcSubscriptionResponse subresponse = sub.execute().get();
 
             //Si todo va bien con la subscripción puedo
-            subresponse
-                .getSubscriptionHandle("myMODE")
-                .register(msg -> {
-                    System.out.println("******** S7ModeEvent ********");
-                    Map<String, Object> map = ((S7ModeEvent) msg).getMap();
-                    map.forEach((x, y) -> {
-                        System.out.println(x + " : " + y);
-                    });
-                    System.out.println("****************************");
-                });
-
-            subresponse
-                .getSubscriptionHandle("mySYS")
-                .register(msg -> {
-                    System.out.println("******** S7SysEvent ********");
-                    Map<String, Object> map = ((S7SysEvent) msg).getMap();
-                    map.forEach((x, y) -> {
-                        System.out.println(x + " : " + y);
-                    });
-                    System.out.println("****************************");
-                });
-
-            subresponse
-                .getSubscriptionHandle("myUSR")
-                .register(msg -> {
-                    System.out.println("******** S7UserEvent *******");
-                    Map<String, Object> map = ((S7UserEvent) msg).getMap();
-                    map.forEach((x, y) -> {
-                        System.out.println(x + " : " + y);
-                    });
-                    System.out.println("****************************");
-                });
+//            subresponse
+//                .getSubscriptionHandle("myMODE")
+//                .register(msg -> {
+//                    System.out.println("******** S7ModeEvent ********");
+//                    Map<String, Object> map = ((S7ModeEvent) msg).getMap();
+//                    map.forEach((x, y) -> {
+//                        System.out.println(x + " : " + y);
+//                    });
+//                    System.out.println("****************************");
+//                });
+//
+//            subresponse
+//                .getSubscriptionHandle("mySYS")
+//                .register(msg -> {
+//                    System.out.println("******** S7SysEvent ********");
+//                    Map<String, Object> map = ((S7SysEvent) msg).getMap();
+//                    map.forEach((x, y) -> {
+//                        if ("INFO1".equals(x)) {
+//                            System.out.println(x + " : " + String.format("0x%04X", y));
+//                        } else if ("INFO2".equals(x)) {
+//                            System.out.println(x + " : " + String.format("0x%08X", y));    
+//                        } else System.out.println(x + " : " + y);
+//                    });
+//                    System.out.println("****************************");
+//                });
+//
+//            subresponse
+//                .getSubscriptionHandle("myUSR")
+//                .register(msg -> {
+//                    System.out.println("******** S7UserEvent *******");
+//                    Map<String, Object> map = ((S7UserEvent) msg).getMap();
+//                    map.forEach((x, y) -> {
+//                        System.out.println(x + " : " + y);
+//                    });
+//                    System.out.println("****************************");
+//                });
 
             subresponse
                 .getSubscriptionHandle("myALM")
@@ -97,7 +109,7 @@ public class EventSubscription {
                     });
                     System.out.println("****************************");
                 });
-
+                
             System.out.println("Waiting for events");
 
             Thread.sleep(120000);
diff --git a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/SzlRequest.java b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/SzlRequest.java
new file mode 100644
index 0000000000..e5c4c66b9d
--- /dev/null
+++ b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/SzlRequest.java
@@ -0,0 +1,104 @@
+/*
+ * 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
+ *
+ *   https://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.examples.plc4j.s7event;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.plc4x.java.DefaultPlcDriverManager;
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
+import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.simple.SimpleLogger;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.SZL;
+import org.apache.plc4x.java.s7.utils.S7ParamErrorCode;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.lang3.ArrayUtils;
+
+/**
+ * Example for capturing events generated from a Siemens S7-300, S7-400 or VIPA PLC.
+ * Support for mode events ("MODE"), system events ("SYS"), user events ("USR")
+ * and alarms ("ALM").
+ * Each consumer shows the tags and associated values of the "map" containing
+ * the event parameters.
+ */
+public class SzlRequest {
+
+    private static final Logger logger = LoggerFactory.getLogger(SzlRequest.class);    
+    
+    /**
+     * @param args the command line arguments
+     */
+    public static void main(String[] args) throws Exception {
+        System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "trace");
+        
+        System.out.println("***********************************************");
+        System.out.println("Before using, take a look at:");
+        System.out.println("System Software for S7-300/400.\r\nSystem and Standard Functions - Volume 1/2");
+        System.out.println("Document: A5E02789976-01");
+        System.out.println("Chapter 34 System Status Lists (SSL).");
+        System.out.println("URL: https://cache.industry.siemens.com/dl/files/604/44240604/att_67003/v1/s7sfc_en-EN.pdf");
+        System.out.println("***********************************************\r\n");        
+        
+        
+        try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://10.10.1.33?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
+            final PlcReadRequest.Builder subscription = connection.readRequestBuilder();
+            
+            System.out.println("Request: SZL_ID=16#0000;INDEX=16#0000");
+            
+            subscription.addTagAddress("MySSL", "SZL_ID=16#0300;INDEX=16#0131");
+            
+            final PlcReadRequest sub = subscription.build();
+            final PlcReadResponse szlresponse = sub.execute().get();
+
+            if (szlresponse.getResponseCode("MySSL") == PlcResponseCode.OK){
+                Collection<Byte>  data = szlresponse.getAllBytes("MySSL");
+                byte[] dbytes = ArrayUtils.toPrimitive(data.toArray(new Byte[data.size()]));
+                
+                System.out.println("DATA: \r\n" + Hex.encodeHexString(dbytes));
+//                System.out.println("");
+//                
+//                SZL szl = SZL.valueOf(0x001C);
+//                StringBuilder sb =  szl.execute(data);
+//                System.out.println(sb.toString());                
+            } else if (szlresponse.getResponseCode("MySSL") == PlcResponseCode.NOT_FOUND){
+//                System.out.println("Service not found."); 
+//                ByteBuf data = ((S7ByteReadResponse) szlresponse).getByteBufValues("MySSL");
+//                System.out.println(S7ParamErrorCode.valueOf(data.getShort(0)) + 
+//                        " : " + 
+//                        S7ParamErrorCode.valueOf(data.getShort(0)).getEvent());
+            }
+
+            Thread.sleep(3000);
+            //connection.close();
+
+
+            System.out.println("Bye...");
+
+        }
+    }
+
+}
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 85983b74c6..c771144548 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -196,9 +196,9 @@
             [simple   uint 4  cpuFunctionGroup]
             [simple   uint 8  cpuSubfunction]
             [simple   uint 8  sequenceNumber]
-            [optional uint 8  dataUnitReferenceNumber 'cpuFunctionType == 8']
-            [optional uint 8  lastDataUnit 'cpuFunctionType == 8']
-            [optional uint 16 errorCode 'cpuFunctionType == 8']
+            [optional uint 8  dataUnitReferenceNumber '(cpuFunctionType == 8) || ((cpuFunctionType == 0) && (cpuFunctionGroup == 2))']
+            [optional uint 8  lastDataUnit '(cpuFunctionType == 8) || ((cpuFunctionType == 0) && (cpuFunctionGroup == 2))']
+            [optional uint 16 errorCode '(cpuFunctionType == 8) || ((cpuFunctionType == 0) && (cpuFunctionGroup == 2))']
         ]
     ]
 ]
@@ -232,7 +232,7 @@
             [array S7VarPayloadStatusItem items count 'CAST(parameter, "S7ParameterWriteVarResponse").numItems']
         ]
         ['0x00','0x07' S7PayloadUserData
-            [array S7PayloadUserDataItem('CAST(CAST(parameter, "S7ParameterUserData").items[0], "S7ParameterUserDataItemCPUFunctions").cpuFunctionType', 'CAST(CAST(parameter, "S7ParameterUserData").items[0], "S7ParameterUserDataItemCPUFunctions").cpuSubfunction') items count 'COUNT(CAST(parameter, "S7ParameterUserData").items)']
+            [array S7PayloadUserDataItem('CAST(CAST(parameter, "S7ParameterUserData").items[0], "S7ParameterUserDataItemCPUFunctions").cpuFunctionGroup', 'CAST(CAST(parameter, "S7ParameterUserData").items[0], "S7ParameterUserDataItemCPUFunctions").cpuFunctionType', 'CAST(CAST(parameter, "S7ParameterUserData").items[0], "S7ParameterUserDataItemCPUFunctions").cpuSubfunction') items count 'COUNT(CAST(parameter, "S7ParameterUserData").items)']
         ]
     ]
 ]
@@ -279,13 +279,25 @@
     ]
 ]
 
+//TODO: Se debe modificar el calculo para incluir el tipo
+//      . si es tipo 4 usa el desplazamiento
+//      . si es tipo 3, la longitud es la indicada
+//      . verificar calculo con los otros tipos
 [type AssociatedValueType
     [simple DataTransportErrorCode returnCode]
     [simple DataTransportSize      transportSize]
-    [manual uint 16                valueLength   'STATIC_CALL("RightShift3", readBuffer)' 'STATIC_CALL("LeftShift3", writeBuffer, valueLength)' '16']
+    //[manual uint 16                valueLength   'STATIC_CALL("RightShift3", readBuffer)' 'STATIC_CALL("LeftShift3", writeBuffer, valueLength)' '16']
+    [manual uint 16                valueLength  'STATIC_CALL("RightShift3", readBuffer, transportSize)' 'STATIC_CALL("LeftShift3", writeBuffer, valueLength)' '2']
     [array  uint 8                 data          count    'STATIC_CALL("EventItemLength", readBuffer, valueLength)']
 ]
 
+[type AssociatedQueryValueType
+    [simple DataTransportErrorCode returnCode]
+    [simple DataTransportSize      transportSize]
+    [simple uint 16                valueLength]
+    [array  uint 8                 data          count    'valueLength']
+]
+
 //TODO: Convert BCD to uint
 [type DateAndTime
     [manual uint 8  year    'STATIC_CALL("BcdToInt", readBuffer)'    'STATIC_CALL("ByteToBcd", writeBuffer, year)'    '8']
@@ -346,6 +358,27 @@
     [array  AlarmMessageAckObjectPushType messageObjects count 'numberOfObjects' ]
 ]
 
+//TODO: Apply for S7-300
+[type AlarmMessageQueryType(uint 16 dataLength)
+    [simple uint 8                      functionId]
+    [simple uint 8                      numberOfObjects]
+    [simple DataTransportErrorCode      returnCode]
+    [simple DataTransportSize           transportSize]
+    [const  uint 16                     DataLength     0xFFFF]
+    [array  AlarmMessageObjectQueryType messageObjects count   'STATIC_CALL("countAMOQT", readBuffer, dataLength)' ]
+]
+
+//TODO: Apply for S7-400
+[type Alarm8MessageQueryType
+    [simple uint 8                      functionId]
+    [simple uint 8                      numberOfObjects]
+    [simple DataTransportErrorCode      returnCode]
+    [simple DataTransportSize           transportSize]
+    [simple  uint 16                    byteCount]
+    [array  AlarmMessageObjectQueryType messageObjects count   'byteCount / 12' ]
+]
+
+//TODO: Check for Alarm_8
 [type AlarmMessageObjectQueryType
     [simple   uint 8              lengthDataset]
     [reserved uint 16             '0x0000']
@@ -391,10 +424,44 @@
 ]
 
 ////////////////////////////////////////////////////////////////
+// Cycle service Payloads
+////////////////////////////////////////////////////////////////
+//Under test
+[discriminatedType  CycServiceItemType
+    [const    uint 8 functionId       0x12]
+    [simple   uint 8 byteLength]
+    [simple   uint 8 syntaxId]
+    [typeSwitch syntaxId
+        ['0x10' CycServiceItemAnyType
+            [simple  TransportSize   transportSize]
+            [simple uint 16 length]
+            [simple uint 16 dbNumber]            
+            [simple MemoryArea memoryArea]
+            [simple uint 24 address]
+        ]
+        ['0xb0' CycServiceItemDbReadType
+            [simple   uint 8 numberOfAreas]            
+            [array SubItem items count 'numberOfAreas']
+        ]
+    ]
+]
+
+[type SubItem
+    [simple uint 8 bytesToRead]
+    [simple uint 16 dbNumber]
+    [simple uint 16 startAddress]
+]
+
+////////////////////////////////////////////////////////////////
+// DataItem by Function Group Type:
+// 0x00 MODE_TRANSITION
+// 0x04 CPU_FUNCTIONS
+// 0x08 TYPE_RES
+//
 // DataItem by Function Type:
 // 0x00 PUSH
-// 0x04 TYPE_REQ
-// 0x08 TYPE_RES
+// 0x04 REQUEST
+// 0x08 RESPONSE
 //
 // DataItem by Sub Function Type:
 // 0x01 CPU_READSZL
@@ -414,14 +481,54 @@
 // 0x16 NOTIFY8_IND
 ////////////////////////////////////////////////////////////////
 
-[discriminatedType S7PayloadUserDataItem(uint 4 cpuFunctionType, uint 8 cpuSubfunction)
+[discriminatedType S7PayloadUserDataItem(uint 4 cpuFunctionGroup, uint 4 cpuFunctionType, uint 8 cpuSubfunction)
     [simple     DataTransportErrorCode returnCode]
     [simple     DataTransportSize      transportSize]
-    [implicit   uint 16                dataLength    'lengthInBytes - 4']
-    [typeSwitch cpuFunctionType, cpuSubfunction, dataLength
+    [simple         uint 16                dataLength]
+    //[implicit   uint 16                dataLength    'lengthInBytes - 4']
+
+    [typeSwitch cpuFunctionGroup, cpuFunctionType, cpuSubfunction, dataLength
+
+        ['0x02', '0x00', '0x01' S7PayloadUserDataItemCyclicServicesPush
+            [simple uint 16 itemsCount]
+            [array AssociatedValueType items count 'itemsCount']
+        ]
+
+        ['0x02', '0x00', '0x05' S7PayloadUserDataItemCyclicServicesChangeDrivenPush
+            [simple uint 16 itemsCount]
+            [array AssociatedQueryValueType items count 'itemsCount']
+        ]
+
+        ['0x02', '0x04', '0x01' S7PayloadUserDataItemCyclicServicesSubscribeRequest
+            [simple uint 16 itemsCount]
+            [simple TimeBase timeBase]
+            [simple uint 8 timeFactor]
+            [array CycServiceItemType item count 'itemsCount']
+        ]
+
+        ['0x02', '0x04', '0x04' S7PayloadUserDataItemCyclicServicesUnsubscribeRequest
+            [simple  uint 8  function]
+            [simple  uint 8  jobId]
+        ]
+
+        ['0x02', '0x08', '0x01' S7PayloadUserDataItemCyclicServicesSubscribeResponse
+            [simple uint 16 itemsCount]
+            [array AssociatedValueType items count 'itemsCount']
+        ]
+
+        ['0x02', '0x08', '0x04' S7PayloadUserDataItemCyclicServicesUnsubscribeResponse
+        ]
+
+        ['0x02', '0x08', '0x05', '0x00' S7PayloadUserDataItemCyclicServicesErrorResponse
+        ]
+
+        ['0x02', '0x08', '0x05'  S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse
+            [simple uint 16 itemsCount]
+            [array AssociatedQueryValueType  items count 'itemsCount']
+        ]
 
         //USER and SYSTEM Messages
-        ['0x00', '0x03' S7PayloadDiagnosticMessage
+        ['0x04', '0x00', '0x03' S7PayloadDiagnosticMessage
             [simple uint 16     EventId]
             [simple uint 8      PriorityClass]
             [simple uint 8      ObNumber]
@@ -432,56 +539,66 @@
         ]
 
         //PUSH message reception S7300 & S7400 (ALARM_SQ, ALARM_S, ALARM_SC, ...)
-        ['0x00', '0x05' S7PayloadAlarm8
+        ['0x04', '0x00', '0x05' S7PayloadAlarm8
             [simple AlarmMessagePushType alarmMessage]
         ]
-        ['0x00', '0x06' S7PayloadNotify
+        ['0x04', '0x00', '0x06' S7PayloadNotify
             [simple AlarmMessagePushType alarmMessage]
         ]
-        ['0x00', '0x0c' S7PayloadAlarmAckInd
+        ['0x04', '0x00', '0x0c' S7PayloadAlarmAckInd
             [simple AlarmMessageAckPushType alarmMessage]
         ]
-        ['0x00', '0x11' S7PayloadAlarmSQ
+        ['0x04', '0x00', '0x11' S7PayloadAlarmSQ
             [simple AlarmMessagePushType alarmMessage]
         ]
-        ['0x00', '0x12' S7PayloadAlarmS
+        ['0x04', '0x00', '0x12' S7PayloadAlarmS
             [simple AlarmMessagePushType alarmMessage]
         ]
-        ['0x00', '0x13' S7PayloadAlarmSC
+        ['0x04', '0x00', '0x13' S7PayloadAlarmSC
             [simple AlarmMessagePushType alarmMessage]
         ]
-        ['0x00', '0x16' S7PayloadNotify8
+        ['0x04', '0x00', '0x16' S7PayloadNotify8
             [simple AlarmMessagePushType alarmMessage]
         ]
 
         //Request for specific functions of the SZL system
-        ['0x04', '0x01' S7PayloadUserDataItemCpuFunctionReadSzlRequest
+        ['0x04','0x04', '0x01', '0x00' S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest
+        ]
+
+        ['0x04', '0x04', '0x01' S7PayloadUserDataItemCpuFunctionReadSzlRequest
             [simple   SzlId                  szlId]
             [simple   uint 16                szlIndex]
         ]
-        ['0x08', '0x01' S7PayloadUserDataItemCpuFunctionReadSzlResponse
-            [simple   SzlId           szlId]
-            [simple   uint 16         szlIndex]
-            [const    uint 16         szlItemLength 28]
-            [implicit uint 16         szlItemCount  'COUNT(items)']
-            [array    SzlDataTreeItem items         count 'szlItemCount']
+
+        //['0x04', '0x08', '0x01' S7PayloadUserDataItemCpuFunctionReadSzlResponse
+        //    [simple   SzlId           szlId]
+        //    [simple   uint 16         szlIndex]
+        //    [const    uint 16         szlItemLength 28]
+        //    [implicit uint 16         szlItemCount  'COUNT(items)']
+        //    [array    SzlDataTreeItem items         count 'szlItemCount']
+        //]
+
+        ['0x04', '0x08', '0x01' S7PayloadUserDataItemCpuFunctionReadSzlResponse(uint 16 dataLength)
+            [array byte items count 'dataLength']
         ]
 
         //Subscription to PUSH messages
-        ['0x04', '0x02' S7PayloadUserDataItemCpuFunctionMsgSubscription
+        ['0x04', '0x04', '0x02' S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest
             [simple   uint 8         Subscription]
             [reserved uint 8         '0x00']
             [simple   string         64             magicKey           ]
             [optional AlarmStateType Alarmtype    'Subscription >= 128']
             [optional uint 8         Reserve      'Subscription >= 128']
         ]
-	    ['0x08', '0x02', '0x00' S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse
-        ]
-	    ['0x08', '0x02', '0x02' S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
+
+	['0x04', '0x08', '0x02', '0x00' S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse]
+
+        ['0x04', '0x08', '0x02', '0x02' S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse
             [simple uint 8 result]
             [simple uint 8 reserved01]
         ]
-	    ['0x08', '0x02', '0x05' S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
+
+        ['0x04', '0x08', '0x02', '0x05' S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse
             [simple uint 8    result]
             [simple uint 8    reserved01]
             [simple AlarmType alarmType]
@@ -490,19 +607,23 @@
         ]
 
         //ALARM_ACK Acknowledgment of alarms
-        ['0x04', '0x0b' S7PayloadUserDataItemCpuFunctionAlarmAck
-            [simple   uint 8                    functionId]
+        ['0x04', '0x04', '0x0b' S7PayloadUserDataItemCpuFunctionAlarmAckRequest
+            [const    uint 8       functionId       0x09]
             [implicit uint 8                    numberOfObjects 'COUNT(messageObjects)']
             [array    AlarmMessageObjectAckType messageObjects  count 'numberOfObjects' ]
         ]
-        ['0x08', '0x0b' S7PayloadUserDataItemCpuFunctionAlarmAckResponse
+
+        ['0x04', '0x08', '0x0b', '0x00' S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse
+        ]
+
+        ['0x04', '0x08', '0x0b' S7PayloadUserDataItemCpuFunctionAlarmAckResponse
             [simple    uint 8 functionId]
             [implicit  uint 8 numberOfObjects 'COUNT(messageObjects)']
             [array     uint 8 messageObjects  count 'numberOfObjects' ]
         ]
 
         //ALARM_QUERY Request for alarms stored in the controller
-        ['0x04', '0x13' S7PayloadUserDataItemCpuFunctionAlarmQuery
+        ['0x04', '0x04', '0x13' S7PayloadUserDataItemCpuFunctionAlarmQueryRequest
             [const    uint 8       functionId       0x00]
             [const    uint 8       numberMessageObj 0x01]
             [const    uint 8       variableSpec     0x12]
@@ -513,13 +634,11 @@
             [reserved uint 8       '0x34']
             [simple   AlarmType    alarmType]
         ]
-        ['0x08', '0x13' S7PayloadUserDataItemCpuFunctionAlarmQueryResponse
-            [const    uint 8                 functionId          0x00]
-            [const    uint 8                 numberMessageObj    0x01]
-            [simple   DataTransportErrorCode pudicfReturnCode]
-            [simple   DataTransportSize      pudicftransportSize]
-            [reserved uint 8                 '0x00']
+
+        ['0x04', '0x08', '0x13' S7PayloadUserDataItemCpuFunctionAlarmQueryResponse(uint 16 dataLength)
+            [array byte items count 'dataLength']
         ]
+
     ]
 ]
 
@@ -780,6 +899,7 @@
 ]
 
 [enum uint 8 SzlSublist
+    ['0x00' NONE]    
     ['0x11' MODULE_IDENTIFICATION]
     ['0x12' CPU_FEATURES]
     ['0x13' USER_MEMORY_AREA]
@@ -813,6 +933,7 @@
     ['0x02' SYS]
     ['0x04' USR]
     ['0x80' ALM]
+    ['0x69' CYC] //Not from s7 standar, only for internal processing.
 ]
 
 [enum uint 8 SyntaxIdType
@@ -850,6 +971,7 @@
     ['0x01' BYALARMTYPE]
     ['0x02' ALARM_8]
     ['0x04' ALARM_S]
+    ['0x09' ALARM_8P] //Under test with S7-400 PLC
 ]
 
 [enum uint 8 ModeTransitionType
@@ -863,3 +985,10 @@
     ['0x11' LINK_UP]
     ['0x12' UPDATE]
 ]
+
+[enum uint 8 'TimeBase'
+    ['0x00' B01SEC]
+    ['0x01' B1SEC]
+    ['0X02' B10SEC]
+]
+
diff --git a/src/site/asciidoc/users/protocols/s7.adoc b/src/site/asciidoc/users/protocols/s7.adoc
old mode 100644
new mode 100755
index 31472eb423..0fb73ed577
--- a/src/site/asciidoc/users/protocols/s7.adoc
+++ b/src/site/asciidoc/users/protocols/s7.adoc
@@ -6,7 +6,7 @@
 //  (the "License"); you may not use this file except in compliance with
 //  the License.  You may obtain a copy of the License at
 //
-//      https://www.apache.org/licenses/LICENSE-2.0
+//      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,
@@ -15,7 +15,11 @@
 //  limitations under the License.
 //
 :imagesdir: ../../images/users/protocols
-:icons: font
+:icons: image
+:iconsdir: ../../images/users/protocols
+:source-highlighter: rouge
+//:coderay-linenums-mode: inline
+//:coderay-css: class
 
 == S7 (Step7)
 image::s7_banner.png[banner,512,167]
@@ -69,38 +73,65 @@ image::s7_banner.png[banner,512,167]
 3+|Options
 
 |
-| `local-rack` (1)
+| `local-rack`
 | `Rack` value for the client (PLC4X device). Defaults to 1.
+Default value: 1
 
 |
-| `local-slot` (1)
+| `local-slot`
 | `Slot` value for the client (PLC4X device). Defaults to 1.
+Default value: 1
 
 |
-| `remote-rack` (0)
-| `Rack` value for the remote (PLC). Defaults to 0.
+| `local-tsap`
+| `tsap` .
+Default value: 0
 
 |
-| `remote-slot` (0)
-| `Slot` value for the remote (PLC). Defaults to 0.
+| `remote-rack`
+| `Rack` value for the remote main CPU (PLC). Defaults to 0.
+Default value: 0
 
 |
-| `pdu-size` (1024)
+| `remote-slot`
+| `Slot` value for the remote main CPU (PLC). Defaults to 0.
+Default value: 0
+
+|
+| `remote-rack2`
+| `Rack` value for the remote secondary CPU (PLC). Defaults to 0.
+Default value: 0
+
+|
+| `remote-slot2`
+| `Slot` value for the remote secondary CPU (PLC). Defaults to 0.
+Default value: 0
+
+|
+| `remote-tsap`
+| `tsap` .
+Default value: 0
+
+|
+| `pdu-size`
 | Maximum size of a data-packet sent to and received from the remote PLC.
 During the connection process both parties will negotiate a maximum size both parties can work with and is equal or smaller than the given value is used.
-The driver will automatically split up large requests to not exceed this value in a request or expected response.
+The driver will automatically split up large requests to not exceed this value in a request or expected response. 
+Default value: 1024 bytes
 
 |
-| `max-amq-caller` (8)
+| `max-amq-caller`
 | Maximum number of unconfirmed requests the PLC will accept in parallel before discarding with errors.
 This parameter also will be negotiated during the connection process and the maximum both parties can work with and is equal or smaller than the given value is used.
 The driver will automatically take care not exceeding this value while processing requests. Too many requests can cause a growing queue.
+Default value: 8
 
 |
-| `max-amq-callee` (8)
+| `max-amq-callee`
 | Maximum number of unconfirmed responses or requests PLC4X will accept in parallel before discarding with errors.
 This option is available for completeness and is correctly handled out during the connection process, however it is currently not enforced on PLC4X's side.
 So if a PLC would send more messages than agreed upon, these would still be processed.
+Default value: 8
 
 |
 | `controller-type`
@@ -115,6 +146,29 @@ Possible values are:
 - `S7_1500`
 - `LOGO`
 
+|
+| `read-timeout`
+| This is the maximum waiting time for reading on the TCP channel. 
+As there is no traffic, it must be assumed that the connection with the interlocutor was lost and it must be restarted.
+When the channel is closed, the "fail over" is carried out in case of having the secondary channel, or it is expected that it will be restored automatically, which is done every 4 seconds.
+Default value: 8 seconds.
+
+|
+| `retry-time`
+| Time for supervision of TCP channels. If the channel is not active, a safe stop of the EventLoop must be performed, to ensure that no additional tasks are created.
+Default value: 4 seconds  
+
+|
+| `ping`
+| If your application requires sampling times greater than the set "read-timeout" time, it is important that the PING option is activated, this will prevent the TCP channel from being closed unnecessarily. 
+Default value: false
+
+|
+| `ping-time`
+| Time value in seconds at which the execution of the PING will be scheduled.
+Generally set by developer experience, but generally should be the same as (read-timeout / 2).
+Default value: -1 seconds  
+
 |===
 
 === Individual Resource Address Format
@@ -260,7 +314,7 @@ Not all S7 device types support the same full set of memory areas, so the last c
 |CHAR           |B |Character               |8 bit character                                                                        |1  |All
 |WCHAR          |X |Double byte character   |16 bit character value                                                                 |2  |S7_1200, S7_1500
 |STRING         |X |String                  |String 2 + n bytes                                                                     |1  |All
-|WSTRING        |X |Double byte String      |String of 16 bit characters 2 + n bytes                                                |1  |S7_1200, S7_1500
+ |WSTRING        |X |Double byte String      |String of 16 bit characters 2 + n bytes                                                |1  |S7_1200, S7_1500
 
 6+|Temporal values
 |S5TIME          |X |S5 Time            |S5 Time (like in duration)                                                                 |2  |S7_300, S7_400, S7_1500
@@ -275,21 +329,603 @@ Not all S7 device types support the same full set of memory areas, so the last c
 
 The S7 driver allows the subscription to asynchronous events generated in the PLC.
 
-This type of event is generated by S7-300, S7-400 controllers and VIPA devices. Unfortunately for the S7-1200 and S7-1500 series this functionality has been superseded.
+This type of event is generated by S7-300, S7-400, G120C-PN, S120-PN controllers and VIPA devices. Unfortunately for the S7-1200 and S7-1500 series this functionality has been superseded.
 
+[NOTE,icon=s7_note.png]
 For a complete list of compatibility between the S7-300,400 and S7-1200 & S7-1500, you can see the document in [1] provided by Siemens.
 
-In applications
+These services have the following advantages:
+
+. Report the status of the CPUs and other components within the control architecture that support it (CP, IM, DI, etc).
+. Transfer of values when a change occurs.
+. Associate values to the events sent.
+. A better handling of the TimeStamp of the associated values.
+
+The messages are classified into two groups depending on how they are generated:
+
+. SCAN: All those events generated by the system or preset in Step7 (TIA Portal). The change of state of the configured signals is carried out by the operating system at specific intervals (500 ms, 100ms or 16 ms).
+. ALARM: These are events generated by the user application using the alarm blocks (ALARM_S, ALARM_SQ, NOTIFY, ALARM, ALARM_8). In addition to user applications, these events can be generated from technological functions such as PCS7 or Braumat.
+
+The data associated with the events is represented in a HashMap in order to facilitate its transfer to other applications based on a standard such as JMS, MQTT or other messaging technology.
+
+The handling of the TimeStamp of the SCAN type events is generated in the computer. In ALARM type messages the TimeStamps are generated in the PLC. It is extremely important that the date and time synchronization is done between both computers and PLC.
+
+The values associated with the events can have different types of representation, so their interpretation must be agreed upon during the programming of the application in the PLC and your application.
+
+For each type of event, the particular fields of type <String, T> will be arranged within the Map. These will be documented for each type of event.
+
+To maximize the use of the data fields associated with the events, the use of the intra-area pointer system and the ANY type pointer is recommended in the PLC, As well as the recommendations for the management of the time stamp [2].
+
+The different actors that iterate in the driver for asynchronous events and cyclical subscription can be seen in image 1.
+
+
+[plantuml, target="image01", format=png, align="center"]
+....
+autonumber "<b>(00)"
+title Participants in the communication model of the S7 driver.
+footer Image 1
+
+actor App
+participant PLC4X
+box "PLC (AS)" #LightBlue
+participant OS
+participant PCS7
+participant S7App
+endbox
+....
+
+
+. `PLC (AS)`, the controller. `AS` is the reference used in PCS7.
+. `App`,  your application.
+. `PLC4X`, implementation of the S7 driver.
+. `OS`, PLC operating system.
+. `PCS7`, represents the technological functions used in the PLC. PCS7 are Siemens DCS libraries.
+. `S7App`, your application that runs on the PLC.
+
+At the user application level `App`, you can use the PLC4X API to subscribe SCAN or ALARM type events by selecting any of the following fields according to the requirement:
 
 . `MODE`: Change of operating state in the controller, change from STOP to RUN and vice versa.
 . `SYS`: System events, associated with internal events of the controller or events previously parameterized for their indication.
 . `USR`: Events programmed by the user and that are registered in the internal diagnostic buffer.
 . `ALM`: Alarm events generated by the user program, ALARM_S, ALARM_8, NOTIFY.
 
+In the following sections we will describe in more detail the functionalities of each field.
+
+==== SCAN Events
+
+==== Subscription to MODE events (S7ModeEvent).
+
+By subscribing to controller status changes or `MODE` events, the PLC status changes can be tracked.
+
+Depending on the CPU model, these state changes are followed in the user application (PLC program), OB100 and OB101, allowing these applications to be brought to a safe state.
+
+Now, how do these state changes affect external applications, for example HMI or custom user applications?
+
+In the use of a unified Siemens architecture, the operator panels (HMI) and WinCC (Scada) detect the status of the CPU and pass the quality of the points in the database in real time to poor quality.
+
+In the case of an application developed with PLC4X, the use of MODE events will allow your application to indicate to users the quality of the points used, and that by design the quality is not updated in the controller.
+
+
+[plantuml, target=image02, format=png, align="center"]
+....
+autonumber "<b>(00)"
+title PLC4X Simatic S7 <b>MODE</b> Suscription.
+footer Image 2
+
+actor App
+participant PLC4X
+box "PLC (AS)" #LightBlue
+participant OS
+participant PCS7
+participant S7App
+endbox
+
+App -> PLC4X : subscription("MODE")
+PLC4X -> OS
+OS -> PLC4X
+PLC4X -> App : OK
+App -> PLC4X : Register the consumer
+OS -> OS : STOP
+OS --> PLC4X
+PLC4X --> App : to consumer
+...latter...
+OS -> OS : WARM_RESTART
+OS --> PLC4X
+PLC4X --> App : to consumer
+OS -> OS : RUN 
+OS --> PLC4X
+PLC4X --> App : to consumer
+....
+
+From image 2, we can describe the sequence of actions that can be followed for subscription. In the first place, the subscription process occurs from the *App* of the user (1)(2)(3)(4), having a positive response the application is ready to receive the events asynchronously from the *PLC (AS)*. 
+
+Suppose that the manager for a reason passes the controller to *STOP* (06) through the front switch or from the engineering station, then *OS* proceeds to send a notification (07)(08) to all consoles that are registered to receive this event. 
+
+Subsequently, the manager decides to switch the controller to execution mode, through the front switch or the engineering console, at this time the *OS* is in charge of generating the startup events, initially it indicates the hot start *WARN_RESTART* (09)(10)(11) and if the startup is successful, indicate that the controller is in execution mode or *RUN* (12)(13)(14).
+
+The information received in (08)(11)(14) is included in the attached table.
+
+|===
+|Field |Type |Description
+
+|TYPE |STRING |Fixed value.
+|TIMESTAMP |Instant |Instant.now () value assigned when receiving the event from the PLC. 
+|MAP |HashMap |The HashMap with all fields.
+|METHOD |byte |Value of "method" as defined in S7Parameter.
+|FUNCTION |byte |Value of "function" as defined in S7Parameter.
+|CURRENT_MODE |short |Status value reported in the event. Check the ModeTransitionType enum.
+|===
+
+With the sequence diagram and the data structures that will be received by the application, we can analyze the Java code for this specific function. We think this should serve as a pseudocode for the other languages.
+
+
+[source,java]
+----
+public class PLCEventModeSubscription {
+ 
+   public static void main(String[] args) throws Exception {
+    try (PlcConnection connection = new PlcDriverManager()
+			.getConnection("s7://192.168.1.51?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
+
+      final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder(); // <01>
+
+      subscription.addEventField("myMODE", "MODE");
+      final PlcSubscriptionRequest sub = subscription.build();
+            
+      System.out.println("Query: " + sub.toString());
+
+      final PlcSubscriptionResponse subresponse = sub.execute().get();
+            
+      if (subresponse.getResponseCode("myMODE") == PlcResponseCode.OK) { //<04>      
+				PlcConsumerRegistration registerMode = 
+        	subresponse
+          	.getSubscriptionHandle("myMODE") //<05>
+          	.register(msg -> { //<08><11><14>                                      
+           		System.out.println("******** S7ModeEvent ********");   
+            	Map<String, Object> map = ((S7ModeEvent) msg).getMap();
+            	map.forEach((x, y) -> { 
+              	System.out.println(x + " : " + y);
+            	});
+            	short currentmode = (short) 
+              map.get(S7ModeEvent.Fields.CURRENT_MODE.name());
+            	System.out.println("CURRENT_MODE MSG: " + ModeTransitionType.enumForValue(currentmode).name());
+            	System.out.println("****************************");
+          	});
+			}
+          System.out.println("Waiting for the messages.");            
+          Thread.sleep(120000);            
+          connection.close();            
+          System.out.println("Ending the connection.");                         
+        }        
+    }    
+}
+----
+
+
+==== Subscription to SYS events (S7SysEvent) and USER events (S7UserEvent).
+
+System events allow to receive asynchronously any event that affects the operation of the controller, or any of its peripheral equipment that is capable of sending events through a PROFIBUS or Profinet fieldbus.
+
+[plantuml, target="image03", format=png, align="center"]
+....
+autonumber "<b>(00)"
+title PLC4X Simatic S7 System Event <b>SYS</b> subscription.
+footer Image 3
+
+actor App
+participant PLC4X
+box "PLC (AS)" #LightBlue
+participant OS
+participant PCS7
+participant S7App
+endbox
+
+box "CP" #LightGray
+participant CP
+endbox
+
+App -> PLC4X : subscription("MODE")
+PLC4X -> OS
+OS -> PLC4X
+PLC4X -> App : OK
+App -> PLC4X : Register the consumer
+
+CP -> OS : STOP
+OS ->  OS : To Diagnostic buffer
+OS --> PLC4X
+PLC4X --> App : to consumer
+....
+
+A first example of its use is the change of state of a CP, IM or FM within the architecture of the controller. This will allow the application to indicate that there is an effect on the system that may affect the quality of the signals used, allowing preventive or corrective actions to be taken as required.
+
+[plantuml, target="image04", format=png, align="center"]
+....
+autonumber "<b>(00)"
+title PLC4X User Event <b>USR</b> subscription.
+footer Image 4
+
+actor App
+participant PLC4X
+box "PLC (AS)" #LightBlue
+participant OS
+participant PCS7
+participant S7App
+endbox
+
+box "CP" #LightGray
+participant CP
+endbox
+
+App -> PLC4X : subscription("USR")
+PLC4X -> OS
+OS -> PLC4X
+PLC4X -> App : OK
+App -> PLC4X : Register the consumer
+
+S7App -> OS : To diagnostic buffer
+S7App -> OS : To registered console
+OS --> PLC4X
+PLC4X --> App : to consumer
+....
+
+In general, system and user events are part of the same group of events, but they are differentiated to facilitate their processing.
+
+From the sequence diagrams after subscribing to the required event type (01)(02)(03)(04), the consumer (05) is registered to start receiving the events either from the *SYS* system or from the user *USR*.
 
-==== Diagnostic request
+When the event is generated, it is sent to the diagnostic buffer (06) and an image of it is sent to all consoles registered to receive this type of event (07) distributed by the OS (08).
 
-TODO
+Since at the protocol level the events are not differentiated, the PLC4X driver (08) is in charge of classifying the events in *SYS* or *USR* and transferring them to the registered consumer (09).
+
+[TIP,icon=s7_tip.png]
+For didactic purposes, a step-by-step explanation has been carried out, but in general the *App* application can be subscribed to the four types of events simultaneously.
+
+
+The following table shows the fields available for each message.
+
+
+
+|===
+|Field |Type |Description
+
+|TYPE |STRING |Fixed value.
+|TIMESTAMP |Instant |Instant.now () value assigned when receiving the event from the PLC. 
+|EVENT_ID |short |OS generated event ID.
+|PRIORITY_CLASS |byte |Value of "method" as defined in S7Parameter.
+|OB_NUMBER |byte |Value of "function" as defined in S7Parameter.
+|DAT_ID |short |Status value reported in the event. Check the ModeTransitionType enum.
+|INFO1 |WORD |System information 1 word long.
+|INFO2 |DWORD |System information 2 words l ng.
+|===
+
+For SYS events, the EVENT_ID is generated automatically by the *OS*, and basically they are constant in the different families of controllers.
+
+For the USER or User-defined events follow the same pattern as system events. They have the particularity that the value of EVENT_ID must be between the values 0xAXXX and 0xBYYY.
+
+This programming of the user-defined events is carried out at the level of the *PLC(AS)* controller, so we recommend the technical note [3] of the Siemens portal.
+
+[TIP,icon=s7_tip.png]
+In the case of user-defined messages, it is important to take into account that these are reported to the diagnostic buffer, which has a limited capacity depending on the CPU model used. Also take into account that the diagnostic buffer works like a circular buffer, so the oldest messages will be lost.
+
+....
+   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+   |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1|
+   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+   \__________/\__________/\____________________/
+    Event class     IDs         Event number
+  
+    Event Class:
+       1   Standard OB Events
+       2   Synchronous errors
+       3   Asynchronous errors
+       4   Mode transition
+       5   Run-time events
+       6   Communications events
+       7   Events for fail-safe and fault tolerant systems
+       8   Standardized diagnostic data on modules
+       9   Predefined user events
+     A,B   Freely definable events
+   C,D,E   Reserved
+       F   Events for modules other than CPUs (for example, CPs, FMs)
+  
+   IDs (Bit)
+       8   0:Event leaving state, 1:Event entering state
+       9   1:Entry in diagnostic buffer
+      10   1:Internal error
+      11   1:External error
+....
+
+In the previous table we can see how the event classes are coded, and how they are classified. If you require detailed information on each event, the user's *App* must interpret the indicated bits.
+
+In the INFO1 and INFO2 fields, specific diagnostic information associated with the event is generally attached, or some information that needs to be recorded in the case of user events.
+
+The INFO1 field contains information that can be stored in a word, namely, WORD, INT of ARRAY [0..1] OF CHAR.
+
+The INFO2 field contains information that can be stored in a double word, namely, DWORD, DINT, REAL, TIME, ARRAY [0..3] OF CHAR.
+
+Below is an example code for the subscription of events type *SYS*.
+
+[source,java]
+----
+public static void main(String[] args) throws Exception {
+ try (PlcConnection connection = new PlcDriverManager().
+  getConnection("s7://192.168.1.51?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
+
+   final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder(); //<01>
+
+   subscription.addEventField("mySYS", "SYS");
+   final PlcSubscriptionRequest sub = subscription.build();
+
+   System.out.println("Query: " + sub.toString());
+
+   final PlcSubscriptionResponse subresponse = sub.execute().get();
+
+   PlcConsumerRegistration registerSys =
+    subresponse
+     .getSubscriptionHandle("mySYS") //<05>
+     .register(msg -> { //<09>
+      System.out.println("******** S7SysEvent ********");
+      Map<String, Object> map = ((S7SysEvent) msg).getMap();
+      map.forEach((x, y) -> {
+       System.out.println(x + " : " + y);
+      });
+      Integer eventid = (Integer) map.get(S7SysEvent.Fields.EVENT_ID.name());
+      System.out.println("DIAGNOSTIC: " + S7DiagnosticEventId.
+      valueOf(eventid.shortValue()).getDescription()); //<10> 
+      System.out.println("****************************");
+     });
+
+   System.out.println("Waiting for the messages.");
+   Thread.sleep(120000);
+   connection.close();
+   System.out.println("Ending the connection.");
+  }
+ }
+----
+
+And below is an example code for the subscription of events type *USR*.
+
+[source,java]
+----
+public static void main(String[] args) throws Exception {
+ try (PlcConnection connection = new PlcDriverManager().
+  getConnection("s7://192.168.1.51?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
+
+   final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder();
+
+   subscription.addEventField("myUSR", "USR");
+   final PlcSubscriptionRequest sub = subscription.build();
+            
+   System.out.println("Query: " + sub.toString());
+
+   final PlcSubscriptionResponse subresponse = sub.execute().get();
+            
+   PlcConsumerRegistration registerUsr = 
+    subresponse
+    .getSubscriptionHandle("myUSR") //<05>
+    .register(msg -> {
+     System.out.println("******** S7UserEvent *******");
+     Map<String, Object> map = ((S7UserEvent) msg).getMap();
+     map.forEach((x, y) -> { //<09> 
+      System.out.println(x + " : " + y);
+     });
+     System.out.println("****************************");
+    });    
+
+   System.out.println("Waiting for the messages.");            
+   Thread.sleep(120000);
+   connection.close();
+   System.out.println("Ending the connection.");                
+  }        
+ }
+----
+
+The Java code shows how to detect the type of event in an event type *SYS*. In the S7 driver, there is an enum object _S7DiagnosticEventId_(10) that allows us to identify which internal event of the *PLC(AS)* generated it and thus, through the interpretation of the INFO1 and INFO2 fields, determine the root cause of the event.
+
+[NOTE, icon = s7_note.png]
+To date, the enum object _S7DiagnosticEventId_ contains a considerable amount of diagnostic values, it must be updated according to the new CPUs or firmware versions available.
+
+Unlike *SYS* events, *USR* events must be interpreted directly by the *App* application, so they are generally scheduled during the development phase of the *S7App* application.
+
+By having INFO1 and INFO2 in the *S7App* program, the user can transfer data associated with events, such as transitions between phases, events of diagnostic routines such as firts-out or the start or end of a batch process, all asynchronously. 
+
+==== Subscription to ALM type events (S7AlarmEvent).
+
+
+
+
+
+[plantuml, target="image05", format=png, align="center"]
+....
+autonumber "<b>(00)"
+title PLC4X Simatic S7 Alarm Event <b>ALM</b> suscription.
+footer Image 5
+
+actor App
+participant PLC4X
+box "PLC (AS)" #LightBlue
+participant OS
+participant PCS7
+participant S7App
+endbox
+
+box "CP" #LightGray
+participant CP
+endbox
+
+App -> PLC4X : subscription("ALM")
+PLC4X -> OS
+OS -> PLC4X
+PLC4X -> App : OK
+App -> PLC4X : Register the consumer
+
+App -> PLC4X : Request alarms
+PLC4X -> OS 
+OS -> PLC4X : Alarm_1,Alarm_2,
+PLC4X -> OS : Next seq   
+OS -> PLC4X : Alarm_3,Alarm_4,Alarm_9000  
+PLC4X -> OS : Next seq   
+OS -> PLC4X : Alarm_5,Alarm_6,
+PLC4X -> OS : Next seq
+OS -> PLC4X : Alarm_7,Alarm_8.
+
+PLC4X -> App : Alarm_1,Alarm_2,Alarm_3,Alarm_4,Alarm_9000,Alarm_5,Alarm_6,Alarm_7,Alarm_8
+PCS7 --> OS : Alarm_1000 to console 
+OS --> PLC4X
+PLC4X --> App : Alarm_1000 to consumer
+
+S7App --> OS : Alarm_9000 to console 
+OS --> PLC4X
+PLC4X --> App : Alarm_9000 to consumer
+
+S7App --> OS : Alarm_6 User defined alarm to console 
+activate S7App
+OS --> PLC4X
+PLC4X --> App : Alarm_6 to consumer
+
+S7App -> S7App : Wait for Alarm_6 ack
+
+App -> PLC4X : ACK Alarm_6
+PLC4X -> OS : ACK Alarm_6 
+OS -> PLC4X : OK
+PLC4X -> App : OK
+deactivate S7App
+OS --> PLC4X : Alarm_6 status update
+PLC4X --> App : to consumer
+
+....
+
+The registration sequence for subscription is the typical one carried out so far (01)(02)(03)(04)(05). From that moment on, you can start receiving alarm events asynchronously.
+
+Depending on your application, you can make a request for the currently active alarms in the alarm buffer of the *PLC(AS)*, in this way you can prepare a reception buffer or establish the correct state of a state machine that depends on the Active events in the controller.
+
+You must take into account that when making the request (06), from a few to hundreds of alarms can be stored depending on the complexity of your application and the capacity of the *PLC (AS)*.
+
+In this scenario, the *PLC4X* driver maintains the dialogue with the *OS* to receive sequentially (07)(08)(09)(10)(11)(12)(13)(14) the alarms stored on the controller, to later transfer them to the user application *App* (15).
+
+At the end of the subscription process, it will begin to receive the events generated by the system, such as high precision time signals (16)(17)(18)(19) or events generated by the user application (20)(21)(22).
+
+This simple sequence of events is used by process applications based on PCS7, for the handling of alarms, events and logging of practically all the events of the distributed control system (DCS).
+
+Another important feature of the driver is the ability to recognize the alarms generated from the *PLC(AS)*. In (23)(24)(25) the *S7App* application generates an alarm/event that is required to be acknowledged by the user to continue with the execution of a specific routine. The user applications *App* generates the acknowledgment (27)(28) using the corresponding alarm identifier, the *OS* is responsible for making the confirmation (29)(30) and asynchronously generating an event for the  [...]
+
+Within the cyclical execution of the application *S7App* waits for the confirmation of the alarm (26) to continue with some specific routine. 
+
+TODO: Field description
+
+|===
+|Field |Type |Description
+
+|TYPE  | |
+|TIMESTAMP | |
+|TIMESTAMP_GOING | |
+|TIMESTAMP_COMING | |
+|ASSOCIATED_VALUES | |
+|MAP | |
+|EVENT_ID | |
+|EVENT_STATE | |
+|STATE | |
+|ACKSTATE_GOING | |
+|ACKSTATE_COMING | |
+|EVENT_GOING | |
+|EVENT_COMING | |
+|EVENT_LAST_CHANGE | |
+|SIG | |
+|SIG_[1...8] | |
+|SIG_STATE | |
+|SIG_[1...8]_STATE | |
+|SIG_DATA | |
+|SIG_[1...8]_DATA | |
+|SIG_[1...8]_DATA_GOING | |
+|SIG_[1...8]_DATA_CO
+|SIG_[1..8]_DATA_STATUS | |
+|SIG_[1...8]_DATA_SIZE | |
+|SIG_[1...8]_DATA_LENGTH | |
+|===
+
+
+TODO: Example code
+
+
+==== TODO: Cyclic subscription (CYC).
+
+The cyclical subscription allows the acquisition of data in passive mode, that is, the data is sent from the PLC in a cyclical and synchronous way.
+
+[plantuml, target="image01", format=png, align="center"]
+....
+autonumber "<b>(00)"
+title Participants in the communication model of the S7 driver.
+footer Image 1
+
+actor App
+participant PLC4X
+box "PLC (AS)" #LightBlue
+participant OS
+participant PCS7
+participant S7App
+endbox
+....
+
+
+The data transfer has three time bases:
+
+. *B01SEC*: Time base 0.1 Sec. (100 mSec.).
+. *B0SEC*: Time base 1.0 Sec.
+. *B10SEC*: Time base 10 Sec.
+
+
+
+==== TODO: Diagnostic request
+
+....
+
+  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+  |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1|
+  +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+  \__________/\__________/\____________________/
+   Module      Number of   Number of the partial 
+   class       the partial list
+               list 
+               extract
+ 
+  Module Class:
+  +--------------+-----------------+ 
+  | Module class | Coding (Binary) |
+  +--------------|-----------------+
+  |     CPU      |      0000       | 
+  +--------------|-----------------+
+  |     IM       |      0100       | 
+  +--------------|-----------------+
+  |     FM       |      1000       | 
+  +--------------|-----------------+
+  |     CP       |      1100       | 
+  +--------------|-----------------+
+....
+
+|===
+|*Module class* |*ZSL-ID* |*Implemented*
+|Module identification |16#xy11 |
+|CPU characteristics |16#xy12 |
+|User memory areas |16#xy13   |
+|System areas |16#xy14   |
+|Block types  |16#xy15   |
+|Interrupt status |16#xy22   |
+|Assignment between process image partitions and OBs |16#xy25   |
+|Communication status data |16#xy32   |
+|H CPU group information |16#xy71   |
+|Status of the module LEDs |16#xy74   |
+|Switched DP slaves in the H-system |16#xy75   |
+|Module status information |16#xy91   |
+|Rack / station status information |16#xy92   |
+|Rack / station status information |16#xy94   |
+|Extended DP master system / PROFINET IO system information |16#xy95   |
+|Module status information, PROFINET IO and PROFIBUS DP |16#xy96   |
+|Tool changer information (PROFINET IO) |16#xy9C   |
+|Diagnostic buffer of the CPU |16#xyA0   |
+|Module diagnostic information (data record 0) |16#xyB1   |
+|Module diagnostic information (data record 1), geographical address|16#xyB2   |
+|Module diagnostic information (data record 1), local address |16#xyB3   |
+|Diagnostic data of a DP slave |16#xyB4   |
+|===
 
 ==== Some useful tips
 
@@ -314,3 +950,15 @@ Each digital input and output can be addresses by a single bit-address (start-ad
 ==== Resources
 
 1. https://support.industry.siemens.com/cs/document/109797648/simatic-comparison-list-for-s7-300-s7-400-s7-1200-s7-1500?dti=0&lc=en-WW
+2. https://support.industry.siemens.com/cs/mdm/109746537?c=98956468747&lc=es-DO
+3. https://support.industry.siemens.com/cs/document/15166942/writing-user-specific-information-to-the-diagnostic-buffer-of-a-cpu-(sfc-52)?dti=0&lc=en-ES
+4. https://support.industry.siemens.com/cs/document/24013249/how-do-you-display-alarm_s-or-alarm_d-messages-with-process-values-(so-called-associated-values)-on-a-wincc-flexible-operator-panel-?dti=0&lc=en-WW
+5. https://support.industry.siemens.com/cs/document/109481157/comunicaci%C3%B3n-entre-paneles-de-operador-simatic-hmi-y-convertidores-de-frecuencia-sinamics-g120-para-el-manejo-y-la-visualizaci%C3%B3n-de-avisos-de-fallo-y-de-advertencia-(enlace-directo-sin-controlador)?dti=0&lc=es-WW
+6. https://support.industry.siemens.com/cs/document/97550333/sinamics-g-s-hmi-direct-access?dti=0&lc=en-WW
+7. https://support.industry.siemens.com/cs/document/21402122/technology-cpus-technology-template-error-messages-?dti=0&lc=en-WW
+8. https://support.industry.siemens.com/cs/document/77467239/transforming-warning-and-error-messages-of-a-sinamics-drive-with-the-aid-of-the-xml-parser-and-integrating-them-into-a-step-7-hmi-project?dti=0&lc=en-WW
+9. https://support.industry.siemens.com/cs/document/24037531/%C2%BFqu%C3%A9-pasos-de-configuraci%C3%B3n-hay-que-realizar-en-el-simotion-scout-y-el-wincc-flexible-para-que-se-muestren-los-avisos-alarm_s-y-las-alarmas-tecnol%C3%B3gicas-dentro-del-wincc-flexible-runtime-?dti=0&lc=es-ES
+
+
+
+