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/12/03 13:02:04 UTC

(plc4x) 02/02: Arreglando el manejo de los tipos TIME. modificacion del PlcTIME y s7.mspec.

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

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

commit 00b58d61ec1d02eed9cbc81f19e38969da547d3a
Author: Cesar Garcia <ce...@ceos.com.ve>
AuthorDate: Sun Dec 3 08:54:58 2023 -0400

    Arreglando el manejo de los tipos TIME. modificacion del PlcTIME y s7.mspec.
---
 plc4j/drivers/s7/pom.xml                           |   4 +-
 .../java/s7/readwrite/Alarm8MessageQueryType.java  | 252 ++++++++
 .../readwrite/AlarmMessageAckObjectPushType.java   | 253 ++++++++
 .../java/s7/readwrite/AlarmMessageAckPushType.java | 192 ++++++
 .../s7/readwrite/AlarmMessageAckResponseType.java  | 164 +++++
 .../java/s7/readwrite/AlarmMessageAckType.java     | 170 ++++++
 .../s7/readwrite/AlarmMessageObjectAckType.java    | 246 ++++++++
 .../s7/readwrite/AlarmMessageObjectPushType.java   | 329 ++++++++++
 .../s7/readwrite/AlarmMessageObjectQueryType.java  | 310 ++++++++++
 .../java/s7/readwrite/AlarmMessagePushType.java    | 192 ++++++
 .../java/s7/readwrite/AlarmMessageQueryType.java   | 252 ++++++++
 .../plc4x/java/s7/readwrite/AlarmStateType.java    |  59 ++
 .../apache/plc4x/java/s7/readwrite/AlarmType.java  |  56 ++
 .../s7/readwrite/AssociatedQueryValueType.java     | 204 +++++++
 .../java/s7/readwrite/AssociatedValueType.java     | 220 +++++++
 .../apache/plc4x/java/s7/readwrite/COTPPacket.java | 238 ++++++++
 .../s7/readwrite/COTPPacketConnectionRequest.java  | 200 ++++++
 .../s7/readwrite/COTPPacketConnectionResponse.java | 200 ++++++
 .../plc4x/java/s7/readwrite/COTPPacketData.java    | 159 +++++
 .../s7/readwrite/COTPPacketDisconnectRequest.java  | 200 ++++++
 .../s7/readwrite/COTPPacketDisconnectResponse.java | 167 +++++
 .../java/s7/readwrite/COTPPacketTpduError.java     | 165 +++++
 .../plc4x/java/s7/readwrite/COTPParameter.java     | 182 ++++++
 .../java/s7/readwrite/COTPParameterCalledTsap.java | 141 +++++
 .../s7/readwrite/COTPParameterCallingTsap.java     | 141 +++++
 .../java/s7/readwrite/COTPParameterChecksum.java   | 141 +++++
 ...TPParameterDisconnectAdditionalInformation.java | 145 +++++
 .../java/s7/readwrite/COTPParameterTpduSize.java   | 151 +++++
 .../plc4x/java/s7/readwrite/COTPProtocolClass.java |  58 ++
 .../plc4x/java/s7/readwrite/COTPTpduSize.java      |  87 +++
 .../java/s7/readwrite/CpuSubscribeEvents.java      |  57 ++
 .../java/s7/readwrite/CycServiceItemAnyType.java   | 244 ++++++++
 .../s7/readwrite/CycServiceItemDbReadType.java     | 169 +++++
 .../java/s7/readwrite/CycServiceItemType.java      | 189 ++++++
 .../apache/plc4x/java/s7/readwrite/DataItem.java   | 531 ++++++++++++++++
 .../java/s7/readwrite/DataTransportErrorCode.java  |  59 ++
 .../plc4x/java/s7/readwrite/DataTransportSize.java |  87 +++
 .../plc4x/java/s7/readwrite/DateAndTime.java       | 313 ++++++++++
 .../plc4x/java/s7/readwrite/DeviceGroup.java       |  56 ++
 .../apache/plc4x/java/s7/readwrite/EventType.java  |  58 ++
 .../apache/plc4x/java/s7/readwrite/MemoryArea.java |  89 +++
 .../java/s7/readwrite/ModeTransitionType.java      |  62 ++
 .../apache/plc4x/java/s7/readwrite/QueryType.java  |  57 ++
 .../apache/plc4x/java/s7/readwrite/S7Address.java  | 146 +++++
 .../plc4x/java/s7/readwrite/S7AddressAny.java      | 276 +++++++++
 .../java/s7/readwrite/S7DataAlarmMessage.java      | 192 ++++++
 .../apache/plc4x/java/s7/readwrite/S7Message.java  | 262 ++++++++
 .../java/s7/readwrite/S7MessageObjectRequest.java  | 256 ++++++++
 .../java/s7/readwrite/S7MessageObjectResponse.java | 196 ++++++
 .../plc4x/java/s7/readwrite/S7MessageRequest.java  | 120 ++++
 .../plc4x/java/s7/readwrite/S7MessageResponse.java | 164 +++++
 .../java/s7/readwrite/S7MessageResponseData.java   | 165 +++++
 .../plc4x/java/s7/readwrite/S7MessageUserData.java | 121 ++++
 .../plc4x/java/s7/readwrite/S7Parameter.java       | 187 ++++++
 .../s7/readwrite/S7ParameterModeTransition.java    | 252 ++++++++
 .../s7/readwrite/S7ParameterReadVarRequest.java    | 165 +++++
 .../s7/readwrite/S7ParameterReadVarResponse.java   | 145 +++++
 .../readwrite/S7ParameterSetupCommunication.java   | 191 ++++++
 .../java/s7/readwrite/S7ParameterUserData.java     | 164 +++++
 .../java/s7/readwrite/S7ParameterUserDataItem.java | 148 +++++
 .../S7ParameterUserDataItemCPUFunctions.java       | 337 ++++++++++
 .../s7/readwrite/S7ParameterWriteVarRequest.java   | 165 +++++
 .../s7/readwrite/S7ParameterWriteVarResponse.java  | 145 +++++
 .../apache/plc4x/java/s7/readwrite/S7Payload.java  | 179 ++++++
 .../plc4x/java/s7/readwrite/S7PayloadAlarm8.java   | 160 +++++
 .../java/s7/readwrite/S7PayloadAlarmAckInd.java    | 160 +++++
 .../plc4x/java/s7/readwrite/S7PayloadAlarmS.java   | 160 +++++
 .../plc4x/java/s7/readwrite/S7PayloadAlarmSC.java  | 160 +++++
 .../plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java  | 160 +++++
 .../s7/readwrite/S7PayloadDiagnosticMessage.java   | 295 +++++++++
 .../plc4x/java/s7/readwrite/S7PayloadNotify.java   | 160 +++++
 .../plc4x/java/s7/readwrite/S7PayloadNotify8.java  | 160 +++++
 .../s7/readwrite/S7PayloadReadVarResponse.java     | 154 +++++
 .../plc4x/java/s7/readwrite/S7PayloadUserData.java | 172 ++++++
 .../java/s7/readwrite/S7PayloadUserDataItem.java   | 483 +++++++++++++++
 .../S7PayloadUserDataItemClkFRequest.java          | 134 ++++
 .../S7PayloadUserDataItemClkFResponse.java         | 203 ++++++
 .../readwrite/S7PayloadUserDataItemClkRequest.java | 134 ++++
 .../S7PayloadUserDataItemClkResponse.java          | 203 ++++++
 .../S7PayloadUserDataItemClkSetRequest.java        | 177 ++++++
 .../S7PayloadUserDataItemClkSetResponse.java       | 134 ++++
 ...erDataItemCpuFunctionAlarmAckErrorResponse.java | 138 +++++
 ...loadUserDataItemCpuFunctionAlarmAckRequest.java | 201 ++++++
 ...oadUserDataItemCpuFunctionAlarmAckResponse.java | 195 ++++++
 ...adUserDataItemCpuFunctionAlarmQueryRequest.java | 316 ++++++++++
 ...dUserDataItemCpuFunctionAlarmQueryResponse.java | 166 +++++
 ...temCpuFunctionMsgSubscriptionAlarmResponse.java | 258 ++++++++
 ...rDataItemCpuFunctionMsgSubscriptionRequest.java | 250 ++++++++
 ...DataItemCpuFunctionMsgSubscriptionResponse.java | 138 +++++
 ...aItemCpuFunctionMsgSubscriptionSysResponse.java | 182 ++++++
 ...serDataItemCpuFunctionReadSzlNoDataRequest.java | 138 +++++
 ...yloadUserDataItemCpuFunctionReadSzlRequest.java | 183 ++++++
 ...loadUserDataItemCpuFunctionReadSzlResponse.java | 166 +++++
 ...UserDataItemCyclicServicesChangeDrivenPush.java | 192 ++++++
 ...yclicServicesChangeDrivenSubscribeResponse.java | 193 ++++++
 ...oadUserDataItemCyclicServicesErrorResponse.java | 138 +++++
 .../S7PayloadUserDataItemCyclicServicesPush.java   | 190 ++++++
 ...UserDataItemCyclicServicesSubscribeRequest.java | 239 ++++++++
 ...serDataItemCyclicServicesSubscribeResponse.java | 192 ++++++
 ...erDataItemCyclicServicesUnsubscribeRequest.java | 181 ++++++
 ...rDataItemCyclicServicesUnsubscribeResponse.java | 138 +++++
 .../s7/readwrite/S7PayloadWriteVarRequest.java     | 154 +++++
 .../s7/readwrite/S7PayloadWriteVarResponse.java    | 154 +++++
 .../java/s7/readwrite/S7VarPayloadDataItem.java    | 220 +++++++
 .../java/s7/readwrite/S7VarPayloadStatusItem.java  | 139 +++++
 .../s7/readwrite/S7VarRequestParameterItem.java    | 148 +++++
 .../S7VarRequestParameterItemAddress.java          | 155 +++++
 .../org/apache/plc4x/java/s7/readwrite/State.java  | 248 ++++++++
 .../apache/plc4x/java/s7/readwrite/SubItem.java    | 157 +++++
 .../plc4x/java/s7/readwrite/SyntaxIdType.java      |  66 ++
 .../plc4x/java/s7/readwrite/SzlDataTreeItem.java   | 190 ++++++
 .../org/apache/plc4x/java/s7/readwrite/SzlId.java  | 179 ++++++
 .../java/s7/readwrite/SzlModuleTypeClass.java      |  57 ++
 .../apache/plc4x/java/s7/readwrite/SzlSublist.java |  79 +++
 .../apache/plc4x/java/s7/readwrite/TPKTPacket.java | 193 ++++++
 .../apache/plc4x/java/s7/readwrite/TimeBase.java   |  56 ++
 .../plc4x/java/s7/readwrite/TransportSize.java     | 680 +++++++++++++++++++++
 .../examples/plc4j/s7event/PlcReadDataS7400H.java  |   5 +-
 .../s7/src/main/resources/protocols/s7/s7.mspec    |   2 +-
 119 files changed, 21105 insertions(+), 5 deletions(-)

diff --git a/plc4j/drivers/s7/pom.xml b/plc4j/drivers/s7/pom.xml
index 4cf409d013..44c86effb7 100644
--- a/plc4j/drivers/s7/pom.xml
+++ b/plc4j/drivers/s7/pom.xml
@@ -36,8 +36,8 @@
   </properties>
 
   <build>
-    <plugins>    
-      <plugin>
+    <plugins>   
+        <plugin> 
         <groupId>org.apache.karaf.tooling</groupId>
         <artifactId>karaf-maven-plugin</artifactId>
         <executions>         
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java
new file mode 100644
index 0000000000..31e7dab092
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.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 Alarm8MessageQueryType implements Message {
+
+  // Properties.
+  protected final short functionId;
+  protected final short numberOfObjects;
+  protected final DataTransportErrorCode returnCode;
+  protected final DataTransportSize transportSize;
+  protected final int byteCount;
+  protected final List<AlarmMessageObjectQueryType> messageObjects;
+
+  public Alarm8MessageQueryType(
+      short functionId,
+      short numberOfObjects,
+      DataTransportErrorCode returnCode,
+      DataTransportSize transportSize,
+      int byteCount,
+      List<AlarmMessageObjectQueryType> messageObjects) {
+    super();
+    this.functionId = functionId;
+    this.numberOfObjects = numberOfObjects;
+    this.returnCode = returnCode;
+    this.transportSize = transportSize;
+    this.byteCount = byteCount;
+    this.messageObjects = messageObjects;
+  }
+
+  public short getFunctionId() {
+    return functionId;
+  }
+
+  public short getNumberOfObjects() {
+    return numberOfObjects;
+  }
+
+  public DataTransportErrorCode getReturnCode() {
+    return returnCode;
+  }
+
+  public DataTransportSize getTransportSize() {
+    return transportSize;
+  }
+
+  public int getByteCount() {
+    return byteCount;
+  }
+
+  public List<AlarmMessageObjectQueryType> getMessageObjects() {
+    return messageObjects;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    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(
+        "returnCode",
+        "DataTransportErrorCode",
+        returnCode,
+        new DataWriterEnumDefault<>(
+            DataTransportErrorCode::getValue,
+            DataTransportErrorCode::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (transportSize)
+    writeSimpleEnumField(
+        "transportSize",
+        "DataTransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            DataTransportSize::getValue,
+            DataTransportSize::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (byteCount)
+    writeSimpleField("byteCount", byteCount, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (messageObjects)
+    writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
+
+    writeBuffer.popContext("Alarm8MessageQueryType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    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;
+
+    // Simple field (byteCount)
+    lengthInBits += 16;
+
+    // Array field
+    if (messageObjects != null) {
+      int i = 0;
+      for (AlarmMessageObjectQueryType element : messageObjects) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= messageObjects.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static Alarm8MessageQueryType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static Alarm8MessageQueryType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("Alarm8MessageQueryType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+
+    short numberOfObjects = readSimpleField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+
+    DataTransportErrorCode returnCode =
+        readEnumField(
+            "returnCode",
+            "DataTransportErrorCode",
+            new DataReaderEnumDefault<>(
+                DataTransportErrorCode::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    DataTransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "DataTransportSize",
+            new DataReaderEnumDefault<>(
+                DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    int byteCount = readSimpleField("byteCount", readUnsignedInt(readBuffer, 16));
+
+    List<AlarmMessageObjectQueryType> messageObjects =
+        readCountArrayField(
+            "messageObjects",
+            new DataReaderComplexDefault<>(
+                () -> AlarmMessageObjectQueryType.staticParse(readBuffer), readBuffer),
+            (byteCount) / (12));
+
+    readBuffer.closeContext("Alarm8MessageQueryType");
+    // Create the instance
+    Alarm8MessageQueryType _alarm8MessageQueryType;
+    _alarm8MessageQueryType =
+        new Alarm8MessageQueryType(
+            functionId, numberOfObjects, returnCode, transportSize, byteCount, messageObjects);
+    return _alarm8MessageQueryType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof Alarm8MessageQueryType)) {
+      return false;
+    }
+    Alarm8MessageQueryType that = (Alarm8MessageQueryType) o;
+    return (getFunctionId() == that.getFunctionId())
+        && (getNumberOfObjects() == that.getNumberOfObjects())
+        && (getReturnCode() == that.getReturnCode())
+        && (getTransportSize() == that.getTransportSize())
+        && (getByteCount() == that.getByteCount())
+        && (getMessageObjects() == that.getMessageObjects())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getFunctionId(),
+        getNumberOfObjects(),
+        getReturnCode(),
+        getTransportSize(),
+        getByteCount(),
+        getMessageObjects());
+  }
+
+  @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/AlarmMessageAckObjectPushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckObjectPushType.java
new file mode 100644
index 0000000000..342589eba6
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckObjectPushType.java
@@ -0,0 +1,253 @@
+/*
+ * 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 AlarmMessageAckObjectPushType implements Message {
+
+  // Constant values.
+  public static final Short VARIABLESPEC = 0x12;
+
+  // Properties.
+  protected final short lengthSpec;
+  protected final SyntaxIdType syntaxId;
+  protected final short numberOfValues;
+  protected final long eventId;
+  protected final State ackStateGoing;
+  protected final State ackStateComing;
+
+  public AlarmMessageAckObjectPushType(
+      short lengthSpec,
+      SyntaxIdType syntaxId,
+      short numberOfValues,
+      long eventId,
+      State ackStateGoing,
+      State ackStateComing) {
+    super();
+    this.lengthSpec = lengthSpec;
+    this.syntaxId = syntaxId;
+    this.numberOfValues = numberOfValues;
+    this.eventId = eventId;
+    this.ackStateGoing = ackStateGoing;
+    this.ackStateComing = ackStateComing;
+  }
+
+  public short getLengthSpec() {
+    return lengthSpec;
+  }
+
+  public SyntaxIdType getSyntaxId() {
+    return syntaxId;
+  }
+
+  public short getNumberOfValues() {
+    return numberOfValues;
+  }
+
+  public long getEventId() {
+    return eventId;
+  }
+
+  public State getAckStateGoing() {
+    return ackStateGoing;
+  }
+
+  public State getAckStateComing() {
+    return ackStateComing;
+  }
+
+  public short getVariableSpec() {
+    return VARIABLESPEC;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageAckObjectPushType");
+
+    // Const Field (variableSpec)
+    writeConstField("variableSpec", VARIABLESPEC, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (lengthSpec)
+    writeSimpleField("lengthSpec", lengthSpec, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (syntaxId)
+    writeSimpleEnumField(
+        "syntaxId",
+        "SyntaxIdType",
+        syntaxId,
+        new DataWriterEnumDefault<>(
+            SyntaxIdType::getValue, SyntaxIdType::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (numberOfValues)
+    writeSimpleField("numberOfValues", numberOfValues, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (eventId)
+    writeSimpleField("eventId", eventId, writeUnsignedLong(writeBuffer, 32));
+
+    // Simple Field (ackStateGoing)
+    writeSimpleField("ackStateGoing", ackStateGoing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (ackStateComing)
+    writeSimpleField("ackStateComing", ackStateComing, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("AlarmMessageAckObjectPushType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageAckObjectPushType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (variableSpec)
+    lengthInBits += 8;
+
+    // Simple field (lengthSpec)
+    lengthInBits += 8;
+
+    // Simple field (syntaxId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfValues)
+    lengthInBits += 8;
+
+    // Simple field (eventId)
+    lengthInBits += 32;
+
+    // Simple field (ackStateGoing)
+    lengthInBits += ackStateGoing.getLengthInBits();
+
+    // Simple field (ackStateComing)
+    lengthInBits += ackStateComing.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageAckObjectPushType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageAckObjectPushType staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("AlarmMessageAckObjectPushType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short variableSpec =
+        readConstField(
+            "variableSpec",
+            readUnsignedShort(readBuffer, 8),
+            AlarmMessageAckObjectPushType.VARIABLESPEC);
+
+    short lengthSpec = readSimpleField("lengthSpec", readUnsignedShort(readBuffer, 8));
+
+    SyntaxIdType syntaxId =
+        readEnumField(
+            "syntaxId",
+            "SyntaxIdType",
+            new DataReaderEnumDefault<>(
+                SyntaxIdType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    short numberOfValues = readSimpleField("numberOfValues", readUnsignedShort(readBuffer, 8));
+
+    long eventId = readSimpleField("eventId", readUnsignedLong(readBuffer, 32));
+
+    State ackStateGoing =
+        readSimpleField(
+            "ackStateGoing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    State ackStateComing =
+        readSimpleField(
+            "ackStateComing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    readBuffer.closeContext("AlarmMessageAckObjectPushType");
+    // Create the instance
+    AlarmMessageAckObjectPushType _alarmMessageAckObjectPushType;
+    _alarmMessageAckObjectPushType =
+        new AlarmMessageAckObjectPushType(
+            lengthSpec, syntaxId, numberOfValues, eventId, ackStateGoing, ackStateComing);
+    return _alarmMessageAckObjectPushType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageAckObjectPushType)) {
+      return false;
+    }
+    AlarmMessageAckObjectPushType that = (AlarmMessageAckObjectPushType) o;
+    return (getLengthSpec() == that.getLengthSpec())
+        && (getSyntaxId() == that.getSyntaxId())
+        && (getNumberOfValues() == that.getNumberOfValues())
+        && (getEventId() == that.getEventId())
+        && (getAckStateGoing() == that.getAckStateGoing())
+        && (getAckStateComing() == that.getAckStateComing())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getLengthSpec(),
+        getSyntaxId(),
+        getNumberOfValues(),
+        getEventId(),
+        getAckStateGoing(),
+        getAckStateComing());
+  }
+
+  @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/AlarmMessageAckPushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckPushType.java
new file mode 100644
index 0000000000..48491b961a
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckPushType.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 class AlarmMessageAckPushType implements Message {
+
+  // Properties.
+  protected final DateAndTime TimeStamp;
+  protected final short functionId;
+  protected final short numberOfObjects;
+  protected final List<AlarmMessageAckObjectPushType> messageObjects;
+
+  public AlarmMessageAckPushType(
+      DateAndTime TimeStamp,
+      short functionId,
+      short numberOfObjects,
+      List<AlarmMessageAckObjectPushType> messageObjects) {
+    super();
+    this.TimeStamp = TimeStamp;
+    this.functionId = functionId;
+    this.numberOfObjects = numberOfObjects;
+    this.messageObjects = messageObjects;
+  }
+
+  public DateAndTime getTimeStamp() {
+    return TimeStamp;
+  }
+
+  public short getFunctionId() {
+    return functionId;
+  }
+
+  public short getNumberOfObjects() {
+    return numberOfObjects;
+  }
+
+  public List<AlarmMessageAckObjectPushType> getMessageObjects() {
+    return messageObjects;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageAckPushType");
+
+    // Simple Field (TimeStamp)
+    writeSimpleField("TimeStamp", TimeStamp, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (functionId)
+    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (numberOfObjects)
+    writeSimpleField("numberOfObjects", numberOfObjects, writeUnsignedShort(writeBuffer, 8));
+
+    // Array Field (messageObjects)
+    writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
+
+    writeBuffer.popContext("AlarmMessageAckPushType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageAckPushType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (TimeStamp)
+    lengthInBits += TimeStamp.getLengthInBits();
+
+    // Simple field (functionId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfObjects)
+    lengthInBits += 8;
+
+    // Array field
+    if (messageObjects != null) {
+      int i = 0;
+      for (AlarmMessageAckObjectPushType element : messageObjects) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= messageObjects.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageAckPushType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageAckPushType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AlarmMessageAckPushType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    DateAndTime TimeStamp =
+        readSimpleField(
+            "TimeStamp",
+            new DataReaderComplexDefault<>(() -> DateAndTime.staticParse(readBuffer), readBuffer));
+
+    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+
+    short numberOfObjects = readSimpleField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+
+    List<AlarmMessageAckObjectPushType> messageObjects =
+        readCountArrayField(
+            "messageObjects",
+            new DataReaderComplexDefault<>(
+                () -> AlarmMessageAckObjectPushType.staticParse(readBuffer), readBuffer),
+            numberOfObjects);
+
+    readBuffer.closeContext("AlarmMessageAckPushType");
+    // Create the instance
+    AlarmMessageAckPushType _alarmMessageAckPushType;
+    _alarmMessageAckPushType =
+        new AlarmMessageAckPushType(TimeStamp, functionId, numberOfObjects, messageObjects);
+    return _alarmMessageAckPushType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageAckPushType)) {
+      return false;
+    }
+    AlarmMessageAckPushType that = (AlarmMessageAckPushType) o;
+    return (getTimeStamp() == that.getTimeStamp())
+        && (getFunctionId() == that.getFunctionId())
+        && (getNumberOfObjects() == that.getNumberOfObjects())
+        && (getMessageObjects() == that.getMessageObjects())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getTimeStamp(), getFunctionId(), getNumberOfObjects(), getMessageObjects());
+  }
+
+  @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/AlarmMessageAckResponseType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckResponseType.java
new file mode 100644
index 0000000000..e588b6ca41
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckResponseType.java
@@ -0,0 +1,164 @@
+/*
+ * 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 AlarmMessageAckResponseType implements Message {
+
+  // Properties.
+  protected final short functionId;
+  protected final short numberOfObjects;
+  protected final List<Short> messageObjects;
+
+  public AlarmMessageAckResponseType(
+      short functionId, short numberOfObjects, List<Short> messageObjects) {
+    super();
+    this.functionId = functionId;
+    this.numberOfObjects = numberOfObjects;
+    this.messageObjects = messageObjects;
+  }
+
+  public short getFunctionId() {
+    return functionId;
+  }
+
+  public short getNumberOfObjects() {
+    return numberOfObjects;
+  }
+
+  public List<Short> getMessageObjects() {
+    return messageObjects;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageAckResponseType");
+
+    // Simple Field (functionId)
+    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (numberOfObjects)
+    writeSimpleField("numberOfObjects", numberOfObjects, writeUnsignedShort(writeBuffer, 8));
+
+    // Array Field (messageObjects)
+    writeSimpleTypeArrayField("messageObjects", messageObjects, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("AlarmMessageAckResponseType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageAckResponseType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (functionId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfObjects)
+    lengthInBits += 8;
+
+    // Array field
+    if (messageObjects != null) {
+      lengthInBits += 8 * messageObjects.size();
+    }
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageAckResponseType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageAckResponseType staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("AlarmMessageAckResponseType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+
+    short numberOfObjects = readSimpleField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+
+    List<Short> messageObjects =
+        readCountArrayField("messageObjects", readUnsignedShort(readBuffer, 8), numberOfObjects);
+
+    readBuffer.closeContext("AlarmMessageAckResponseType");
+    // Create the instance
+    AlarmMessageAckResponseType _alarmMessageAckResponseType;
+    _alarmMessageAckResponseType =
+        new AlarmMessageAckResponseType(functionId, numberOfObjects, messageObjects);
+    return _alarmMessageAckResponseType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageAckResponseType)) {
+      return false;
+    }
+    AlarmMessageAckResponseType that = (AlarmMessageAckResponseType) o;
+    return (getFunctionId() == that.getFunctionId())
+        && (getNumberOfObjects() == that.getNumberOfObjects())
+        && (getMessageObjects() == that.getMessageObjects())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getFunctionId(), getNumberOfObjects(), getMessageObjects());
+  }
+
+  @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/AlarmMessageAckType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckType.java
new file mode 100644
index 0000000000..bea2571d06
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckType.java
@@ -0,0 +1,170 @@
+/*
+ * 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 AlarmMessageAckType implements Message {
+
+  // Properties.
+  protected final short functionId;
+  protected final short numberOfObjects;
+  protected final List<AlarmMessageObjectAckType> messageObjects;
+
+  public AlarmMessageAckType(
+      short functionId, short numberOfObjects, List<AlarmMessageObjectAckType> messageObjects) {
+    super();
+    this.functionId = functionId;
+    this.numberOfObjects = numberOfObjects;
+    this.messageObjects = messageObjects;
+  }
+
+  public short getFunctionId() {
+    return functionId;
+  }
+
+  public short getNumberOfObjects() {
+    return numberOfObjects;
+  }
+
+  public List<AlarmMessageObjectAckType> getMessageObjects() {
+    return messageObjects;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageAckType");
+
+    // Simple Field (functionId)
+    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (numberOfObjects)
+    writeSimpleField("numberOfObjects", numberOfObjects, writeUnsignedShort(writeBuffer, 8));
+
+    // Array Field (messageObjects)
+    writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
+
+    writeBuffer.popContext("AlarmMessageAckType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageAckType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (functionId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfObjects)
+    lengthInBits += 8;
+
+    // Array field
+    if (messageObjects != null) {
+      int i = 0;
+      for (AlarmMessageObjectAckType element : messageObjects) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= messageObjects.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageAckType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageAckType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AlarmMessageAckType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+
+    short numberOfObjects = readSimpleField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+
+    List<AlarmMessageObjectAckType> messageObjects =
+        readCountArrayField(
+            "messageObjects",
+            new DataReaderComplexDefault<>(
+                () -> AlarmMessageObjectAckType.staticParse(readBuffer), readBuffer),
+            numberOfObjects);
+
+    readBuffer.closeContext("AlarmMessageAckType");
+    // Create the instance
+    AlarmMessageAckType _alarmMessageAckType;
+    _alarmMessageAckType = new AlarmMessageAckType(functionId, numberOfObjects, messageObjects);
+    return _alarmMessageAckType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageAckType)) {
+      return false;
+    }
+    AlarmMessageAckType that = (AlarmMessageAckType) o;
+    return (getFunctionId() == that.getFunctionId())
+        && (getNumberOfObjects() == that.getNumberOfObjects())
+        && (getMessageObjects() == that.getMessageObjects())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getFunctionId(), getNumberOfObjects(), getMessageObjects());
+  }
+
+  @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/AlarmMessageObjectAckType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectAckType.java
new file mode 100644
index 0000000000..fc3ff16398
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectAckType.java
@@ -0,0 +1,246 @@
+/*
+ * 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 AlarmMessageObjectAckType implements Message {
+
+  // Constant values.
+  public static final Short VARIABLESPEC = 0x12;
+  public static final Short LENGTH = 0x08;
+
+  // Properties.
+  protected final SyntaxIdType syntaxId;
+  protected final short numberOfValues;
+  protected final long eventId;
+  protected final State ackStateGoing;
+  protected final State ackStateComing;
+
+  public AlarmMessageObjectAckType(
+      SyntaxIdType syntaxId,
+      short numberOfValues,
+      long eventId,
+      State ackStateGoing,
+      State ackStateComing) {
+    super();
+    this.syntaxId = syntaxId;
+    this.numberOfValues = numberOfValues;
+    this.eventId = eventId;
+    this.ackStateGoing = ackStateGoing;
+    this.ackStateComing = ackStateComing;
+  }
+
+  public SyntaxIdType getSyntaxId() {
+    return syntaxId;
+  }
+
+  public short getNumberOfValues() {
+    return numberOfValues;
+  }
+
+  public long getEventId() {
+    return eventId;
+  }
+
+  public State getAckStateGoing() {
+    return ackStateGoing;
+  }
+
+  public State getAckStateComing() {
+    return ackStateComing;
+  }
+
+  public short getVariableSpec() {
+    return VARIABLESPEC;
+  }
+
+  public short getLength() {
+    return LENGTH;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageObjectAckType");
+
+    // Const Field (variableSpec)
+    writeConstField("variableSpec", VARIABLESPEC, writeUnsignedShort(writeBuffer, 8));
+
+    // Const Field (length)
+    writeConstField("length", LENGTH, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (syntaxId)
+    writeSimpleEnumField(
+        "syntaxId",
+        "SyntaxIdType",
+        syntaxId,
+        new DataWriterEnumDefault<>(
+            SyntaxIdType::getValue, SyntaxIdType::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (numberOfValues)
+    writeSimpleField("numberOfValues", numberOfValues, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (eventId)
+    writeSimpleField("eventId", eventId, writeUnsignedLong(writeBuffer, 32));
+
+    // Simple Field (ackStateGoing)
+    writeSimpleField("ackStateGoing", ackStateGoing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (ackStateComing)
+    writeSimpleField("ackStateComing", ackStateComing, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("AlarmMessageObjectAckType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageObjectAckType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (variableSpec)
+    lengthInBits += 8;
+
+    // Const Field (length)
+    lengthInBits += 8;
+
+    // Simple field (syntaxId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfValues)
+    lengthInBits += 8;
+
+    // Simple field (eventId)
+    lengthInBits += 32;
+
+    // Simple field (ackStateGoing)
+    lengthInBits += ackStateGoing.getLengthInBits();
+
+    // Simple field (ackStateComing)
+    lengthInBits += ackStateComing.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageObjectAckType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageObjectAckType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AlarmMessageObjectAckType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short variableSpec =
+        readConstField(
+            "variableSpec",
+            readUnsignedShort(readBuffer, 8),
+            AlarmMessageObjectAckType.VARIABLESPEC);
+
+    short length =
+        readConstField(
+            "length", readUnsignedShort(readBuffer, 8), AlarmMessageObjectAckType.LENGTH);
+
+    SyntaxIdType syntaxId =
+        readEnumField(
+            "syntaxId",
+            "SyntaxIdType",
+            new DataReaderEnumDefault<>(
+                SyntaxIdType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    short numberOfValues = readSimpleField("numberOfValues", readUnsignedShort(readBuffer, 8));
+
+    long eventId = readSimpleField("eventId", readUnsignedLong(readBuffer, 32));
+
+    State ackStateGoing =
+        readSimpleField(
+            "ackStateGoing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    State ackStateComing =
+        readSimpleField(
+            "ackStateComing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    readBuffer.closeContext("AlarmMessageObjectAckType");
+    // Create the instance
+    AlarmMessageObjectAckType _alarmMessageObjectAckType;
+    _alarmMessageObjectAckType =
+        new AlarmMessageObjectAckType(
+            syntaxId, numberOfValues, eventId, ackStateGoing, ackStateComing);
+    return _alarmMessageObjectAckType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageObjectAckType)) {
+      return false;
+    }
+    AlarmMessageObjectAckType that = (AlarmMessageObjectAckType) o;
+    return (getSyntaxId() == that.getSyntaxId())
+        && (getNumberOfValues() == that.getNumberOfValues())
+        && (getEventId() == that.getEventId())
+        && (getAckStateGoing() == that.getAckStateGoing())
+        && (getAckStateComing() == that.getAckStateComing())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getSyntaxId(), getNumberOfValues(), getEventId(), getAckStateGoing(), getAckStateComing());
+  }
+
+  @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/AlarmMessageObjectPushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectPushType.java
new file mode 100644
index 0000000000..42777096da
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectPushType.java
@@ -0,0 +1,329 @@
+/*
+ * 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 AlarmMessageObjectPushType implements Message {
+
+  // Constant values.
+  public static final Short VARIABLESPEC = 0x12;
+
+  // Properties.
+  protected final short lengthSpec;
+  protected final SyntaxIdType syntaxId;
+  protected final short numberOfValues;
+  protected final long eventId;
+  protected final State eventState;
+  protected final State localState;
+  protected final State ackStateGoing;
+  protected final State ackStateComing;
+  protected final List<AssociatedValueType> AssociatedValues;
+
+  public AlarmMessageObjectPushType(
+      short lengthSpec,
+      SyntaxIdType syntaxId,
+      short numberOfValues,
+      long eventId,
+      State eventState,
+      State localState,
+      State ackStateGoing,
+      State ackStateComing,
+      List<AssociatedValueType> AssociatedValues) {
+    super();
+    this.lengthSpec = lengthSpec;
+    this.syntaxId = syntaxId;
+    this.numberOfValues = numberOfValues;
+    this.eventId = eventId;
+    this.eventState = eventState;
+    this.localState = localState;
+    this.ackStateGoing = ackStateGoing;
+    this.ackStateComing = ackStateComing;
+    this.AssociatedValues = AssociatedValues;
+  }
+
+  public short getLengthSpec() {
+    return lengthSpec;
+  }
+
+  public SyntaxIdType getSyntaxId() {
+    return syntaxId;
+  }
+
+  public short getNumberOfValues() {
+    return numberOfValues;
+  }
+
+  public long getEventId() {
+    return eventId;
+  }
+
+  public State getEventState() {
+    return eventState;
+  }
+
+  public State getLocalState() {
+    return localState;
+  }
+
+  public State getAckStateGoing() {
+    return ackStateGoing;
+  }
+
+  public State getAckStateComing() {
+    return ackStateComing;
+  }
+
+  public List<AssociatedValueType> getAssociatedValues() {
+    return AssociatedValues;
+  }
+
+  public short getVariableSpec() {
+    return VARIABLESPEC;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageObjectPushType");
+
+    // Const Field (variableSpec)
+    writeConstField("variableSpec", VARIABLESPEC, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (lengthSpec)
+    writeSimpleField("lengthSpec", lengthSpec, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (syntaxId)
+    writeSimpleEnumField(
+        "syntaxId",
+        "SyntaxIdType",
+        syntaxId,
+        new DataWriterEnumDefault<>(
+            SyntaxIdType::getValue, SyntaxIdType::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (numberOfValues)
+    writeSimpleField("numberOfValues", numberOfValues, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (eventId)
+    writeSimpleField("eventId", eventId, writeUnsignedLong(writeBuffer, 32));
+
+    // Simple Field (eventState)
+    writeSimpleField("eventState", eventState, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (localState)
+    writeSimpleField("localState", localState, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (ackStateGoing)
+    writeSimpleField("ackStateGoing", ackStateGoing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (ackStateComing)
+    writeSimpleField("ackStateComing", ackStateComing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Array Field (AssociatedValues)
+    writeComplexTypeArrayField("AssociatedValues", AssociatedValues, writeBuffer);
+
+    writeBuffer.popContext("AlarmMessageObjectPushType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageObjectPushType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (variableSpec)
+    lengthInBits += 8;
+
+    // Simple field (lengthSpec)
+    lengthInBits += 8;
+
+    // Simple field (syntaxId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfValues)
+    lengthInBits += 8;
+
+    // Simple field (eventId)
+    lengthInBits += 32;
+
+    // Simple field (eventState)
+    lengthInBits += eventState.getLengthInBits();
+
+    // Simple field (localState)
+    lengthInBits += localState.getLengthInBits();
+
+    // Simple field (ackStateGoing)
+    lengthInBits += ackStateGoing.getLengthInBits();
+
+    // Simple field (ackStateComing)
+    lengthInBits += ackStateComing.getLengthInBits();
+
+    // Array field
+    if (AssociatedValues != null) {
+      int i = 0;
+      for (AssociatedValueType element : AssociatedValues) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= AssociatedValues.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageObjectPushType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageObjectPushType staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("AlarmMessageObjectPushType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short variableSpec =
+        readConstField(
+            "variableSpec",
+            readUnsignedShort(readBuffer, 8),
+            AlarmMessageObjectPushType.VARIABLESPEC);
+
+    short lengthSpec = readSimpleField("lengthSpec", readUnsignedShort(readBuffer, 8));
+
+    SyntaxIdType syntaxId =
+        readEnumField(
+            "syntaxId",
+            "SyntaxIdType",
+            new DataReaderEnumDefault<>(
+                SyntaxIdType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    short numberOfValues = readSimpleField("numberOfValues", readUnsignedShort(readBuffer, 8));
+
+    long eventId = readSimpleField("eventId", readUnsignedLong(readBuffer, 32));
+
+    State eventState =
+        readSimpleField(
+            "eventState",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    State localState =
+        readSimpleField(
+            "localState",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    State ackStateGoing =
+        readSimpleField(
+            "ackStateGoing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    State ackStateComing =
+        readSimpleField(
+            "ackStateComing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    List<AssociatedValueType> AssociatedValues =
+        readCountArrayField(
+            "AssociatedValues",
+            new DataReaderComplexDefault<>(
+                () -> AssociatedValueType.staticParse(readBuffer), readBuffer),
+            numberOfValues);
+
+    readBuffer.closeContext("AlarmMessageObjectPushType");
+    // Create the instance
+    AlarmMessageObjectPushType _alarmMessageObjectPushType;
+    _alarmMessageObjectPushType =
+        new AlarmMessageObjectPushType(
+            lengthSpec,
+            syntaxId,
+            numberOfValues,
+            eventId,
+            eventState,
+            localState,
+            ackStateGoing,
+            ackStateComing,
+            AssociatedValues);
+    return _alarmMessageObjectPushType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageObjectPushType)) {
+      return false;
+    }
+    AlarmMessageObjectPushType that = (AlarmMessageObjectPushType) o;
+    return (getLengthSpec() == that.getLengthSpec())
+        && (getSyntaxId() == that.getSyntaxId())
+        && (getNumberOfValues() == that.getNumberOfValues())
+        && (getEventId() == that.getEventId())
+        && (getEventState() == that.getEventState())
+        && (getLocalState() == that.getLocalState())
+        && (getAckStateGoing() == that.getAckStateGoing())
+        && (getAckStateComing() == that.getAckStateComing())
+        && (getAssociatedValues() == that.getAssociatedValues())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getLengthSpec(),
+        getSyntaxId(),
+        getNumberOfValues(),
+        getEventId(),
+        getEventState(),
+        getLocalState(),
+        getAckStateGoing(),
+        getAckStateComing(),
+        getAssociatedValues());
+  }
+
+  @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/AlarmMessageObjectQueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java
new file mode 100644
index 0000000000..7d931070da
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java
@@ -0,0 +1,310 @@
+/*
+ * 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 AlarmMessageObjectQueryType implements Message {
+
+  // Constant values.
+  public static final Short VARIABLESPEC = 0x12;
+
+  // Properties.
+  protected final short lengthDataset;
+  protected final State eventState;
+  protected final State ackStateGoing;
+  protected final State ackStateComing;
+  protected final DateAndTime timeComing;
+  protected final AssociatedValueType valueComing;
+  protected final DateAndTime timeGoing;
+  protected final AssociatedValueType valueGoing;
+
+  public AlarmMessageObjectQueryType(
+      short lengthDataset,
+      State eventState,
+      State ackStateGoing,
+      State ackStateComing,
+      DateAndTime timeComing,
+      AssociatedValueType valueComing,
+      DateAndTime timeGoing,
+      AssociatedValueType valueGoing) {
+    super();
+    this.lengthDataset = lengthDataset;
+    this.eventState = eventState;
+    this.ackStateGoing = ackStateGoing;
+    this.ackStateComing = ackStateComing;
+    this.timeComing = timeComing;
+    this.valueComing = valueComing;
+    this.timeGoing = timeGoing;
+    this.valueGoing = valueGoing;
+  }
+
+  public short getLengthDataset() {
+    return lengthDataset;
+  }
+
+  public State getEventState() {
+    return eventState;
+  }
+
+  public State getAckStateGoing() {
+    return ackStateGoing;
+  }
+
+  public State getAckStateComing() {
+    return ackStateComing;
+  }
+
+  public DateAndTime getTimeComing() {
+    return timeComing;
+  }
+
+  public AssociatedValueType getValueComing() {
+    return valueComing;
+  }
+
+  public DateAndTime getTimeGoing() {
+    return timeGoing;
+  }
+
+  public AssociatedValueType getValueGoing() {
+    return valueGoing;
+  }
+
+  public short getVariableSpec() {
+    return VARIABLESPEC;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageObjectQueryType");
+
+    // Simple Field (lengthDataset)
+    writeSimpleField("lengthDataset", lengthDataset, writeUnsignedShort(writeBuffer, 8));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16));
+
+    // Const Field (variableSpec)
+    writeConstField("variableSpec", VARIABLESPEC, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (eventState)
+    writeSimpleField("eventState", eventState, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (ackStateGoing)
+    writeSimpleField("ackStateGoing", ackStateGoing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (ackStateComing)
+    writeSimpleField("ackStateComing", ackStateComing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (timeComing)
+    writeSimpleField("timeComing", timeComing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (valueComing)
+    writeSimpleField("valueComing", valueComing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (timeGoing)
+    writeSimpleField("timeGoing", timeGoing, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (valueGoing)
+    writeSimpleField("valueGoing", valueGoing, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("AlarmMessageObjectQueryType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageObjectQueryType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (lengthDataset)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 16;
+
+    // Const Field (variableSpec)
+    lengthInBits += 8;
+
+    // Simple field (eventState)
+    lengthInBits += eventState.getLengthInBits();
+
+    // Simple field (ackStateGoing)
+    lengthInBits += ackStateGoing.getLengthInBits();
+
+    // Simple field (ackStateComing)
+    lengthInBits += ackStateComing.getLengthInBits();
+
+    // Simple field (timeComing)
+    lengthInBits += timeComing.getLengthInBits();
+
+    // Simple field (valueComing)
+    lengthInBits += valueComing.getLengthInBits();
+
+    // Simple field (timeGoing)
+    lengthInBits += timeGoing.getLengthInBits();
+
+    // Simple field (valueGoing)
+    lengthInBits += valueGoing.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageObjectQueryType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageObjectQueryType staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("AlarmMessageObjectQueryType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short lengthDataset = readSimpleField("lengthDataset", readUnsignedShort(readBuffer, 8));
+
+    Integer reservedField0 =
+        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+
+    short variableSpec =
+        readConstField(
+            "variableSpec",
+            readUnsignedShort(readBuffer, 8),
+            AlarmMessageObjectQueryType.VARIABLESPEC);
+
+    State eventState =
+        readSimpleField(
+            "eventState",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    State ackStateGoing =
+        readSimpleField(
+            "ackStateGoing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    State ackStateComing =
+        readSimpleField(
+            "ackStateComing",
+            new DataReaderComplexDefault<>(() -> State.staticParse(readBuffer), readBuffer));
+
+    DateAndTime timeComing =
+        readSimpleField(
+            "timeComing",
+            new DataReaderComplexDefault<>(() -> DateAndTime.staticParse(readBuffer), readBuffer));
+
+    AssociatedValueType valueComing =
+        readSimpleField(
+            "valueComing",
+            new DataReaderComplexDefault<>(
+                () -> AssociatedValueType.staticParse(readBuffer), readBuffer));
+
+    DateAndTime timeGoing =
+        readSimpleField(
+            "timeGoing",
+            new DataReaderComplexDefault<>(() -> DateAndTime.staticParse(readBuffer), readBuffer));
+
+    AssociatedValueType valueGoing =
+        readSimpleField(
+            "valueGoing",
+            new DataReaderComplexDefault<>(
+                () -> AssociatedValueType.staticParse(readBuffer), readBuffer));
+
+    readBuffer.closeContext("AlarmMessageObjectQueryType");
+    // Create the instance
+    AlarmMessageObjectQueryType _alarmMessageObjectQueryType;
+    _alarmMessageObjectQueryType =
+        new AlarmMessageObjectQueryType(
+            lengthDataset,
+            eventState,
+            ackStateGoing,
+            ackStateComing,
+            timeComing,
+            valueComing,
+            timeGoing,
+            valueGoing);
+    return _alarmMessageObjectQueryType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageObjectQueryType)) {
+      return false;
+    }
+    AlarmMessageObjectQueryType that = (AlarmMessageObjectQueryType) o;
+    return (getLengthDataset() == that.getLengthDataset())
+        && (getEventState() == that.getEventState())
+        && (getAckStateGoing() == that.getAckStateGoing())
+        && (getAckStateComing() == that.getAckStateComing())
+        && (getTimeComing() == that.getTimeComing())
+        && (getValueComing() == that.getValueComing())
+        && (getTimeGoing() == that.getTimeGoing())
+        && (getValueGoing() == that.getValueGoing())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getLengthDataset(),
+        getEventState(),
+        getAckStateGoing(),
+        getAckStateComing(),
+        getTimeComing(),
+        getValueComing(),
+        getTimeGoing(),
+        getValueGoing());
+  }
+
+  @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/AlarmMessagePushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessagePushType.java
new file mode 100644
index 0000000000..a6b578a1e9
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessagePushType.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 class AlarmMessagePushType implements Message {
+
+  // Properties.
+  protected final DateAndTime TimeStamp;
+  protected final short functionId;
+  protected final short numberOfObjects;
+  protected final List<AlarmMessageObjectPushType> messageObjects;
+
+  public AlarmMessagePushType(
+      DateAndTime TimeStamp,
+      short functionId,
+      short numberOfObjects,
+      List<AlarmMessageObjectPushType> messageObjects) {
+    super();
+    this.TimeStamp = TimeStamp;
+    this.functionId = functionId;
+    this.numberOfObjects = numberOfObjects;
+    this.messageObjects = messageObjects;
+  }
+
+  public DateAndTime getTimeStamp() {
+    return TimeStamp;
+  }
+
+  public short getFunctionId() {
+    return functionId;
+  }
+
+  public short getNumberOfObjects() {
+    return numberOfObjects;
+  }
+
+  public List<AlarmMessageObjectPushType> getMessageObjects() {
+    return messageObjects;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessagePushType");
+
+    // Simple Field (TimeStamp)
+    writeSimpleField("TimeStamp", TimeStamp, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Simple Field (functionId)
+    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (numberOfObjects)
+    writeSimpleField("numberOfObjects", numberOfObjects, writeUnsignedShort(writeBuffer, 8));
+
+    // Array Field (messageObjects)
+    writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
+
+    writeBuffer.popContext("AlarmMessagePushType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessagePushType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (TimeStamp)
+    lengthInBits += TimeStamp.getLengthInBits();
+
+    // Simple field (functionId)
+    lengthInBits += 8;
+
+    // Simple field (numberOfObjects)
+    lengthInBits += 8;
+
+    // Array field
+    if (messageObjects != null) {
+      int i = 0;
+      for (AlarmMessageObjectPushType element : messageObjects) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= messageObjects.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessagePushType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessagePushType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AlarmMessagePushType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    DateAndTime TimeStamp =
+        readSimpleField(
+            "TimeStamp",
+            new DataReaderComplexDefault<>(() -> DateAndTime.staticParse(readBuffer), readBuffer));
+
+    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+
+    short numberOfObjects = readSimpleField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+
+    List<AlarmMessageObjectPushType> messageObjects =
+        readCountArrayField(
+            "messageObjects",
+            new DataReaderComplexDefault<>(
+                () -> AlarmMessageObjectPushType.staticParse(readBuffer), readBuffer),
+            numberOfObjects);
+
+    readBuffer.closeContext("AlarmMessagePushType");
+    // Create the instance
+    AlarmMessagePushType _alarmMessagePushType;
+    _alarmMessagePushType =
+        new AlarmMessagePushType(TimeStamp, functionId, numberOfObjects, messageObjects);
+    return _alarmMessagePushType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessagePushType)) {
+      return false;
+    }
+    AlarmMessagePushType that = (AlarmMessagePushType) o;
+    return (getTimeStamp() == that.getTimeStamp())
+        && (getFunctionId() == that.getFunctionId())
+        && (getNumberOfObjects() == that.getNumberOfObjects())
+        && (getMessageObjects() == that.getMessageObjects())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getTimeStamp(), getFunctionId(), getNumberOfObjects(), getMessageObjects());
+  }
+
+  @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/AlarmMessageQueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageQueryType.java
new file mode 100644
index 0000000000..53eddc50a4
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageQueryType.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 AlarmMessageQueryType implements Message {
+
+  // Constant values.
+  public static final Integer DATALENGTH = 0xFFFF;
+
+  // Properties.
+  protected final short functionId;
+  protected final short numberOfObjects;
+  protected final DataTransportErrorCode returnCode;
+  protected final DataTransportSize transportSize;
+  protected final List<AlarmMessageObjectQueryType> messageObjects;
+
+  public AlarmMessageQueryType(
+      short functionId,
+      short numberOfObjects,
+      DataTransportErrorCode returnCode,
+      DataTransportSize transportSize,
+      List<AlarmMessageObjectQueryType> messageObjects) {
+    super();
+    this.functionId = functionId;
+    this.numberOfObjects = numberOfObjects;
+    this.returnCode = returnCode;
+    this.transportSize = transportSize;
+    this.messageObjects = messageObjects;
+  }
+
+  public short getFunctionId() {
+    return functionId;
+  }
+
+  public short getNumberOfObjects() {
+    return numberOfObjects;
+  }
+
+  public DataTransportErrorCode getReturnCode() {
+    return returnCode;
+  }
+
+  public DataTransportSize getTransportSize() {
+    return transportSize;
+  }
+
+  public List<AlarmMessageObjectQueryType> getMessageObjects() {
+    return messageObjects;
+  }
+
+  public int getDataLength() {
+    return DATALENGTH;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AlarmMessageQueryType");
+
+    // Simple Field (functionId)
+    writeSimpleField("functionId", functionId, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (numberOfObjects)
+    writeSimpleField("numberOfObjects", numberOfObjects, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (returnCode)
+    writeSimpleEnumField(
+        "returnCode",
+        "DataTransportErrorCode",
+        returnCode,
+        new DataWriterEnumDefault<>(
+            DataTransportErrorCode::getValue,
+            DataTransportErrorCode::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (transportSize)
+    writeSimpleEnumField(
+        "transportSize",
+        "DataTransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            DataTransportSize::getValue,
+            DataTransportSize::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Const Field (DataLength)
+    writeConstField("DataLength", DATALENGTH, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (messageObjects)
+    writeComplexTypeArrayField("messageObjects", messageObjects, writeBuffer);
+
+    writeBuffer.popContext("AlarmMessageQueryType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AlarmMessageQueryType _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;
+
+    // Const Field (DataLength)
+    lengthInBits += 16;
+
+    // Array field
+    if (messageObjects != null) {
+      int i = 0;
+      for (AlarmMessageObjectQueryType element : messageObjects) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= messageObjects.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static AlarmMessageQueryType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AlarmMessageQueryType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AlarmMessageQueryType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
+
+    short numberOfObjects = readSimpleField("numberOfObjects", readUnsignedShort(readBuffer, 8));
+
+    DataTransportErrorCode returnCode =
+        readEnumField(
+            "returnCode",
+            "DataTransportErrorCode",
+            new DataReaderEnumDefault<>(
+                DataTransportErrorCode::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    DataTransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "DataTransportSize",
+            new DataReaderEnumDefault<>(
+                DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    int DataLength =
+        readConstField(
+            "DataLength", readUnsignedInt(readBuffer, 16), AlarmMessageQueryType.DATALENGTH);
+
+    List<AlarmMessageObjectQueryType> messageObjects =
+        readCountArrayField(
+            "messageObjects",
+            new DataReaderComplexDefault<>(
+                () -> AlarmMessageObjectQueryType.staticParse(readBuffer), readBuffer),
+            numberOfObjects);
+
+    readBuffer.closeContext("AlarmMessageQueryType");
+    // Create the instance
+    AlarmMessageQueryType _alarmMessageQueryType;
+    _alarmMessageQueryType =
+        new AlarmMessageQueryType(
+            functionId, numberOfObjects, returnCode, transportSize, messageObjects);
+    return _alarmMessageQueryType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AlarmMessageQueryType)) {
+      return false;
+    }
+    AlarmMessageQueryType that = (AlarmMessageQueryType) o;
+    return (getFunctionId() == that.getFunctionId())
+        && (getNumberOfObjects() == that.getNumberOfObjects())
+        && (getReturnCode() == that.getReturnCode())
+        && (getTransportSize() == that.getTransportSize())
+        && (getMessageObjects() == that.getMessageObjects())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getFunctionId(),
+        getNumberOfObjects(),
+        getReturnCode(),
+        getTransportSize(),
+        getMessageObjects());
+  }
+
+  @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/AlarmStateType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmStateType.java
new file mode 100644
index 0000000000..5a03889295
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmStateType.java
@@ -0,0 +1,59 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum AlarmStateType {
+  SCAN_ABORT((short) 0x00),
+  SCAN_INITIATE((short) 0x01),
+  ALARM_ABORT((short) 0x04),
+  ALARM_INITIATE((short) 0x05),
+  ALARM_S_ABORT((short) 0x08),
+  ALARM_S_INITIATE((short) 0x09);
+  private static final Map<Short, AlarmStateType> map;
+
+  static {
+    map = new HashMap<>();
+    for (AlarmStateType value : AlarmStateType.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  AlarmStateType(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static AlarmStateType enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java
new file mode 100644
index 0000000000..3693907d2a
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java
@@ -0,0 +1,56 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum AlarmType {
+  SCAN((short) 0x01),
+  ALARM_8((short) 0x02),
+  ALARM_S((short) 0x04);
+  private static final Map<Short, AlarmType> map;
+
+  static {
+    map = new HashMap<>();
+    for (AlarmType value : AlarmType.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  AlarmType(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static AlarmType enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
new file mode 100644
index 0000000000..9f7a355161
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
@@ -0,0 +1,204 @@
+/*
+ * 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 AssociatedQueryValueType implements Message {
+
+  // Properties.
+  protected final DataTransportErrorCode returnCode;
+  protected final DataTransportSize transportSize;
+  protected final int valueLength;
+  protected final List<Short> data;
+
+  public AssociatedQueryValueType(
+      DataTransportErrorCode returnCode,
+      DataTransportSize transportSize,
+      int valueLength,
+      List<Short> data) {
+    super();
+    this.returnCode = returnCode;
+    this.transportSize = transportSize;
+    this.valueLength = valueLength;
+    this.data = data;
+  }
+
+  public DataTransportErrorCode getReturnCode() {
+    return returnCode;
+  }
+
+  public DataTransportSize getTransportSize() {
+    return transportSize;
+  }
+
+  public int getValueLength() {
+    return valueLength;
+  }
+
+  public List<Short> getData() {
+    return data;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AssociatedQueryValueType");
+
+    // Simple Field (returnCode)
+    writeSimpleEnumField(
+        "returnCode",
+        "DataTransportErrorCode",
+        returnCode,
+        new DataWriterEnumDefault<>(
+            DataTransportErrorCode::getValue,
+            DataTransportErrorCode::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (transportSize)
+    writeSimpleEnumField(
+        "transportSize",
+        "DataTransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            DataTransportSize::getValue,
+            DataTransportSize::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (valueLength)
+    writeSimpleField("valueLength", valueLength, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (data)
+    writeSimpleTypeArrayField("data", data, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("AssociatedQueryValueType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AssociatedQueryValueType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (returnCode)
+    lengthInBits += 8;
+
+    // Simple field (transportSize)
+    lengthInBits += 8;
+
+    // Simple field (valueLength)
+    lengthInBits += 16;
+
+    // Array field
+    if (data != null) {
+      lengthInBits += 8 * data.size();
+    }
+
+    return lengthInBits;
+  }
+
+  public static AssociatedQueryValueType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AssociatedQueryValueType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AssociatedQueryValueType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    DataTransportErrorCode returnCode =
+        readEnumField(
+            "returnCode",
+            "DataTransportErrorCode",
+            new DataReaderEnumDefault<>(
+                DataTransportErrorCode::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    DataTransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "DataTransportSize",
+            new DataReaderEnumDefault<>(
+                DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    int valueLength = readSimpleField("valueLength", readUnsignedInt(readBuffer, 16));
+
+    List<Short> data = readCountArrayField("data", readUnsignedShort(readBuffer, 8), valueLength);
+
+    readBuffer.closeContext("AssociatedQueryValueType");
+    // Create the instance
+    AssociatedQueryValueType _associatedQueryValueType;
+    _associatedQueryValueType =
+        new AssociatedQueryValueType(returnCode, transportSize, valueLength, data);
+    return _associatedQueryValueType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AssociatedQueryValueType)) {
+      return false;
+    }
+    AssociatedQueryValueType that = (AssociatedQueryValueType) o;
+    return (getReturnCode() == that.getReturnCode())
+        && (getTransportSize() == that.getTransportSize())
+        && (getValueLength() == that.getValueLength())
+        && (getData() == that.getData())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getReturnCode(), getTransportSize(), getValueLength(), getData());
+  }
+
+  @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/AssociatedValueType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
new file mode 100644
index 0000000000..d3807cd386
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
@@ -0,0 +1,220 @@
+/*
+ * 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 AssociatedValueType implements Message {
+
+  // Properties.
+  protected final DataTransportErrorCode returnCode;
+  protected final DataTransportSize transportSize;
+  protected final int valueLength;
+  protected final List<Short> data;
+
+  public AssociatedValueType(
+      DataTransportErrorCode returnCode,
+      DataTransportSize transportSize,
+      int valueLength,
+      List<Short> data) {
+    super();
+    this.returnCode = returnCode;
+    this.transportSize = transportSize;
+    this.valueLength = valueLength;
+    this.data = data;
+  }
+
+  public DataTransportErrorCode getReturnCode() {
+    return returnCode;
+  }
+
+  public DataTransportSize getTransportSize() {
+    return transportSize;
+  }
+
+  public int getValueLength() {
+    return valueLength;
+  }
+
+  public List<Short> getData() {
+    return data;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AssociatedValueType");
+
+    // Simple Field (returnCode)
+    writeSimpleEnumField(
+        "returnCode",
+        "DataTransportErrorCode",
+        returnCode,
+        new DataWriterEnumDefault<>(
+            DataTransportErrorCode::getValue,
+            DataTransportErrorCode::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (transportSize)
+    writeSimpleEnumField(
+        "transportSize",
+        "DataTransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            DataTransportSize::getValue,
+            DataTransportSize::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Manual Field (valueLength)
+    writeManualField(
+        "valueLength",
+        () ->
+            org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.LeftShift3(
+                writeBuffer, valueLength),
+        writeBuffer);
+
+    // Array Field (data)
+    writeSimpleTypeArrayField("data", data, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("AssociatedValueType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AssociatedValueType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (returnCode)
+    lengthInBits += 8;
+
+    // Simple field (transportSize)
+    lengthInBits += 8;
+
+    // Manual Field (valueLength)
+    lengthInBits += 2;
+
+    // Array field
+    if (data != null) {
+      lengthInBits += 8 * data.size();
+    }
+
+    return lengthInBits;
+  }
+
+  public static AssociatedValueType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AssociatedValueType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AssociatedValueType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    DataTransportErrorCode returnCode =
+        readEnumField(
+            "returnCode",
+            "DataTransportErrorCode",
+            new DataReaderEnumDefault<>(
+                DataTransportErrorCode::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    DataTransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "DataTransportSize",
+            new DataReaderEnumDefault<>(
+                DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    int valueLength =
+        readManualField(
+            "valueLength",
+            readBuffer,
+            () ->
+                (int)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.RightShift3(
+                        readBuffer, transportSize)));
+
+    List<Short> data =
+        readCountArrayField(
+            "data",
+            readUnsignedShort(readBuffer, 8),
+            org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.EventItemLength(
+                readBuffer, valueLength));
+
+    readBuffer.closeContext("AssociatedValueType");
+    // Create the instance
+    AssociatedValueType _associatedValueType;
+    _associatedValueType = new AssociatedValueType(returnCode, transportSize, valueLength, data);
+    return _associatedValueType;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AssociatedValueType)) {
+      return false;
+    }
+    AssociatedValueType that = (AssociatedValueType) o;
+    return (getReturnCode() == that.getReturnCode())
+        && (getTransportSize() == that.getTransportSize())
+        && (getValueLength() == that.getValueLength())
+        && (getData() == that.getData())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getReturnCode(), getTransportSize(), getValueLength(), getData());
+  }
+
+  @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/COTPPacket.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacket.java
new file mode 100644
index 0000000000..6d4f3cd49b
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacket.java
@@ -0,0 +1,238 @@
+/*
+ * 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 COTPPacket implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getTpduCode();
+
+  // Properties.
+  protected final List<COTPParameter> parameters;
+  protected final S7Message payload;
+
+  public COTPPacket(List<COTPParameter> parameters, S7Message payload) {
+    super();
+    this.parameters = parameters;
+    this.payload = payload;
+  }
+
+  public List<COTPParameter> getParameters() {
+    return parameters;
+  }
+
+  public S7Message getPayload() {
+    return payload;
+  }
+
+  protected abstract void serializeCOTPPacketChild(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("COTPPacket");
+
+    // Implicit Field (headerLength) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    short headerLength =
+        (short)
+            ((getLengthInBytes())
+                - ((((((((getPayload()) != (null))) ? getPayload().getLengthInBytes() : 0)))
+                    + (1))));
+    writeImplicitField("headerLength", headerLength, writeUnsignedShort(writeBuffer, 8));
+
+    // Discriminator Field (tpduCode) (Used as input to a switch field)
+    writeDiscriminatorField("tpduCode", getTpduCode(), writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeCOTPPacketChild(writeBuffer);
+
+    // Array Field (parameters)
+    writeComplexTypeArrayField("parameters", parameters, writeBuffer);
+
+    // Optional Field (payload) (Can be skipped, if the value is null)
+    writeOptionalField("payload", payload, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("COTPPacket");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    COTPPacket _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Implicit Field (headerLength)
+    lengthInBits += 8;
+
+    // Discriminator Field (tpduCode)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    // Array field
+    if (parameters != null) {
+      for (Message element : parameters) {
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Optional Field (payload)
+    if (payload != null) {
+      lengthInBits += payload.getLengthInBits();
+    }
+
+    return lengthInBits;
+  }
+
+  public static COTPPacket staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    if ((args == null) || (args.length != 1)) {
+      throw new PlcRuntimeException(
+          "Wrong number of arguments, expected 1, but got " + args.length);
+    }
+    Integer cotpLen;
+    if (args[0] instanceof Integer) {
+      cotpLen = (Integer) args[0];
+    } else if (args[0] instanceof String) {
+      cotpLen = Integer.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type Integer or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, cotpLen);
+  }
+
+  public static COTPPacket staticParse(ReadBuffer readBuffer, Integer cotpLen)
+      throws ParseException {
+    readBuffer.pullContext("COTPPacket");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short headerLength = readImplicitField("headerLength", readUnsignedShort(readBuffer, 8));
+
+    short tpduCode = readDiscriminatorField("tpduCode", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    COTPPacketBuilder builder = null;
+    if (EvaluationHelper.equals(tpduCode, (short) 0xF0)) {
+      builder = COTPPacketData.staticParseCOTPPacketBuilder(readBuffer, cotpLen);
+    } else if (EvaluationHelper.equals(tpduCode, (short) 0xE0)) {
+      builder = COTPPacketConnectionRequest.staticParseCOTPPacketBuilder(readBuffer, cotpLen);
+    } else if (EvaluationHelper.equals(tpduCode, (short) 0xD0)) {
+      builder = COTPPacketConnectionResponse.staticParseCOTPPacketBuilder(readBuffer, cotpLen);
+    } else if (EvaluationHelper.equals(tpduCode, (short) 0x80)) {
+      builder = COTPPacketDisconnectRequest.staticParseCOTPPacketBuilder(readBuffer, cotpLen);
+    } else if (EvaluationHelper.equals(tpduCode, (short) 0xC0)) {
+      builder = COTPPacketDisconnectResponse.staticParseCOTPPacketBuilder(readBuffer, cotpLen);
+    } else if (EvaluationHelper.equals(tpduCode, (short) 0x70)) {
+      builder = COTPPacketTpduError.staticParseCOTPPacketBuilder(readBuffer, cotpLen);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "tpduCode="
+              + tpduCode
+              + "]");
+    }
+
+    List<COTPParameter> parameters =
+        readLengthArrayField(
+            "parameters",
+            new DataReaderComplexDefault<>(
+                () ->
+                    COTPParameter.staticParse(
+                        readBuffer,
+                        (short) ((((headerLength) + (1))) - ((positionAware.getPos() - startPos)))),
+                readBuffer),
+            (((headerLength) + (1))) - ((positionAware.getPos() - startPos)));
+
+    S7Message payload =
+        readOptionalField(
+            "payload",
+            new DataReaderComplexDefault<>(() -> S7Message.staticParse(readBuffer), readBuffer),
+            ((positionAware.getPos() - startPos)) < (cotpLen));
+
+    readBuffer.closeContext("COTPPacket");
+    // Create the instance
+    COTPPacket _cOTPPacket = builder.build(parameters, payload);
+    return _cOTPPacket;
+  }
+
+  public interface COTPPacketBuilder {
+    COTPPacket build(List<COTPParameter> parameters, S7Message payload);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPPacket)) {
+      return false;
+    }
+    COTPPacket that = (COTPPacket) o;
+    return (getParameters() == that.getParameters()) && (getPayload() == that.getPayload()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getParameters(), getPayload());
+  }
+
+  @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/COTPPacketConnectionRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java
new file mode 100644
index 0000000000..f5c7bb1050
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java
@@ -0,0 +1,200 @@
+/*
+ * 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 COTPPacketConnectionRequest extends COTPPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Short getTpduCode() {
+    return (short) 0xE0;
+  }
+
+  // Properties.
+  protected final int destinationReference;
+  protected final int sourceReference;
+  protected final COTPProtocolClass protocolClass;
+
+  public COTPPacketConnectionRequest(
+      List<COTPParameter> parameters,
+      S7Message payload,
+      int destinationReference,
+      int sourceReference,
+      COTPProtocolClass protocolClass) {
+    super(parameters, payload);
+    this.destinationReference = destinationReference;
+    this.sourceReference = sourceReference;
+    this.protocolClass = protocolClass;
+  }
+
+  public int getDestinationReference() {
+    return destinationReference;
+  }
+
+  public int getSourceReference() {
+    return sourceReference;
+  }
+
+  public COTPProtocolClass getProtocolClass() {
+    return protocolClass;
+  }
+
+  @Override
+  protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPPacketConnectionRequest");
+
+    // Simple Field (destinationReference)
+    writeSimpleField(
+        "destinationReference", destinationReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (sourceReference)
+    writeSimpleField("sourceReference", sourceReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (protocolClass)
+    writeSimpleEnumField(
+        "protocolClass",
+        "COTPProtocolClass",
+        protocolClass,
+        new DataWriterEnumDefault<>(
+            COTPProtocolClass::getValue,
+            COTPProtocolClass::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    writeBuffer.popContext("COTPPacketConnectionRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPPacketConnectionRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (destinationReference)
+    lengthInBits += 16;
+
+    // Simple field (sourceReference)
+    lengthInBits += 16;
+
+    // Simple field (protocolClass)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static COTPPacketBuilder staticParseCOTPPacketBuilder(
+      ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
+    readBuffer.pullContext("COTPPacketConnectionRequest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int destinationReference =
+        readSimpleField("destinationReference", readUnsignedInt(readBuffer, 16));
+
+    int sourceReference = readSimpleField("sourceReference", readUnsignedInt(readBuffer, 16));
+
+    COTPProtocolClass protocolClass =
+        readEnumField(
+            "protocolClass",
+            "COTPProtocolClass",
+            new DataReaderEnumDefault<>(
+                COTPProtocolClass::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    readBuffer.closeContext("COTPPacketConnectionRequest");
+    // Create the instance
+    return new COTPPacketConnectionRequestBuilderImpl(
+        destinationReference, sourceReference, protocolClass);
+  }
+
+  public static class COTPPacketConnectionRequestBuilderImpl
+      implements COTPPacket.COTPPacketBuilder {
+    private final int destinationReference;
+    private final int sourceReference;
+    private final COTPProtocolClass protocolClass;
+
+    public COTPPacketConnectionRequestBuilderImpl(
+        int destinationReference, int sourceReference, COTPProtocolClass protocolClass) {
+      this.destinationReference = destinationReference;
+      this.sourceReference = sourceReference;
+      this.protocolClass = protocolClass;
+    }
+
+    public COTPPacketConnectionRequest build(List<COTPParameter> parameters, S7Message payload) {
+      COTPPacketConnectionRequest cOTPPacketConnectionRequest =
+          new COTPPacketConnectionRequest(
+              parameters, payload, destinationReference, sourceReference, protocolClass);
+      return cOTPPacketConnectionRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPPacketConnectionRequest)) {
+      return false;
+    }
+    COTPPacketConnectionRequest that = (COTPPacketConnectionRequest) o;
+    return (getDestinationReference() == that.getDestinationReference())
+        && (getSourceReference() == that.getSourceReference())
+        && (getProtocolClass() == that.getProtocolClass())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(), getDestinationReference(), getSourceReference(), getProtocolClass());
+  }
+
+  @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/COTPPacketConnectionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java
new file mode 100644
index 0000000000..1d64fa5fa2
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java
@@ -0,0 +1,200 @@
+/*
+ * 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 COTPPacketConnectionResponse extends COTPPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Short getTpduCode() {
+    return (short) 0xD0;
+  }
+
+  // Properties.
+  protected final int destinationReference;
+  protected final int sourceReference;
+  protected final COTPProtocolClass protocolClass;
+
+  public COTPPacketConnectionResponse(
+      List<COTPParameter> parameters,
+      S7Message payload,
+      int destinationReference,
+      int sourceReference,
+      COTPProtocolClass protocolClass) {
+    super(parameters, payload);
+    this.destinationReference = destinationReference;
+    this.sourceReference = sourceReference;
+    this.protocolClass = protocolClass;
+  }
+
+  public int getDestinationReference() {
+    return destinationReference;
+  }
+
+  public int getSourceReference() {
+    return sourceReference;
+  }
+
+  public COTPProtocolClass getProtocolClass() {
+    return protocolClass;
+  }
+
+  @Override
+  protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPPacketConnectionResponse");
+
+    // Simple Field (destinationReference)
+    writeSimpleField(
+        "destinationReference", destinationReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (sourceReference)
+    writeSimpleField("sourceReference", sourceReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (protocolClass)
+    writeSimpleEnumField(
+        "protocolClass",
+        "COTPProtocolClass",
+        protocolClass,
+        new DataWriterEnumDefault<>(
+            COTPProtocolClass::getValue,
+            COTPProtocolClass::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    writeBuffer.popContext("COTPPacketConnectionResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPPacketConnectionResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (destinationReference)
+    lengthInBits += 16;
+
+    // Simple field (sourceReference)
+    lengthInBits += 16;
+
+    // Simple field (protocolClass)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static COTPPacketBuilder staticParseCOTPPacketBuilder(
+      ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
+    readBuffer.pullContext("COTPPacketConnectionResponse");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int destinationReference =
+        readSimpleField("destinationReference", readUnsignedInt(readBuffer, 16));
+
+    int sourceReference = readSimpleField("sourceReference", readUnsignedInt(readBuffer, 16));
+
+    COTPProtocolClass protocolClass =
+        readEnumField(
+            "protocolClass",
+            "COTPProtocolClass",
+            new DataReaderEnumDefault<>(
+                COTPProtocolClass::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    readBuffer.closeContext("COTPPacketConnectionResponse");
+    // Create the instance
+    return new COTPPacketConnectionResponseBuilderImpl(
+        destinationReference, sourceReference, protocolClass);
+  }
+
+  public static class COTPPacketConnectionResponseBuilderImpl
+      implements COTPPacket.COTPPacketBuilder {
+    private final int destinationReference;
+    private final int sourceReference;
+    private final COTPProtocolClass protocolClass;
+
+    public COTPPacketConnectionResponseBuilderImpl(
+        int destinationReference, int sourceReference, COTPProtocolClass protocolClass) {
+      this.destinationReference = destinationReference;
+      this.sourceReference = sourceReference;
+      this.protocolClass = protocolClass;
+    }
+
+    public COTPPacketConnectionResponse build(List<COTPParameter> parameters, S7Message payload) {
+      COTPPacketConnectionResponse cOTPPacketConnectionResponse =
+          new COTPPacketConnectionResponse(
+              parameters, payload, destinationReference, sourceReference, protocolClass);
+      return cOTPPacketConnectionResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPPacketConnectionResponse)) {
+      return false;
+    }
+    COTPPacketConnectionResponse that = (COTPPacketConnectionResponse) o;
+    return (getDestinationReference() == that.getDestinationReference())
+        && (getSourceReference() == that.getSourceReference())
+        && (getProtocolClass() == that.getProtocolClass())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(), getDestinationReference(), getSourceReference(), getProtocolClass());
+  }
+
+  @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/COTPPacketData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java
new file mode 100644
index 0000000000..233483c1a7
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java
@@ -0,0 +1,159 @@
+/*
+ * 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 COTPPacketData extends COTPPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Short getTpduCode() {
+    return (short) 0xF0;
+  }
+
+  // Properties.
+  protected final boolean eot;
+  protected final byte tpduRef;
+
+  public COTPPacketData(
+      List<COTPParameter> parameters, S7Message payload, boolean eot, byte tpduRef) {
+    super(parameters, payload);
+    this.eot = eot;
+    this.tpduRef = tpduRef;
+  }
+
+  public boolean getEot() {
+    return eot;
+  }
+
+  public byte getTpduRef() {
+    return tpduRef;
+  }
+
+  @Override
+  protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPPacketData");
+
+    // Simple Field (eot)
+    writeSimpleField("eot", eot, writeBoolean(writeBuffer));
+
+    // Simple Field (tpduRef)
+    writeSimpleField("tpduRef", tpduRef, writeUnsignedByte(writeBuffer, 7));
+
+    writeBuffer.popContext("COTPPacketData");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPPacketData _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (eot)
+    lengthInBits += 1;
+
+    // Simple field (tpduRef)
+    lengthInBits += 7;
+
+    return lengthInBits;
+  }
+
+  public static COTPPacketBuilder staticParseCOTPPacketBuilder(
+      ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
+    readBuffer.pullContext("COTPPacketData");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    boolean eot = readSimpleField("eot", readBoolean(readBuffer));
+
+    byte tpduRef = readSimpleField("tpduRef", readUnsignedByte(readBuffer, 7));
+
+    readBuffer.closeContext("COTPPacketData");
+    // Create the instance
+    return new COTPPacketDataBuilderImpl(eot, tpduRef);
+  }
+
+  public static class COTPPacketDataBuilderImpl implements COTPPacket.COTPPacketBuilder {
+    private final boolean eot;
+    private final byte tpduRef;
+
+    public COTPPacketDataBuilderImpl(boolean eot, byte tpduRef) {
+      this.eot = eot;
+      this.tpduRef = tpduRef;
+    }
+
+    public COTPPacketData build(List<COTPParameter> parameters, S7Message payload) {
+      COTPPacketData cOTPPacketData = new COTPPacketData(parameters, payload, eot, tpduRef);
+      return cOTPPacketData;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPPacketData)) {
+      return false;
+    }
+    COTPPacketData that = (COTPPacketData) o;
+    return (getEot() == that.getEot())
+        && (getTpduRef() == that.getTpduRef())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getEot(), getTpduRef());
+  }
+
+  @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/COTPPacketDisconnectRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java
new file mode 100644
index 0000000000..8c1ef73f6f
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java
@@ -0,0 +1,200 @@
+/*
+ * 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 COTPPacketDisconnectRequest extends COTPPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Short getTpduCode() {
+    return (short) 0x80;
+  }
+
+  // Properties.
+  protected final int destinationReference;
+  protected final int sourceReference;
+  protected final COTPProtocolClass protocolClass;
+
+  public COTPPacketDisconnectRequest(
+      List<COTPParameter> parameters,
+      S7Message payload,
+      int destinationReference,
+      int sourceReference,
+      COTPProtocolClass protocolClass) {
+    super(parameters, payload);
+    this.destinationReference = destinationReference;
+    this.sourceReference = sourceReference;
+    this.protocolClass = protocolClass;
+  }
+
+  public int getDestinationReference() {
+    return destinationReference;
+  }
+
+  public int getSourceReference() {
+    return sourceReference;
+  }
+
+  public COTPProtocolClass getProtocolClass() {
+    return protocolClass;
+  }
+
+  @Override
+  protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPPacketDisconnectRequest");
+
+    // Simple Field (destinationReference)
+    writeSimpleField(
+        "destinationReference", destinationReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (sourceReference)
+    writeSimpleField("sourceReference", sourceReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (protocolClass)
+    writeSimpleEnumField(
+        "protocolClass",
+        "COTPProtocolClass",
+        protocolClass,
+        new DataWriterEnumDefault<>(
+            COTPProtocolClass::getValue,
+            COTPProtocolClass::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    writeBuffer.popContext("COTPPacketDisconnectRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPPacketDisconnectRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (destinationReference)
+    lengthInBits += 16;
+
+    // Simple field (sourceReference)
+    lengthInBits += 16;
+
+    // Simple field (protocolClass)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static COTPPacketBuilder staticParseCOTPPacketBuilder(
+      ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
+    readBuffer.pullContext("COTPPacketDisconnectRequest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int destinationReference =
+        readSimpleField("destinationReference", readUnsignedInt(readBuffer, 16));
+
+    int sourceReference = readSimpleField("sourceReference", readUnsignedInt(readBuffer, 16));
+
+    COTPProtocolClass protocolClass =
+        readEnumField(
+            "protocolClass",
+            "COTPProtocolClass",
+            new DataReaderEnumDefault<>(
+                COTPProtocolClass::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    readBuffer.closeContext("COTPPacketDisconnectRequest");
+    // Create the instance
+    return new COTPPacketDisconnectRequestBuilderImpl(
+        destinationReference, sourceReference, protocolClass);
+  }
+
+  public static class COTPPacketDisconnectRequestBuilderImpl
+      implements COTPPacket.COTPPacketBuilder {
+    private final int destinationReference;
+    private final int sourceReference;
+    private final COTPProtocolClass protocolClass;
+
+    public COTPPacketDisconnectRequestBuilderImpl(
+        int destinationReference, int sourceReference, COTPProtocolClass protocolClass) {
+      this.destinationReference = destinationReference;
+      this.sourceReference = sourceReference;
+      this.protocolClass = protocolClass;
+    }
+
+    public COTPPacketDisconnectRequest build(List<COTPParameter> parameters, S7Message payload) {
+      COTPPacketDisconnectRequest cOTPPacketDisconnectRequest =
+          new COTPPacketDisconnectRequest(
+              parameters, payload, destinationReference, sourceReference, protocolClass);
+      return cOTPPacketDisconnectRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPPacketDisconnectRequest)) {
+      return false;
+    }
+    COTPPacketDisconnectRequest that = (COTPPacketDisconnectRequest) o;
+    return (getDestinationReference() == that.getDestinationReference())
+        && (getSourceReference() == that.getSourceReference())
+        && (getProtocolClass() == that.getProtocolClass())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(), getDestinationReference(), getSourceReference(), getProtocolClass());
+  }
+
+  @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/COTPPacketDisconnectResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java
new file mode 100644
index 0000000000..90bae29594
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java
@@ -0,0 +1,167 @@
+/*
+ * 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 COTPPacketDisconnectResponse extends COTPPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Short getTpduCode() {
+    return (short) 0xC0;
+  }
+
+  // Properties.
+  protected final int destinationReference;
+  protected final int sourceReference;
+
+  public COTPPacketDisconnectResponse(
+      List<COTPParameter> parameters,
+      S7Message payload,
+      int destinationReference,
+      int sourceReference) {
+    super(parameters, payload);
+    this.destinationReference = destinationReference;
+    this.sourceReference = sourceReference;
+  }
+
+  public int getDestinationReference() {
+    return destinationReference;
+  }
+
+  public int getSourceReference() {
+    return sourceReference;
+  }
+
+  @Override
+  protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPPacketDisconnectResponse");
+
+    // Simple Field (destinationReference)
+    writeSimpleField(
+        "destinationReference", destinationReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (sourceReference)
+    writeSimpleField("sourceReference", sourceReference, writeUnsignedInt(writeBuffer, 16));
+
+    writeBuffer.popContext("COTPPacketDisconnectResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPPacketDisconnectResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (destinationReference)
+    lengthInBits += 16;
+
+    // Simple field (sourceReference)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static COTPPacketBuilder staticParseCOTPPacketBuilder(
+      ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
+    readBuffer.pullContext("COTPPacketDisconnectResponse");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int destinationReference =
+        readSimpleField("destinationReference", readUnsignedInt(readBuffer, 16));
+
+    int sourceReference = readSimpleField("sourceReference", readUnsignedInt(readBuffer, 16));
+
+    readBuffer.closeContext("COTPPacketDisconnectResponse");
+    // Create the instance
+    return new COTPPacketDisconnectResponseBuilderImpl(destinationReference, sourceReference);
+  }
+
+  public static class COTPPacketDisconnectResponseBuilderImpl
+      implements COTPPacket.COTPPacketBuilder {
+    private final int destinationReference;
+    private final int sourceReference;
+
+    public COTPPacketDisconnectResponseBuilderImpl(int destinationReference, int sourceReference) {
+      this.destinationReference = destinationReference;
+      this.sourceReference = sourceReference;
+    }
+
+    public COTPPacketDisconnectResponse build(List<COTPParameter> parameters, S7Message payload) {
+      COTPPacketDisconnectResponse cOTPPacketDisconnectResponse =
+          new COTPPacketDisconnectResponse(
+              parameters, payload, destinationReference, sourceReference);
+      return cOTPPacketDisconnectResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPPacketDisconnectResponse)) {
+      return false;
+    }
+    COTPPacketDisconnectResponse that = (COTPPacketDisconnectResponse) o;
+    return (getDestinationReference() == that.getDestinationReference())
+        && (getSourceReference() == that.getSourceReference())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getDestinationReference(), getSourceReference());
+  }
+
+  @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/COTPPacketTpduError.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java
new file mode 100644
index 0000000000..bb6c4ed3aa
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java
@@ -0,0 +1,165 @@
+/*
+ * 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 COTPPacketTpduError extends COTPPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Short getTpduCode() {
+    return (short) 0x70;
+  }
+
+  // Properties.
+  protected final int destinationReference;
+  protected final short rejectCause;
+
+  public COTPPacketTpduError(
+      List<COTPParameter> parameters,
+      S7Message payload,
+      int destinationReference,
+      short rejectCause) {
+    super(parameters, payload);
+    this.destinationReference = destinationReference;
+    this.rejectCause = rejectCause;
+  }
+
+  public int getDestinationReference() {
+    return destinationReference;
+  }
+
+  public short getRejectCause() {
+    return rejectCause;
+  }
+
+  @Override
+  protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPPacketTpduError");
+
+    // Simple Field (destinationReference)
+    writeSimpleField(
+        "destinationReference", destinationReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (rejectCause)
+    writeSimpleField("rejectCause", rejectCause, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("COTPPacketTpduError");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPPacketTpduError _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (destinationReference)
+    lengthInBits += 16;
+
+    // Simple field (rejectCause)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static COTPPacketBuilder staticParseCOTPPacketBuilder(
+      ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
+    readBuffer.pullContext("COTPPacketTpduError");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int destinationReference =
+        readSimpleField("destinationReference", readUnsignedInt(readBuffer, 16));
+
+    short rejectCause = readSimpleField("rejectCause", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("COTPPacketTpduError");
+    // Create the instance
+    return new COTPPacketTpduErrorBuilderImpl(destinationReference, rejectCause);
+  }
+
+  public static class COTPPacketTpduErrorBuilderImpl implements COTPPacket.COTPPacketBuilder {
+    private final int destinationReference;
+    private final short rejectCause;
+
+    public COTPPacketTpduErrorBuilderImpl(int destinationReference, short rejectCause) {
+      this.destinationReference = destinationReference;
+      this.rejectCause = rejectCause;
+    }
+
+    public COTPPacketTpduError build(List<COTPParameter> parameters, S7Message payload) {
+      COTPPacketTpduError cOTPPacketTpduError =
+          new COTPPacketTpduError(parameters, payload, destinationReference, rejectCause);
+      return cOTPPacketTpduError;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPPacketTpduError)) {
+      return false;
+    }
+    COTPPacketTpduError that = (COTPPacketTpduError) o;
+    return (getDestinationReference() == that.getDestinationReference())
+        && (getRejectCause() == that.getRejectCause())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getDestinationReference(), getRejectCause());
+  }
+
+  @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/COTPParameter.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java
new file mode 100644
index 0000000000..d056c5f92f
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java
@@ -0,0 +1,182 @@
+/*
+ * 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 COTPParameter implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getParameterType();
+
+  public COTPParameter() {
+    super();
+  }
+
+  protected abstract void serializeCOTPParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPParameter");
+
+    // Discriminator Field (parameterType) (Used as input to a switch field)
+    writeDiscriminatorField(
+        "parameterType", getParameterType(), writeUnsignedShort(writeBuffer, 8));
+
+    // Implicit Field (parameterLength) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    short parameterLength = (short) ((getLengthInBytes()) - (2));
+    writeImplicitField("parameterLength", parameterLength, writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeCOTPParameterChild(writeBuffer);
+
+    writeBuffer.popContext("COTPParameter");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    COTPParameter _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (parameterType)
+    lengthInBits += 8;
+
+    // Implicit Field (parameterLength)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static COTPParameter staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    if ((args == null) || (args.length != 1)) {
+      throw new PlcRuntimeException(
+          "Wrong number of arguments, expected 1, but got " + args.length);
+    }
+    Short rest;
+    if (args[0] instanceof Short) {
+      rest = (Short) args[0];
+    } else if (args[0] instanceof String) {
+      rest = Short.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type Short or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, rest);
+  }
+
+  public static COTPParameter staticParse(ReadBuffer readBuffer, Short rest) throws ParseException {
+    readBuffer.pullContext("COTPParameter");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short parameterType = readDiscriminatorField("parameterType", readUnsignedShort(readBuffer, 8));
+
+    short parameterLength = readImplicitField("parameterLength", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    COTPParameterBuilder builder = null;
+    if (EvaluationHelper.equals(parameterType, (short) 0xC0)) {
+      builder = COTPParameterTpduSize.staticParseCOTPParameterBuilder(readBuffer, rest);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0xC1)) {
+      builder = COTPParameterCallingTsap.staticParseCOTPParameterBuilder(readBuffer, rest);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0xC2)) {
+      builder = COTPParameterCalledTsap.staticParseCOTPParameterBuilder(readBuffer, rest);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0xC3)) {
+      builder = COTPParameterChecksum.staticParseCOTPParameterBuilder(readBuffer, rest);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0xE0)) {
+      builder =
+          COTPParameterDisconnectAdditionalInformation.staticParseCOTPParameterBuilder(
+              readBuffer, rest);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "parameterType="
+              + parameterType
+              + "]");
+    }
+
+    readBuffer.closeContext("COTPParameter");
+    // Create the instance
+    COTPParameter _cOTPParameter = builder.build();
+    return _cOTPParameter;
+  }
+
+  public interface COTPParameterBuilder {
+    COTPParameter build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPParameter)) {
+      return false;
+    }
+    COTPParameter that = (COTPParameter) o;
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash();
+  }
+
+  @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/COTPParameterCalledTsap.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java
new file mode 100644
index 0000000000..154495f680
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java
@@ -0,0 +1,141 @@
+/*
+ * 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 COTPParameterCalledTsap extends COTPParameter implements Message {
+
+  // Accessors for discriminator values.
+  public Short getParameterType() {
+    return (short) 0xC2;
+  }
+
+  // Properties.
+  protected final int tsapId;
+
+  public COTPParameterCalledTsap(int tsapId) {
+    super();
+    this.tsapId = tsapId;
+  }
+
+  public int getTsapId() {
+    return tsapId;
+  }
+
+  @Override
+  protected void serializeCOTPParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPParameterCalledTsap");
+
+    // Simple Field (tsapId)
+    writeSimpleField("tsapId", tsapId, writeUnsignedInt(writeBuffer, 16));
+
+    writeBuffer.popContext("COTPParameterCalledTsap");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPParameterCalledTsap _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (tsapId)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static COTPParameterBuilder staticParseCOTPParameterBuilder(
+      ReadBuffer readBuffer, Short rest) throws ParseException {
+    readBuffer.pullContext("COTPParameterCalledTsap");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int tsapId = readSimpleField("tsapId", readUnsignedInt(readBuffer, 16));
+
+    readBuffer.closeContext("COTPParameterCalledTsap");
+    // Create the instance
+    return new COTPParameterCalledTsapBuilderImpl(tsapId);
+  }
+
+  public static class COTPParameterCalledTsapBuilderImpl
+      implements COTPParameter.COTPParameterBuilder {
+    private final int tsapId;
+
+    public COTPParameterCalledTsapBuilderImpl(int tsapId) {
+      this.tsapId = tsapId;
+    }
+
+    public COTPParameterCalledTsap build() {
+      COTPParameterCalledTsap cOTPParameterCalledTsap = new COTPParameterCalledTsap(tsapId);
+      return cOTPParameterCalledTsap;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPParameterCalledTsap)) {
+      return false;
+    }
+    COTPParameterCalledTsap that = (COTPParameterCalledTsap) o;
+    return (getTsapId() == that.getTsapId()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getTsapId());
+  }
+
+  @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/COTPParameterCallingTsap.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java
new file mode 100644
index 0000000000..b61845ae97
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java
@@ -0,0 +1,141 @@
+/*
+ * 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 COTPParameterCallingTsap extends COTPParameter implements Message {
+
+  // Accessors for discriminator values.
+  public Short getParameterType() {
+    return (short) 0xC1;
+  }
+
+  // Properties.
+  protected final int tsapId;
+
+  public COTPParameterCallingTsap(int tsapId) {
+    super();
+    this.tsapId = tsapId;
+  }
+
+  public int getTsapId() {
+    return tsapId;
+  }
+
+  @Override
+  protected void serializeCOTPParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPParameterCallingTsap");
+
+    // Simple Field (tsapId)
+    writeSimpleField("tsapId", tsapId, writeUnsignedInt(writeBuffer, 16));
+
+    writeBuffer.popContext("COTPParameterCallingTsap");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPParameterCallingTsap _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (tsapId)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static COTPParameterBuilder staticParseCOTPParameterBuilder(
+      ReadBuffer readBuffer, Short rest) throws ParseException {
+    readBuffer.pullContext("COTPParameterCallingTsap");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int tsapId = readSimpleField("tsapId", readUnsignedInt(readBuffer, 16));
+
+    readBuffer.closeContext("COTPParameterCallingTsap");
+    // Create the instance
+    return new COTPParameterCallingTsapBuilderImpl(tsapId);
+  }
+
+  public static class COTPParameterCallingTsapBuilderImpl
+      implements COTPParameter.COTPParameterBuilder {
+    private final int tsapId;
+
+    public COTPParameterCallingTsapBuilderImpl(int tsapId) {
+      this.tsapId = tsapId;
+    }
+
+    public COTPParameterCallingTsap build() {
+      COTPParameterCallingTsap cOTPParameterCallingTsap = new COTPParameterCallingTsap(tsapId);
+      return cOTPParameterCallingTsap;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPParameterCallingTsap)) {
+      return false;
+    }
+    COTPParameterCallingTsap that = (COTPParameterCallingTsap) o;
+    return (getTsapId() == that.getTsapId()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getTsapId());
+  }
+
+  @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/COTPParameterChecksum.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java
new file mode 100644
index 0000000000..bfa89f0ff1
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java
@@ -0,0 +1,141 @@
+/*
+ * 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 COTPParameterChecksum extends COTPParameter implements Message {
+
+  // Accessors for discriminator values.
+  public Short getParameterType() {
+    return (short) 0xC3;
+  }
+
+  // Properties.
+  protected final short crc;
+
+  public COTPParameterChecksum(short crc) {
+    super();
+    this.crc = crc;
+  }
+
+  public short getCrc() {
+    return crc;
+  }
+
+  @Override
+  protected void serializeCOTPParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPParameterChecksum");
+
+    // Simple Field (crc)
+    writeSimpleField("crc", crc, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("COTPParameterChecksum");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPParameterChecksum _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (crc)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static COTPParameterBuilder staticParseCOTPParameterBuilder(
+      ReadBuffer readBuffer, Short rest) throws ParseException {
+    readBuffer.pullContext("COTPParameterChecksum");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short crc = readSimpleField("crc", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("COTPParameterChecksum");
+    // Create the instance
+    return new COTPParameterChecksumBuilderImpl(crc);
+  }
+
+  public static class COTPParameterChecksumBuilderImpl
+      implements COTPParameter.COTPParameterBuilder {
+    private final short crc;
+
+    public COTPParameterChecksumBuilderImpl(short crc) {
+      this.crc = crc;
+    }
+
+    public COTPParameterChecksum build() {
+      COTPParameterChecksum cOTPParameterChecksum = new COTPParameterChecksum(crc);
+      return cOTPParameterChecksum;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPParameterChecksum)) {
+      return false;
+    }
+    COTPParameterChecksum that = (COTPParameterChecksum) o;
+    return (getCrc() == that.getCrc()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getCrc());
+  }
+
+  @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/COTPParameterDisconnectAdditionalInformation.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java
new file mode 100644
index 0000000000..9846b0517f
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java
@@ -0,0 +1,145 @@
+/*
+ * 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 COTPParameterDisconnectAdditionalInformation extends COTPParameter implements Message {
+
+  // Accessors for discriminator values.
+  public Short getParameterType() {
+    return (short) 0xE0;
+  }
+
+  // Properties.
+  protected final byte[] data;
+
+  public COTPParameterDisconnectAdditionalInformation(byte[] data) {
+    super();
+    this.data = data;
+  }
+
+  public byte[] getData() {
+    return data;
+  }
+
+  @Override
+  protected void serializeCOTPParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPParameterDisconnectAdditionalInformation");
+
+    // Array Field (data)
+    writeByteArrayField("data", data, writeByteArray(writeBuffer, 8));
+
+    writeBuffer.popContext("COTPParameterDisconnectAdditionalInformation");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPParameterDisconnectAdditionalInformation _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Array field
+    if (data != null) {
+      lengthInBits += 8 * data.length;
+    }
+
+    return lengthInBits;
+  }
+
+  public static COTPParameterBuilder staticParseCOTPParameterBuilder(
+      ReadBuffer readBuffer, Short rest) throws ParseException {
+    readBuffer.pullContext("COTPParameterDisconnectAdditionalInformation");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte[] data = readBuffer.readByteArray("data", Math.toIntExact(rest));
+
+    readBuffer.closeContext("COTPParameterDisconnectAdditionalInformation");
+    // Create the instance
+    return new COTPParameterDisconnectAdditionalInformationBuilderImpl(data);
+  }
+
+  public static class COTPParameterDisconnectAdditionalInformationBuilderImpl
+      implements COTPParameter.COTPParameterBuilder {
+    private final byte[] data;
+
+    public COTPParameterDisconnectAdditionalInformationBuilderImpl(byte[] data) {
+      this.data = data;
+    }
+
+    public COTPParameterDisconnectAdditionalInformation build() {
+      COTPParameterDisconnectAdditionalInformation cOTPParameterDisconnectAdditionalInformation =
+          new COTPParameterDisconnectAdditionalInformation(data);
+      return cOTPParameterDisconnectAdditionalInformation;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPParameterDisconnectAdditionalInformation)) {
+      return false;
+    }
+    COTPParameterDisconnectAdditionalInformation that =
+        (COTPParameterDisconnectAdditionalInformation) o;
+    return (getData() == that.getData()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getData());
+  }
+
+  @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/COTPParameterTpduSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java
new file mode 100644
index 0000000000..be740620a8
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java
@@ -0,0 +1,151 @@
+/*
+ * 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 COTPParameterTpduSize extends COTPParameter implements Message {
+
+  // Accessors for discriminator values.
+  public Short getParameterType() {
+    return (short) 0xC0;
+  }
+
+  // Properties.
+  protected final COTPTpduSize tpduSize;
+
+  public COTPParameterTpduSize(COTPTpduSize tpduSize) {
+    super();
+    this.tpduSize = tpduSize;
+  }
+
+  public COTPTpduSize getTpduSize() {
+    return tpduSize;
+  }
+
+  @Override
+  protected void serializeCOTPParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("COTPParameterTpduSize");
+
+    // Simple Field (tpduSize)
+    writeSimpleEnumField(
+        "tpduSize",
+        "COTPTpduSize",
+        tpduSize,
+        new DataWriterEnumDefault<>(
+            COTPTpduSize::getValue, COTPTpduSize::name, writeUnsignedShort(writeBuffer, 8)));
+
+    writeBuffer.popContext("COTPParameterTpduSize");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    COTPParameterTpduSize _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (tpduSize)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static COTPParameterBuilder staticParseCOTPParameterBuilder(
+      ReadBuffer readBuffer, Short rest) throws ParseException {
+    readBuffer.pullContext("COTPParameterTpduSize");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    COTPTpduSize tpduSize =
+        readEnumField(
+            "tpduSize",
+            "COTPTpduSize",
+            new DataReaderEnumDefault<>(
+                COTPTpduSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    readBuffer.closeContext("COTPParameterTpduSize");
+    // Create the instance
+    return new COTPParameterTpduSizeBuilderImpl(tpduSize);
+  }
+
+  public static class COTPParameterTpduSizeBuilderImpl
+      implements COTPParameter.COTPParameterBuilder {
+    private final COTPTpduSize tpduSize;
+
+    public COTPParameterTpduSizeBuilderImpl(COTPTpduSize tpduSize) {
+      this.tpduSize = tpduSize;
+    }
+
+    public COTPParameterTpduSize build() {
+      COTPParameterTpduSize cOTPParameterTpduSize = new COTPParameterTpduSize(tpduSize);
+      return cOTPParameterTpduSize;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof COTPParameterTpduSize)) {
+      return false;
+    }
+    COTPParameterTpduSize that = (COTPParameterTpduSize) o;
+    return (getTpduSize() == that.getTpduSize()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getTpduSize());
+  }
+
+  @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/COTPProtocolClass.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPProtocolClass.java
new file mode 100644
index 0000000000..01715721bc
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPProtocolClass.java
@@ -0,0 +1,58 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum COTPProtocolClass {
+  CLASS_0((short) 0x00),
+  CLASS_1((short) 0x10),
+  CLASS_2((short) 0x20),
+  CLASS_3((short) 0x30),
+  CLASS_4((short) 0x40);
+  private static final Map<Short, COTPProtocolClass> map;
+
+  static {
+    map = new HashMap<>();
+    for (COTPProtocolClass value : COTPProtocolClass.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  COTPProtocolClass(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static COTPProtocolClass enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPTpduSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPTpduSize.java
new file mode 100644
index 0000000000..9f7df7129a
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPTpduSize.java
@@ -0,0 +1,87 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum COTPTpduSize {
+  SIZE_128((short) 0x07, (int) 128),
+  SIZE_256((short) 0x08, (int) 256),
+  SIZE_512((short) 0x09, (int) 512),
+  SIZE_1024((short) 0x0a, (int) 1024),
+  SIZE_2048((short) 0x0b, (int) 2048),
+  SIZE_4096((short) 0x0c, (int) 4096),
+  SIZE_8192((short) 0x0d, (int) 8192);
+  private static final Map<Short, COTPTpduSize> map;
+
+  static {
+    map = new HashMap<>();
+    for (COTPTpduSize value : COTPTpduSize.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+  private final int sizeInBytes;
+
+  COTPTpduSize(short value, int sizeInBytes) {
+    this.value = value;
+    this.sizeInBytes = sizeInBytes;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public int getSizeInBytes() {
+    return sizeInBytes;
+  }
+
+  public static COTPTpduSize firstEnumForFieldSizeInBytes(int fieldValue) {
+    for (COTPTpduSize _val : COTPTpduSize.values()) {
+      if (_val.getSizeInBytes() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<COTPTpduSize> enumsForFieldSizeInBytes(int fieldValue) {
+    List<COTPTpduSize> _values = new ArrayList<>();
+    for (COTPTpduSize _val : COTPTpduSize.values()) {
+      if (_val.getSizeInBytes() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public static COTPTpduSize enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CpuSubscribeEvents.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CpuSubscribeEvents.java
new file mode 100644
index 0000000000..10be0b999d
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CpuSubscribeEvents.java
@@ -0,0 +1,57 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum CpuSubscribeEvents {
+  CPU((short) 0x01),
+  IM((short) 0x02),
+  FM((short) 0x04),
+  CP((short) 0x80);
+  private static final Map<Short, CpuSubscribeEvents> map;
+
+  static {
+    map = new HashMap<>();
+    for (CpuSubscribeEvents value : CpuSubscribeEvents.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  CpuSubscribeEvents(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static CpuSubscribeEvents enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
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..c15002a449
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java
@@ -0,0 +1,244 @@
+/*
+ * 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 int address;
+
+  public CycServiceItemAnyType(
+      short byteLength,
+      short syntaxId,
+      TransportSize transportSize,
+      int length,
+      int dbNumber,
+      MemoryArea memoryArea,
+      int 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 int getAddress() {
+    return address;
+  }
+
+  @Override
+  protected void serializeCycServiceItemTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("CycServiceItemAnyType");
+
+    // Enum field (transportSize)
+    writeEnumField(
+        "transportSize",
+        "TransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            TransportSize::getCode, 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, writeUnsignedInt(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();
+
+    // Enum 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    TransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "TransportSize",
+            readEnum(TransportSize::firstEnumForFieldCode, 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)));
+
+    int address = readSimpleField("address", readUnsignedInt(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 int address;
+
+    public CycServiceItemAnyTypeBuilderImpl(
+        TransportSize transportSize, int length, int dbNumber, MemoryArea memoryArea, int 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/CycServiceItemDbReadType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
new file mode 100644
index 0000000000..73363758dd
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
@@ -0,0 +1,169 @@
+/*
+ * 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 CycServiceItemDbReadType extends CycServiceItemType implements Message {
+
+  // Accessors for discriminator values.
+
+  // Properties.
+  protected final short numberOfAreas;
+  protected final List<SubItem> items;
+
+  public CycServiceItemDbReadType(
+      short byteLength, short syntaxId, short numberOfAreas, List<SubItem> items) {
+    super(byteLength, syntaxId);
+    this.numberOfAreas = numberOfAreas;
+    this.items = items;
+  }
+
+  public short getNumberOfAreas() {
+    return numberOfAreas;
+  }
+
+  public List<SubItem> getItems() {
+    return items;
+  }
+
+  @Override
+  protected void serializeCycServiceItemTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("CycServiceItemDbReadType");
+
+    // Simple Field (numberOfAreas)
+    writeSimpleField("numberOfAreas", numberOfAreas, writeUnsignedShort(writeBuffer, 8));
+
+    // Array Field (items)
+    writeComplexTypeArrayField("items", items, writeBuffer);
+
+    writeBuffer.popContext("CycServiceItemDbReadType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CycServiceItemDbReadType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (numberOfAreas)
+    lengthInBits += 8;
+
+    // Array field
+    if (items != null) {
+      int i = 0;
+      for (SubItem element : items) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= items.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static CycServiceItemTypeBuilder staticParseCycServiceItemTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("CycServiceItemDbReadType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short numberOfAreas = readSimpleField("numberOfAreas", readUnsignedShort(readBuffer, 8));
+
+    List<SubItem> items =
+        readCountArrayField(
+            "items",
+            new DataReaderComplexDefault<>(() -> SubItem.staticParse(readBuffer), readBuffer),
+            numberOfAreas);
+
+    readBuffer.closeContext("CycServiceItemDbReadType");
+    // Create the instance
+    return new CycServiceItemDbReadTypeBuilderImpl(numberOfAreas, items);
+  }
+
+  public static class CycServiceItemDbReadTypeBuilderImpl
+      implements CycServiceItemType.CycServiceItemTypeBuilder {
+    private final short numberOfAreas;
+    private final List<SubItem> items;
+
+    public CycServiceItemDbReadTypeBuilderImpl(short numberOfAreas, List<SubItem> items) {
+      this.numberOfAreas = numberOfAreas;
+      this.items = items;
+    }
+
+    public CycServiceItemDbReadType build(short byteLength, short syntaxId) {
+      CycServiceItemDbReadType cycServiceItemDbReadType =
+          new CycServiceItemDbReadType(byteLength, syntaxId, numberOfAreas, items);
+      return cycServiceItemDbReadType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CycServiceItemDbReadType)) {
+      return false;
+    }
+    CycServiceItemDbReadType that = (CycServiceItemDbReadType) o;
+    return (getNumberOfAreas() == that.getNumberOfAreas())
+        && (getItems() == that.getItems())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getNumberOfAreas(), getItems());
+  }
+
+  @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/CycServiceItemType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java
new file mode 100644
index 0000000000..9dca1f7e3e
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java
@@ -0,0 +1,189 @@
+/*
+ * 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();
+    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;
+    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/DataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java
new file mode 100644
index 0000000000..8cbcc67d76
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataItem.java
@@ -0,0 +1,531 @@
+/*
+ * 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.generation.StaticHelper.*;
+
+import java.math.BigInteger;
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.WithOption;
+import org.apache.plc4x.java.spi.generation.ByteOrder;
+import org.apache.plc4x.java.spi.generation.EvaluationHelper;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.SerializationException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.values.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class DataItem {
+
+  private static final Logger LOGGER = LoggerFactory.getLogger(DataItem.class);
+
+  public static PlcValue staticParse(
+      ReadBuffer readBuffer, String dataProtocolId, Integer stringLength) throws ParseException {
+    if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL
+
+      // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+      {
+        byte reserved = /*TODO: migrate me*/ /*TODO: migrate me*/
+            readBuffer.readUnsignedByte("", 7);
+        if (reserved != (byte) 0x00) {
+          LOGGER.info(
+              "Expected constant value " + 0x00 + " but got " + reserved + " for reserved field.");
+        }
+      }
+
+      // Simple Field (value)
+      Boolean value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readBit("");
+
+      return new PlcBOOL(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BYTE")) { // BYTE
+
+      // Simple Field (value)
+      Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      return new PlcBYTE(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WORD")) { // WORD
+
+      // Simple Field (value)
+      Integer value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedInt("", 16);
+
+      return new PlcWORD(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DWORD")) { // DWORD
+
+      // Simple Field (value)
+      Long value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedLong("", 32);
+
+      return new PlcDWORD(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LWORD")) { // LWORD
+
+      // Simple Field (value)
+      BigInteger value = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedBigInteger("", 64);
+
+      return new PlcLWORD(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_SINT")) { // SINT
+
+      // Simple Field (value)
+      Byte value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readSignedByte("", 8);
+
+      return new PlcSINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_USINT")) { // USINT
+
+      // Simple Field (value)
+      Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      return new PlcUSINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_INT")) { // INT
+
+      // Simple Field (value)
+      Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readShort("", 16);
+
+      return new PlcINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_UINT")) { // UINT
+
+      // Simple Field (value)
+      Integer value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedInt("", 16);
+
+      return new PlcUINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DINT")) { // DINT
+
+      // Simple Field (value)
+      Integer value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readInt("", 32);
+
+      return new PlcDINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_UDINT")) { // UDINT
+
+      // Simple Field (value)
+      Long value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedLong("", 32);
+
+      return new PlcUDINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LINT")) { // LINT
+
+      // Simple Field (value)
+      Long value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readLong("", 64);
+
+      return new PlcLINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_ULINT")) { // ULINT
+
+      // Simple Field (value)
+      BigInteger value = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedBigInteger("", 64);
+
+      return new PlcULINT(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_REAL")) { // REAL
+
+      // Simple Field (value)
+      Float value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readFloat("", 32);
+
+      return new PlcREAL(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LREAL")) { // LREAL
+
+      // Simple Field (value)
+      Double value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readDouble("", 64);
+
+      return new PlcLREAL(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR
+
+      // Simple Field (value)
+      String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8"));
+
+      return new PlcCHAR(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR
+
+      // Simple Field (value)
+      String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16"));
+
+      return new PlcCHAR(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING
+
+      // Manual Field (value)
+      String value =
+          (String)
+              (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7String(
+                  readBuffer, stringLength, "UTF-8"));
+
+      return new PlcSTRING(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING
+
+      // Manual Field (value)
+      String value =
+          (String)
+              (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.parseS7String(
+                  readBuffer, stringLength, "UTF-16"));
+
+      return new PlcSTRING(value);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME
+
+      // Simple Field (milliseconds)
+      Integer milliseconds = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readInt("", 32);
+
+      return PlcTIME.ofMilliseconds(milliseconds);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LTIME")) { // LTIME
+
+      // Simple Field (nanoseconds)
+      BigInteger nanoseconds = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedBigInteger("", 64);
+
+      return PlcLTIME.ofNanoseconds(nanoseconds);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE")) { // DATE
+
+      // Simple Field (daysSinceSiemensEpoch)
+      Integer daysSinceSiemensEpoch = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedInt("", 16);
+
+      return PlcDATE.ofDaysSinceSiemensEpoch(daysSinceSiemensEpoch);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME_OF_DAY")) { // TIME_OF_DAY
+
+      // Simple Field (millisecondsSinceMidnight)
+      Long millisecondsSinceMidnight = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedLong("", 32);
+
+      return PlcTIME_OF_DAY.ofMillisecondsSinceMidnight(millisecondsSinceMidnight);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LTIME_OF_DAY")) { // LTIME_OF_DAY
+
+      // Simple Field (nanosecondsSinceMidnight)
+      BigInteger nanosecondsSinceMidnight = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedBigInteger("", 64);
+
+      return PlcLTIME_OF_DAY.ofNanosecondsSinceMidnight(nanosecondsSinceMidnight);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE_AND_TIME")) { // DATE_AND_TIME
+
+      // Simple Field (year)
+      Integer year = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedInt("", 16);
+
+      // Simple Field (month)
+      Short month = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      // Simple Field (day)
+      Short day = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      // Simple Field (dayOfWeek)
+      Short dayOfWeek = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedShort("", 8);
+
+      // Simple Field (hour)
+      Short hour = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      // Simple Field (minutes)
+      Short minutes = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      // Simple Field (seconds)
+      Short seconds = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      // Simple Field (nanoseconds)
+      Long nanoseconds = /*TODO: migrate me*/ /*TODO: migrate me*/
+          readBuffer.readUnsignedLong("", 32);
+
+      return PlcDATE_AND_TIME.ofSegments(
+          year.intValue(),
+          (month == 0) ? 1 : month.intValue(),
+          (day == 0) ? 1 : day.intValue(),
+          hour.intValue(),
+          minutes.intValue(),
+          seconds.intValue(),
+          nanoseconds.intValue());
+    }
+    return null;
+  }
+
+  public static void staticSerialize(
+      WriteBuffer writeBuffer, PlcValue _value, String dataProtocolId, Integer stringLength)
+      throws SerializationException {
+    staticSerialize(writeBuffer, _value, dataProtocolId, stringLength, ByteOrder.BIG_ENDIAN);
+  }
+
+  public static void staticSerialize(
+      WriteBuffer writeBuffer,
+      PlcValue _value,
+      String dataProtocolId,
+      Integer stringLength,
+      ByteOrder byteOrder)
+      throws SerializationException {
+    if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL
+      // Reserved Field
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedByte("", 7, ((Number) (byte) 0x00).byteValue());
+      // Simple Field (value)
+      boolean value = (boolean) _value.getBoolean();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeBit("", (boolean) (value));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BYTE")) { // BYTE
+      // Simple Field (value)
+      short value = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (value)).shortValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WORD")) { // WORD
+      // Simple Field (value)
+      int value = (int) _value.getInt();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (value)).intValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DWORD")) { // DWORD
+      // Simple Field (value)
+      long value = (long) _value.getLong();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedLong("", 32, ((Number) (value)).longValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LWORD")) { // LWORD
+      // Simple Field (value)
+      BigInteger value = (BigInteger) _value.getBigInteger();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger("", 64, (BigInteger) (value));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_SINT")) { // SINT
+      // Simple Field (value)
+      byte value = (byte) _value.getByte();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeSignedByte("", 8, ((Number) (value)).byteValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_USINT")) { // USINT
+      // Simple Field (value)
+      short value = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (value)).shortValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_INT")) { // INT
+      // Simple Field (value)
+      short value = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeShort("", 16, ((Number) (value)).shortValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_UINT")) { // UINT
+      // Simple Field (value)
+      int value = (int) _value.getInt();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (value)).intValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DINT")) { // DINT
+      // Simple Field (value)
+      int value = (int) _value.getInt();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeInt("", 32, ((Number) (value)).intValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_UDINT")) { // UDINT
+      // Simple Field (value)
+      long value = (long) _value.getLong();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedLong("", 32, ((Number) (value)).longValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LINT")) { // LINT
+      // Simple Field (value)
+      long value = (long) _value.getLong();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeLong("", 64, ((Number) (value)).longValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_ULINT")) { // ULINT
+      // Simple Field (value)
+      BigInteger value = (BigInteger) _value.getBigInteger();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger("", 64, (BigInteger) (value));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_REAL")) { // REAL
+      // Simple Field (value)
+      float value = (float) _value.getFloat();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeFloat("", 32, (value));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LREAL")) { // LREAL
+      // Simple Field (value)
+      double value = (double) _value.getDouble();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeDouble("", 64, (value));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR
+      // Simple Field (value)
+      String value = (String) _value.getString();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeString(
+          "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR
+      // Simple Field (value)
+      String value = (String) _value.getString();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeString(
+          "", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING
+      // Manual Field (value)
+      org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7String(
+          writeBuffer, _value, stringLength, "UTF-8");
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING
+      // Manual Field (value)
+      org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.serializeS7String(
+          writeBuffer, _value, stringLength, "UTF-16");
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME
+      // Simple Field (milliseconds)
+      int milliseconds = (int) _value.getInt();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeInt("", 32, ((Number) (milliseconds)).intValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LTIME")) { // LTIME
+      // Simple Field (nanoseconds)
+      BigInteger nanoseconds = (BigInteger) _value.getBigInteger();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger("", 64, (BigInteger) (nanoseconds));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE")) { // DATE
+      // Simple Field (daysSinceSiemensEpoch)
+      int daysSinceSiemensEpoch = (int) ((PlcDATE) _value).getDaysSinceSiemensEpoch();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedInt(
+          "", 16, ((Number) (daysSinceSiemensEpoch)).intValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME_OF_DAY")) { // TIME_OF_DAY
+      // Simple Field (millisecondsSinceMidnight)
+      long millisecondsSinceMidnight = (long) _value.getLong();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedLong(
+          "", 32, ((Number) (millisecondsSinceMidnight)).longValue());
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LTIME_OF_DAY")) { // LTIME_OF_DAY
+      // Simple Field (nanosecondsSinceMidnight)
+      BigInteger nanosecondsSinceMidnight = (BigInteger) _value.getBigInteger();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedBigInteger(
+          "", 64, (BigInteger) (nanosecondsSinceMidnight));
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE_AND_TIME")) { // DATE_AND_TIME
+      // Simple Field (year)
+      int year = (int) _value.getInt();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (year)).intValue());
+      // Simple Field (month)
+      short month = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (month)).shortValue());
+      // Simple Field (day)
+      short day = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (day)).shortValue());
+      // Simple Field (dayOfWeek)
+      short dayOfWeek = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort(
+          "", 8, ((Number) (dayOfWeek)).shortValue());
+      // Simple Field (hour)
+      short hour = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (hour)).shortValue());
+      // Simple Field (minutes)
+      short minutes = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (minutes)).shortValue());
+      // Simple Field (seconds)
+      short seconds = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (seconds)).shortValue());
+      // Simple Field (nanoseconds)
+      long nanoseconds = (long) _value.getLong();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedLong(
+          "", 32, ((Number) (nanoseconds)).longValue());
+    }
+  }
+
+  public static int getLengthInBytes(PlcValue _value, String dataProtocolId, Integer stringLength) {
+    return (int) Math.ceil((float) getLengthInBits(_value, dataProtocolId, stringLength) / 8.0);
+  }
+
+  public static int getLengthInBits(PlcValue _value, String dataProtocolId, Integer stringLength) {
+    int sizeInBits = 0;
+    if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BOOL")) { // BOOL
+      // Reserved Field
+      sizeInBits += 7;
+      // Simple Field (value)
+      sizeInBits += 1;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_BYTE")) { // BYTE
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WORD")) { // WORD
+      // Simple Field (value)
+      sizeInBits += 16;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DWORD")) { // DWORD
+      // Simple Field (value)
+      sizeInBits += 32;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LWORD")) { // LWORD
+      // Simple Field (value)
+      sizeInBits += 64;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_SINT")) { // SINT
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_USINT")) { // USINT
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_INT")) { // INT
+      // Simple Field (value)
+      sizeInBits += 16;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_UINT")) { // UINT
+      // Simple Field (value)
+      sizeInBits += 16;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DINT")) { // DINT
+      // Simple Field (value)
+      sizeInBits += 32;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_UDINT")) { // UDINT
+      // Simple Field (value)
+      sizeInBits += 32;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LINT")) { // LINT
+      // Simple Field (value)
+      sizeInBits += 64;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_ULINT")) { // ULINT
+      // Simple Field (value)
+      sizeInBits += 64;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_REAL")) { // REAL
+      // Simple Field (value)
+      sizeInBits += 32;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LREAL")) { // LREAL
+      // Simple Field (value)
+      sizeInBits += 64;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_CHAR")) { // CHAR
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WCHAR")) { // CHAR
+      // Simple Field (value)
+      sizeInBits += 16;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_STRING")) { // STRING
+      // Manual Field (value)
+      sizeInBits += (((stringLength) * (8))) + (16);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_WSTRING")) { // STRING
+      // Manual Field (value)
+      sizeInBits += (((stringLength) * (16))) + (32);
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME")) { // TIME
+      // Simple Field (milliseconds)
+      sizeInBits += 32;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LTIME")) { // LTIME
+      // Simple Field (nanoseconds)
+      sizeInBits += 64;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE")) { // DATE
+      // Simple Field (daysSinceSiemensEpoch)
+      sizeInBits += 16;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_TIME_OF_DAY")) { // TIME_OF_DAY
+      // Simple Field (millisecondsSinceMidnight)
+      sizeInBits += 32;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_LTIME_OF_DAY")) { // LTIME_OF_DAY
+      // Simple Field (nanosecondsSinceMidnight)
+      sizeInBits += 64;
+    } else if (EvaluationHelper.equals(dataProtocolId, "IEC61131_DATE_AND_TIME")) { // DATE_AND_TIME
+      // Simple Field (year)
+      sizeInBits += 16;
+      // Simple Field (month)
+      sizeInBits += 8;
+      // Simple Field (day)
+      sizeInBits += 8;
+      // Simple Field (dayOfWeek)
+      sizeInBits += 8;
+      // Simple Field (hour)
+      sizeInBits += 8;
+      // Simple Field (minutes)
+      sizeInBits += 8;
+      // Simple Field (seconds)
+      sizeInBits += 8;
+      // Simple Field (nanoseconds)
+      sizeInBits += 32;
+    }
+    return sizeInBits;
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportErrorCode.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportErrorCode.java
new file mode 100644
index 0000000000..72da9d7152
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportErrorCode.java
@@ -0,0 +1,59 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum DataTransportErrorCode {
+  RESERVED((short) 0x00),
+  OK((short) 0xFF),
+  ACCESS_DENIED((short) 0x03),
+  INVALID_ADDRESS((short) 0x05),
+  DATA_TYPE_NOT_SUPPORTED((short) 0x06),
+  NOT_FOUND((short) 0x0A);
+  private static final Map<Short, DataTransportErrorCode> map;
+
+  static {
+    map = new HashMap<>();
+    for (DataTransportErrorCode value : DataTransportErrorCode.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  DataTransportErrorCode(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static DataTransportErrorCode enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportSize.java
new file mode 100644
index 0000000000..bc667c57c3
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportSize.java
@@ -0,0 +1,87 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum DataTransportSize {
+  NULL((short) 0x00, (boolean) false),
+  BIT((short) 0x03, (boolean) true),
+  BYTE_WORD_DWORD((short) 0x04, (boolean) true),
+  INTEGER((short) 0x05, (boolean) true),
+  DINTEGER((short) 0x06, (boolean) false),
+  REAL((short) 0x07, (boolean) false),
+  OCTET_STRING((short) 0x09, (boolean) false);
+  private static final Map<Short, DataTransportSize> map;
+
+  static {
+    map = new HashMap<>();
+    for (DataTransportSize value : DataTransportSize.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+  private final boolean sizeInBits;
+
+  DataTransportSize(short value, boolean sizeInBits) {
+    this.value = value;
+    this.sizeInBits = sizeInBits;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public boolean getSizeInBits() {
+    return sizeInBits;
+  }
+
+  public static DataTransportSize firstEnumForFieldSizeInBits(boolean fieldValue) {
+    for (DataTransportSize _val : DataTransportSize.values()) {
+      if (_val.getSizeInBits() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<DataTransportSize> enumsForFieldSizeInBits(boolean fieldValue) {
+    List<DataTransportSize> _values = new ArrayList<>();
+    for (DataTransportSize _val : DataTransportSize.values()) {
+      if (_val.getSizeInBits() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public static DataTransportSize enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DateAndTime.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DateAndTime.java
new file mode 100644
index 0000000000..6b52808638
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DateAndTime.java
@@ -0,0 +1,313 @@
+/*
+ * 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 DateAndTime implements Message {
+
+  // Properties.
+  protected final short year;
+  protected final short month;
+  protected final short day;
+  protected final short hour;
+  protected final short minutes;
+  protected final short seconds;
+  protected final short msec;
+  protected final byte dow;
+
+  public DateAndTime(
+      short year,
+      short month,
+      short day,
+      short hour,
+      short minutes,
+      short seconds,
+      short msec,
+      byte dow) {
+    super();
+    this.year = year;
+    this.month = month;
+    this.day = day;
+    this.hour = hour;
+    this.minutes = minutes;
+    this.seconds = seconds;
+    this.msec = msec;
+    this.dow = dow;
+  }
+
+  public short getYear() {
+    return year;
+  }
+
+  public short getMonth() {
+    return month;
+  }
+
+  public short getDay() {
+    return day;
+  }
+
+  public short getHour() {
+    return hour;
+  }
+
+  public short getMinutes() {
+    return minutes;
+  }
+
+  public short getSeconds() {
+    return seconds;
+  }
+
+  public short getMsec() {
+    return msec;
+  }
+
+  public byte getDow() {
+    return dow;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DateAndTime");
+
+    // Manual Field (year)
+    writeManualField(
+        "year",
+        () -> org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(writeBuffer, year),
+        writeBuffer);
+
+    // Manual Field (month)
+    writeManualField(
+        "month",
+        () -> org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(writeBuffer, month),
+        writeBuffer);
+
+    // Manual Field (day)
+    writeManualField(
+        "day",
+        () -> org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(writeBuffer, day),
+        writeBuffer);
+
+    // Manual Field (hour)
+    writeManualField(
+        "hour",
+        () -> org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(writeBuffer, hour),
+        writeBuffer);
+
+    // Manual Field (minutes)
+    writeManualField(
+        "minutes",
+        () -> org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(writeBuffer, minutes),
+        writeBuffer);
+
+    // Manual Field (seconds)
+    writeManualField(
+        "seconds",
+        () -> org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.ByteToBcd(writeBuffer, seconds),
+        writeBuffer);
+
+    // Manual Field (msec)
+    writeManualField(
+        "msec",
+        () -> org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.IntToS7msec(writeBuffer, msec),
+        writeBuffer);
+
+    // Simple Field (dow)
+    writeSimpleField("dow", dow, writeUnsignedByte(writeBuffer, 4));
+
+    writeBuffer.popContext("DateAndTime");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    DateAndTime _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Manual Field (year)
+    lengthInBits += 8;
+
+    // Manual Field (month)
+    lengthInBits += 8;
+
+    // Manual Field (day)
+    lengthInBits += 8;
+
+    // Manual Field (hour)
+    lengthInBits += 8;
+
+    // Manual Field (minutes)
+    lengthInBits += 8;
+
+    // Manual Field (seconds)
+    lengthInBits += 8;
+
+    // Manual Field (msec)
+    lengthInBits += 12;
+
+    // Simple field (dow)
+    lengthInBits += 4;
+
+    return lengthInBits;
+  }
+
+  public static DateAndTime staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static DateAndTime staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("DateAndTime");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short year =
+        readManualField(
+            "year",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.BcdToInt(readBuffer)));
+
+    short month =
+        readManualField(
+            "month",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.BcdToInt(readBuffer)));
+
+    short day =
+        readManualField(
+            "day",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.BcdToInt(readBuffer)));
+
+    short hour =
+        readManualField(
+            "hour",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.BcdToInt(readBuffer)));
+
+    short minutes =
+        readManualField(
+            "minutes",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.BcdToInt(readBuffer)));
+
+    short seconds =
+        readManualField(
+            "seconds",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.BcdToInt(readBuffer)));
+
+    short msec =
+        readManualField(
+            "msec",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.s7.readwrite.utils.StaticHelper.S7msecToInt(
+                        readBuffer)));
+
+    byte dow = readSimpleField("dow", readUnsignedByte(readBuffer, 4));
+
+    readBuffer.closeContext("DateAndTime");
+    // Create the instance
+    DateAndTime _dateAndTime;
+    _dateAndTime = new DateAndTime(year, month, day, hour, minutes, seconds, msec, dow);
+    return _dateAndTime;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DateAndTime)) {
+      return false;
+    }
+    DateAndTime that = (DateAndTime) o;
+    return (getYear() == that.getYear())
+        && (getMonth() == that.getMonth())
+        && (getDay() == that.getDay())
+        && (getHour() == that.getHour())
+        && (getMinutes() == that.getMinutes())
+        && (getSeconds() == that.getSeconds())
+        && (getMsec() == that.getMsec())
+        && (getDow() == that.getDow())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getYear(),
+        getMonth(),
+        getDay(),
+        getHour(),
+        getMinutes(),
+        getSeconds(),
+        getMsec(),
+        getDow());
+  }
+
+  @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/DeviceGroup.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DeviceGroup.java
new file mode 100644
index 0000000000..6386830857
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DeviceGroup.java
@@ -0,0 +1,56 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum DeviceGroup {
+  PG_OR_PC((short) 0x01),
+  OS((short) 0x02),
+  OTHERS((short) 0x03);
+  private static final Map<Short, DeviceGroup> map;
+
+  static {
+    map = new HashMap<>();
+    for (DeviceGroup value : DeviceGroup.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  DeviceGroup(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static DeviceGroup enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
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
new file mode 100644
index 0000000000..b80be90877
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java
@@ -0,0 +1,58 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum EventType {
+  MODE((short) 0x01),
+  SYS((short) 0x02),
+  USR((short) 0x04),
+  ALM((short) 0x80),
+  CYC((short) 0x69);
+  private static final Map<Short, EventType> map;
+
+  static {
+    map = new HashMap<>();
+    for (EventType value : EventType.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  EventType(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static EventType enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/MemoryArea.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/MemoryArea.java
new file mode 100644
index 0000000000..16146f7ab2
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/MemoryArea.java
@@ -0,0 +1,89 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum MemoryArea {
+  COUNTERS((short) 0x1C, (String) "C"),
+  TIMERS((short) 0x1D, (String) "T"),
+  DIRECT_PERIPHERAL_ACCESS((short) 0x80, (String) "D"),
+  INPUTS((short) 0x81, (String) "I"),
+  OUTPUTS((short) 0x82, (String) "Q"),
+  FLAGS_MARKERS((short) 0x83, (String) "M"),
+  DATA_BLOCKS((short) 0x84, (String) "DB"),
+  INSTANCE_DATA_BLOCKS((short) 0x85, (String) "DBI"),
+  LOCAL_DATA((short) 0x86, (String) "LD");
+  private static final Map<Short, MemoryArea> map;
+
+  static {
+    map = new HashMap<>();
+    for (MemoryArea value : MemoryArea.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+  private final String shortName;
+
+  MemoryArea(short value, String shortName) {
+    this.value = value;
+    this.shortName = shortName;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public String getShortName() {
+    return shortName;
+  }
+
+  public static MemoryArea firstEnumForFieldShortName(String fieldValue) {
+    for (MemoryArea _val : MemoryArea.values()) {
+      if (_val.getShortName().equals(fieldValue)) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<MemoryArea> enumsForFieldShortName(String fieldValue) {
+    List<MemoryArea> _values = new ArrayList<>();
+    for (MemoryArea _val : MemoryArea.values()) {
+      if (_val.getShortName().equals(fieldValue)) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public static MemoryArea enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/ModeTransitionType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/ModeTransitionType.java
new file mode 100644
index 0000000000..affc7ccb3e
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/ModeTransitionType.java
@@ -0,0 +1,62 @@
+/*
+ * 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 java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum ModeTransitionType {
+  STOP((short) 0x00),
+  WARM_RESTART((short) 0x01),
+  RUN((short) 0x02),
+  HOT_RESTART((short) 0x03),
+  HOLD((short) 0x04),
+  COLD_RESTART((short) 0x06),
+  RUN_R((short) 0x09),
+  LINK_UP((short) 0x11),
+  UPDATE((short) 0x12);
+  private static final Map<Short, ModeTransitionType> map;
+
+  static {
+    map = new HashMap<>();
+    for (ModeTransitionType value : ModeTransitionType.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  ModeTransitionType(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static ModeTransitionType enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
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
new file mode 100644
index 0000000000..6a0986380c
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
@@ -0,0 +1,57 @@
+/*
+ * 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 java.util.HashMap;
+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),
+  ALARM_8P((short) 0x09);
+  private static final Map<Short, QueryType> map;
+
+  static {
+    map = new HashMap<>();
+    for (QueryType value : QueryType.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private final short value;
+
+  QueryType(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static QueryType enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
new file mode 100644
index 0000000000..3fdb19bcae
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
@@ -0,0 +1,146 @@
+/*
+ * 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 S7Address implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getAddressType();
+
+  public S7Address() {
+    super();
+  }
+
+  protected abstract void serializeS7AddressChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7Address");
+
+    // Discriminator Field (addressType) (Used as input to a switch field)
+    writeDiscriminatorField("addressType", getAddressType(), writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeS7AddressChild(writeBuffer);
+
+    writeBuffer.popContext("S7Address");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    S7Address _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (addressType)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static S7Address staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static S7Address staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("S7Address");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short addressType = readDiscriminatorField("addressType", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    S7AddressBuilder builder = null;
+    if (EvaluationHelper.equals(addressType, (short) 0x10)) {
+      builder = S7AddressAny.staticParseS7AddressBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "addressType="
+              + addressType
+              + "]");
+    }
+
+    readBuffer.closeContext("S7Address");
+    // Create the instance
+    S7Address _s7Address = builder.build();
+    return _s7Address;
+  }
+
+  public interface S7AddressBuilder {
+    S7Address build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7Address)) {
+      return false;
+    }
+    S7Address that = (S7Address) o;
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash();
+  }
+
+  @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/S7AddressAny.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java
new file mode 100644
index 0000000000..d990a8d900
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java
@@ -0,0 +1,276 @@
+/*
+ * 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 S7AddressAny extends S7Address implements Message {
+
+  // Accessors for discriminator values.
+  public Short getAddressType() {
+    return (short) 0x10;
+  }
+
+  // Properties.
+  protected final TransportSize transportSize;
+  protected final int numberOfElements;
+  protected final int dbNumber;
+  protected final MemoryArea area;
+  protected final int byteAddress;
+  protected final byte bitAddress;
+
+  public S7AddressAny(
+      TransportSize transportSize,
+      int numberOfElements,
+      int dbNumber,
+      MemoryArea area,
+      int byteAddress,
+      byte bitAddress) {
+    super();
+    this.transportSize = transportSize;
+    this.numberOfElements = numberOfElements;
+    this.dbNumber = dbNumber;
+    this.area = area;
+    this.byteAddress = byteAddress;
+    this.bitAddress = bitAddress;
+  }
+
+  public TransportSize getTransportSize() {
+    return transportSize;
+  }
+
+  public int getNumberOfElements() {
+    return numberOfElements;
+  }
+
+  public int getDbNumber() {
+    return dbNumber;
+  }
+
+  public MemoryArea getArea() {
+    return area;
+  }
+
+  public int getByteAddress() {
+    return byteAddress;
+  }
+
+  public byte getBitAddress() {
+    return bitAddress;
+  }
+
+  @Override
+  protected void serializeS7AddressChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7AddressAny");
+
+    // Enum field (transportSize)
+    writeEnumField(
+        "transportSize",
+        "TransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            TransportSize::getCode, TransportSize::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (numberOfElements)
+    writeSimpleField("numberOfElements", numberOfElements, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (dbNumber)
+    writeSimpleField("dbNumber", dbNumber, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (area)
+    writeSimpleEnumField(
+        "area",
+        "MemoryArea",
+        area,
+        new DataWriterEnumDefault<>(
+            MemoryArea::getValue, MemoryArea::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (byte) 0x00, writeUnsignedByte(writeBuffer, 5));
+
+    // Simple Field (byteAddress)
+    writeSimpleField("byteAddress", byteAddress, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (bitAddress)
+    writeSimpleField("bitAddress", bitAddress, writeUnsignedByte(writeBuffer, 3));
+
+    writeBuffer.popContext("S7AddressAny");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7AddressAny _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Enum Field (transportSize)
+    lengthInBits += 8;
+
+    // Simple field (numberOfElements)
+    lengthInBits += 16;
+
+    // Simple field (dbNumber)
+    lengthInBits += 16;
+
+    // Simple field (area)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 5;
+
+    // Simple field (byteAddress)
+    lengthInBits += 16;
+
+    // Simple field (bitAddress)
+    lengthInBits += 3;
+
+    return lengthInBits;
+  }
+
+  public static S7AddressBuilder staticParseS7AddressBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("S7AddressAny");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    TransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "TransportSize",
+            readEnum(TransportSize::firstEnumForFieldCode, readUnsignedShort(readBuffer, 8)));
+
+    int numberOfElements = readSimpleField("numberOfElements", readUnsignedInt(readBuffer, 16));
+
+    int dbNumber = readSimpleField("dbNumber", readUnsignedInt(readBuffer, 16));
+
+    MemoryArea area =
+        readEnumField(
+            "area",
+            "MemoryArea",
+            new DataReaderEnumDefault<>(
+                MemoryArea::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    Byte reservedField0 =
+        readReservedField("reserved", readUnsignedByte(readBuffer, 5), (byte) 0x00);
+
+    int byteAddress = readSimpleField("byteAddress", readUnsignedInt(readBuffer, 16));
+
+    byte bitAddress = readSimpleField("bitAddress", readUnsignedByte(readBuffer, 3));
+
+    readBuffer.closeContext("S7AddressAny");
+    // Create the instance
+    return new S7AddressAnyBuilderImpl(
+        transportSize, numberOfElements, dbNumber, area, byteAddress, bitAddress);
+  }
+
+  public static class S7AddressAnyBuilderImpl implements S7Address.S7AddressBuilder {
+    private final TransportSize transportSize;
+    private final int numberOfElements;
+    private final int dbNumber;
+    private final MemoryArea area;
+    private final int byteAddress;
+    private final byte bitAddress;
+
+    public S7AddressAnyBuilderImpl(
+        TransportSize transportSize,
+        int numberOfElements,
+        int dbNumber,
+        MemoryArea area,
+        int byteAddress,
+        byte bitAddress) {
+      this.transportSize = transportSize;
+      this.numberOfElements = numberOfElements;
+      this.dbNumber = dbNumber;
+      this.area = area;
+      this.byteAddress = byteAddress;
+      this.bitAddress = bitAddress;
+    }
+
+    public S7AddressAny build() {
+      S7AddressAny s7AddressAny =
+          new S7AddressAny(
+              transportSize, numberOfElements, dbNumber, area, byteAddress, bitAddress);
+      return s7AddressAny;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7AddressAny)) {
+      return false;
+    }
+    S7AddressAny that = (S7AddressAny) o;
+    return (getTransportSize() == that.getTransportSize())
+        && (getNumberOfElements() == that.getNumberOfElements())
+        && (getDbNumber() == that.getDbNumber())
+        && (getArea() == that.getArea())
+        && (getByteAddress() == that.getByteAddress())
+        && (getBitAddress() == that.getBitAddress())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getTransportSize(),
+        getNumberOfElements(),
+        getDbNumber(),
+        getArea(),
+        getByteAddress(),
+        getBitAddress());
+  }
+
+  @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/S7DataAlarmMessage.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7DataAlarmMessage.java
new file mode 100644
index 0000000000..92e453cc40
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7DataAlarmMessage.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 S7DataAlarmMessage implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Byte getCpuFunctionType();
+
+  // Constant values.
+  public static final Short FUNCTIONID = 0x00;
+  public static final Short NUMBERMESSAGEOBJ = 0x01;
+
+  public S7DataAlarmMessage() {
+    super();
+  }
+
+  public short getFunctionId() {
+    return FUNCTIONID;
+  }
+
+  public short getNumberMessageObj() {
+    return NUMBERMESSAGEOBJ;
+  }
+
+  protected abstract void serializeS7DataAlarmMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7DataAlarmMessage");
+
+    // Const Field (functionId)
+    writeConstField("functionId", FUNCTIONID, writeUnsignedShort(writeBuffer, 8));
+
+    // Const Field (numberMessageObj)
+    writeConstField("numberMessageObj", NUMBERMESSAGEOBJ, writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeS7DataAlarmMessageChild(writeBuffer);
+
+    writeBuffer.popContext("S7DataAlarmMessage");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    S7DataAlarmMessage _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (functionId)
+    lengthInBits += 8;
+
+    // Const Field (numberMessageObj)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static S7DataAlarmMessage staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    if ((args == null) || (args.length != 1)) {
+      throw new PlcRuntimeException(
+          "Wrong number of arguments, expected 1, but got " + args.length);
+    }
+    Byte cpuFunctionType;
+    if (args[0] instanceof Byte) {
+      cpuFunctionType = (Byte) args[0];
+    } else if (args[0] instanceof String) {
+      cpuFunctionType = 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());
+    }
+    return staticParse(readBuffer, cpuFunctionType);
+  }
+
+  public static S7DataAlarmMessage staticParse(ReadBuffer readBuffer, Byte cpuFunctionType)
+      throws ParseException {
+    readBuffer.pullContext("S7DataAlarmMessage");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short functionId =
+        readConstField(
+            "functionId", readUnsignedShort(readBuffer, 8), S7DataAlarmMessage.FUNCTIONID);
+
+    short numberMessageObj =
+        readConstField(
+            "numberMessageObj",
+            readUnsignedShort(readBuffer, 8),
+            S7DataAlarmMessage.NUMBERMESSAGEOBJ);
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    S7DataAlarmMessageBuilder builder = null;
+    if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x04)) {
+      builder =
+          S7MessageObjectRequest.staticParseS7DataAlarmMessageBuilder(readBuffer, cpuFunctionType);
+    } else if (EvaluationHelper.equals(cpuFunctionType, (byte) 0x08)) {
+      builder =
+          S7MessageObjectResponse.staticParseS7DataAlarmMessageBuilder(readBuffer, cpuFunctionType);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "cpuFunctionType="
+              + cpuFunctionType
+              + "]");
+    }
+
+    readBuffer.closeContext("S7DataAlarmMessage");
+    // Create the instance
+    S7DataAlarmMessage _s7DataAlarmMessage = builder.build();
+    return _s7DataAlarmMessage;
+  }
+
+  public interface S7DataAlarmMessageBuilder {
+    S7DataAlarmMessage build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7DataAlarmMessage)) {
+      return false;
+    }
+    S7DataAlarmMessage that = (S7DataAlarmMessage) o;
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash();
+  }
+
+  @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/S7Message.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java
new file mode 100644
index 0000000000..19cf023dbf
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java
@@ -0,0 +1,262 @@
+/*
+ * 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 S7Message implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getMessageType();
+
+  // Constant values.
+  public static final Short PROTOCOLID = 0x32;
+
+  // Properties.
+  protected final int tpduReference;
+  protected final S7Parameter parameter;
+  protected final S7Payload payload;
+
+  public S7Message(int tpduReference, S7Parameter parameter, S7Payload payload) {
+    super();
+    this.tpduReference = tpduReference;
+    this.parameter = parameter;
+    this.payload = payload;
+  }
+
+  public int getTpduReference() {
+    return tpduReference;
+  }
+
+  public S7Parameter getParameter() {
+    return parameter;
+  }
+
+  public S7Payload getPayload() {
+    return payload;
+  }
+
+  public short getProtocolId() {
+    return PROTOCOLID;
+  }
+
+  protected abstract void serializeS7MessageChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7Message");
+
+    // Const Field (protocolId)
+    writeConstField("protocolId", PROTOCOLID, writeUnsignedShort(writeBuffer, 8));
+
+    // Discriminator Field (messageType) (Used as input to a switch field)
+    writeDiscriminatorField("messageType", getMessageType(), writeUnsignedShort(writeBuffer, 8));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (int) 0x0000, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (tpduReference)
+    writeSimpleField("tpduReference", tpduReference, writeUnsignedInt(writeBuffer, 16));
+
+    // Implicit Field (parameterLength) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int parameterLength =
+        (int) ((((getParameter()) != (null)) ? getParameter().getLengthInBytes() : 0));
+    writeImplicitField("parameterLength", parameterLength, writeUnsignedInt(writeBuffer, 16));
+
+    // Implicit Field (payloadLength) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int payloadLength = (int) ((((getPayload()) != (null)) ? getPayload().getLengthInBytes() : 0));
+    writeImplicitField("payloadLength", payloadLength, writeUnsignedInt(writeBuffer, 16));
+
+    // Switch field (Serialize the sub-type)
+    serializeS7MessageChild(writeBuffer);
+
+    // Optional Field (parameter) (Can be skipped, if the value is null)
+    writeOptionalField("parameter", parameter, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Optional Field (payload) (Can be skipped, if the value is null)
+    writeOptionalField("payload", payload, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("S7Message");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    S7Message _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (protocolId)
+    lengthInBits += 8;
+
+    // Discriminator Field (messageType)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 16;
+
+    // Simple field (tpduReference)
+    lengthInBits += 16;
+
+    // Implicit Field (parameterLength)
+    lengthInBits += 16;
+
+    // Implicit Field (payloadLength)
+    lengthInBits += 16;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    // Optional Field (parameter)
+    if (parameter != null) {
+      lengthInBits += parameter.getLengthInBits();
+    }
+
+    // Optional Field (payload)
+    if (payload != null) {
+      lengthInBits += payload.getLengthInBits();
+    }
+
+    return lengthInBits;
+  }
+
+  public static S7Message staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static S7Message staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("S7Message");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short protocolId =
+        readConstField("protocolId", readUnsignedShort(readBuffer, 8), S7Message.PROTOCOLID);
+
+    short messageType = readDiscriminatorField("messageType", readUnsignedShort(readBuffer, 8));
+
+    Integer reservedField0 =
+        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+
+    int tpduReference = readSimpleField("tpduReference", readUnsignedInt(readBuffer, 16));
+
+    int parameterLength = readImplicitField("parameterLength", readUnsignedInt(readBuffer, 16));
+
+    int payloadLength = readImplicitField("payloadLength", readUnsignedInt(readBuffer, 16));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    S7MessageBuilder builder = null;
+    if (EvaluationHelper.equals(messageType, (short) 0x01)) {
+      builder = S7MessageRequest.staticParseS7MessageBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(messageType, (short) 0x02)) {
+      builder = S7MessageResponse.staticParseS7MessageBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(messageType, (short) 0x03)) {
+      builder = S7MessageResponseData.staticParseS7MessageBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(messageType, (short) 0x07)) {
+      builder = S7MessageUserData.staticParseS7MessageBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "messageType="
+              + messageType
+              + "]");
+    }
+
+    S7Parameter parameter =
+        readOptionalField(
+            "parameter",
+            new DataReaderComplexDefault<>(
+                () -> S7Parameter.staticParse(readBuffer, (short) (messageType)), readBuffer),
+            (parameterLength) > (0));
+
+    S7Payload payload =
+        readOptionalField(
+            "payload",
+            new DataReaderComplexDefault<>(
+                () ->
+                    S7Payload.staticParse(
+                        readBuffer, (short) (messageType), (S7Parameter) (parameter)),
+                readBuffer),
+            (payloadLength) > (0));
+
+    readBuffer.closeContext("S7Message");
+    // Create the instance
+    S7Message _s7Message = builder.build(tpduReference, parameter, payload);
+    return _s7Message;
+  }
+
+  public interface S7MessageBuilder {
+    S7Message build(int tpduReference, S7Parameter parameter, S7Payload payload);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7Message)) {
+      return false;
+    }
+    S7Message that = (S7Message) o;
+    return (getTpduReference() == that.getTpduReference())
+        && (getParameter() == that.getParameter())
+        && (getPayload() == that.getPayload())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getTpduReference(), getParameter(), getPayload());
+  }
+
+  @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/S7MessageObjectRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java
new file mode 100644
index 0000000000..fcdf0b49c2
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java
@@ -0,0 +1,256 @@
+/*
+ * 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 S7MessageObjectRequest extends S7DataAlarmMessage implements Message {
+
+  // Accessors for discriminator values.
+  public Byte getCpuFunctionType() {
+    return (byte) 0x04;
+  }
+
+  // Constant values.
+  public static final Short VARIABLESPEC = 0x12;
+  public static final Short LENGTH = 0x08;
+
+  // Properties.
+  protected final SyntaxIdType syntaxId;
+  protected final QueryType queryType;
+  protected final AlarmType alarmType;
+
+  public S7MessageObjectRequest(SyntaxIdType syntaxId, QueryType queryType, AlarmType alarmType) {
+    super();
+    this.syntaxId = syntaxId;
+    this.queryType = queryType;
+    this.alarmType = alarmType;
+  }
+
+  public SyntaxIdType getSyntaxId() {
+    return syntaxId;
+  }
+
+  public QueryType getQueryType() {
+    return queryType;
+  }
+
+  public AlarmType getAlarmType() {
+    return alarmType;
+  }
+
+  public short getVariableSpec() {
+    return VARIABLESPEC;
+  }
+
+  public short getLength() {
+    return LENGTH;
+  }
+
+  @Override
+  protected void serializeS7DataAlarmMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7MessageObjectRequest");
+
+    // Const Field (variableSpec)
+    writeConstField("variableSpec", VARIABLESPEC, writeUnsignedShort(writeBuffer, 8));
+
+    // Const Field (length)
+    writeConstField("length", LENGTH, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (syntaxId)
+    writeSimpleEnumField(
+        "syntaxId",
+        "SyntaxIdType",
+        syntaxId,
+        new DataWriterEnumDefault<>(
+            SyntaxIdType::getValue, SyntaxIdType::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (queryType)
+    writeSimpleEnumField(
+        "queryType",
+        "QueryType",
+        queryType,
+        new DataWriterEnumDefault<>(
+            QueryType::getValue, QueryType::name, writeUnsignedShort(writeBuffer, 8)));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x34, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (alarmType)
+    writeSimpleEnumField(
+        "alarmType",
+        "AlarmType",
+        alarmType,
+        new DataWriterEnumDefault<>(
+            AlarmType::getValue, AlarmType::name, writeUnsignedShort(writeBuffer, 8)));
+
+    writeBuffer.popContext("S7MessageObjectRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7MessageObjectRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (variableSpec)
+    lengthInBits += 8;
+
+    // Const Field (length)
+    lengthInBits += 8;
+
+    // Simple field (syntaxId)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Simple field (queryType)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Simple field (alarmType)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static S7DataAlarmMessageBuilder staticParseS7DataAlarmMessageBuilder(
+      ReadBuffer readBuffer, Byte cpuFunctionType) throws ParseException {
+    readBuffer.pullContext("S7MessageObjectRequest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short variableSpec =
+        readConstField(
+            "variableSpec", readUnsignedShort(readBuffer, 8), S7MessageObjectRequest.VARIABLESPEC);
+
+    short length =
+        readConstField("length", readUnsignedShort(readBuffer, 8), S7MessageObjectRequest.LENGTH);
+
+    SyntaxIdType syntaxId =
+        readEnumField(
+            "syntaxId",
+            "SyntaxIdType",
+            new DataReaderEnumDefault<>(
+                SyntaxIdType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    QueryType queryType =
+        readEnumField(
+            "queryType",
+            "QueryType",
+            new DataReaderEnumDefault<>(QueryType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    Short reservedField1 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x34);
+
+    AlarmType alarmType =
+        readEnumField(
+            "alarmType",
+            "AlarmType",
+            new DataReaderEnumDefault<>(AlarmType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    readBuffer.closeContext("S7MessageObjectRequest");
+    // Create the instance
+    return new S7MessageObjectRequestBuilderImpl(syntaxId, queryType, alarmType);
+  }
+
+  public static class S7MessageObjectRequestBuilderImpl
+      implements S7DataAlarmMessage.S7DataAlarmMessageBuilder {
+    private final SyntaxIdType syntaxId;
+    private final QueryType queryType;
+    private final AlarmType alarmType;
+
+    public S7MessageObjectRequestBuilderImpl(
+        SyntaxIdType syntaxId, QueryType queryType, AlarmType alarmType) {
+      this.syntaxId = syntaxId;
+      this.queryType = queryType;
+      this.alarmType = alarmType;
+    }
+
+    public S7MessageObjectRequest build() {
+      S7MessageObjectRequest s7MessageObjectRequest =
+          new S7MessageObjectRequest(syntaxId, queryType, alarmType);
+      return s7MessageObjectRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7MessageObjectRequest)) {
+      return false;
+    }
+    S7MessageObjectRequest that = (S7MessageObjectRequest) o;
+    return (getSyntaxId() == that.getSyntaxId())
+        && (getQueryType() == that.getQueryType())
+        && (getAlarmType() == that.getAlarmType())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSyntaxId(), getQueryType(), getAlarmType());
+  }
+
+  @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/S7MessageObjectResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java
new file mode 100644
index 0000000000..812a27a0bc
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java
@@ -0,0 +1,196 @@
+/*
+ * 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 S7MessageObjectResponse extends S7DataAlarmMessage implements Message {
+
+  // Accessors for discriminator values.
+  public Byte getCpuFunctionType() {
+    return (byte) 0x08;
+  }
+
+  // Properties.
+  protected final DataTransportErrorCode returnCode;
+  protected final DataTransportSize transportSize;
+
+  public S7MessageObjectResponse(
+      DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+    super();
+    this.returnCode = returnCode;
+    this.transportSize = transportSize;
+  }
+
+  public DataTransportErrorCode getReturnCode() {
+    return returnCode;
+  }
+
+  public DataTransportSize getTransportSize() {
+    return transportSize;
+  }
+
+  @Override
+  protected void serializeS7DataAlarmMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7MessageObjectResponse");
+
+    // Simple Field (returnCode)
+    writeSimpleEnumField(
+        "returnCode",
+        "DataTransportErrorCode",
+        returnCode,
+        new DataWriterEnumDefault<>(
+            DataTransportErrorCode::getValue,
+            DataTransportErrorCode::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Simple Field (transportSize)
+    writeSimpleEnumField(
+        "transportSize",
+        "DataTransportSize",
+        transportSize,
+        new DataWriterEnumDefault<>(
+            DataTransportSize::getValue,
+            DataTransportSize::name,
+            writeUnsignedShort(writeBuffer, 8)));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("S7MessageObjectResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7MessageObjectResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (returnCode)
+    lengthInBits += 8;
+
+    // Simple field (transportSize)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static S7DataAlarmMessageBuilder staticParseS7DataAlarmMessageBuilder(
+      ReadBuffer readBuffer, Byte cpuFunctionType) throws ParseException {
+    readBuffer.pullContext("S7MessageObjectResponse");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    DataTransportErrorCode returnCode =
+        readEnumField(
+            "returnCode",
+            "DataTransportErrorCode",
+            new DataReaderEnumDefault<>(
+                DataTransportErrorCode::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    DataTransportSize transportSize =
+        readEnumField(
+            "transportSize",
+            "DataTransportSize",
+            new DataReaderEnumDefault<>(
+                DataTransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    readBuffer.closeContext("S7MessageObjectResponse");
+    // Create the instance
+    return new S7MessageObjectResponseBuilderImpl(returnCode, transportSize);
+  }
+
+  public static class S7MessageObjectResponseBuilderImpl
+      implements S7DataAlarmMessage.S7DataAlarmMessageBuilder {
+    private final DataTransportErrorCode returnCode;
+    private final DataTransportSize transportSize;
+
+    public S7MessageObjectResponseBuilderImpl(
+        DataTransportErrorCode returnCode, DataTransportSize transportSize) {
+      this.returnCode = returnCode;
+      this.transportSize = transportSize;
+    }
+
+    public S7MessageObjectResponse build() {
+      S7MessageObjectResponse s7MessageObjectResponse =
+          new S7MessageObjectResponse(returnCode, transportSize);
+      return s7MessageObjectResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7MessageObjectResponse)) {
+      return false;
+    }
+    S7MessageObjectResponse that = (S7MessageObjectResponse) o;
+    return (getReturnCode() == that.getReturnCode())
+        && (getTransportSize() == that.getTransportSize())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getReturnCode(), getTransportSize());
+  }
+
+  @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/S7MessageRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageRequest.java
new file mode 100644
index 0000000000..d7f55537d4
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageRequest.java
@@ -0,0 +1,120 @@
+/*
+ * 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 S7MessageRequest extends S7Message implements Message {
+
+  // Accessors for discriminator values.
+  public Short getMessageType() {
+    return (short) 0x01;
+  }
+
+  public S7MessageRequest(int tpduReference, S7Parameter parameter, S7Payload payload) {
+    super(tpduReference, parameter, payload);
+  }
+
+  @Override
+  protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7MessageRequest");
+
+    writeBuffer.popContext("S7MessageRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7MessageRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    return lengthInBits;
+  }
+
+  public static S7MessageBuilder staticParseS7MessageBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("S7MessageRequest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    readBuffer.closeContext("S7MessageRequest");
+    // Create the instance
+    return new S7MessageRequestBuilderImpl();
+  }
+
+  public static class S7MessageRequestBuilderImpl implements S7Message.S7MessageBuilder {
+
+    public S7MessageRequestBuilderImpl() {}
+
+    public S7MessageRequest build(int tpduReference, S7Parameter parameter, S7Payload payload) {
+      S7MessageRequest s7MessageRequest = new S7MessageRequest(tpduReference, parameter, payload);
+      return s7MessageRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7MessageRequest)) {
+      return false;
+    }
+    S7MessageRequest that = (S7MessageRequest) o;
+    return super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode());
+  }
+
+  @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/S7MessageResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponse.java
new file mode 100644
index 0000000000..c32725f02a
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponse.java
@@ -0,0 +1,164 @@
+/*
+ * 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 S7MessageResponse extends S7Message implements Message {
+
+  // Accessors for discriminator values.
+  public Short getMessageType() {
+    return (short) 0x02;
+  }
+
+  // Properties.
+  protected final short errorClass;
+  protected final short errorCode;
+
+  public S7MessageResponse(
+      int tpduReference,
+      S7Parameter parameter,
+      S7Payload payload,
+      short errorClass,
+      short errorCode) {
+    super(tpduReference, parameter, payload);
+    this.errorClass = errorClass;
+    this.errorCode = errorCode;
+  }
+
+  public short getErrorClass() {
+    return errorClass;
+  }
+
+  public short getErrorCode() {
+    return errorCode;
+  }
+
+  @Override
+  protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7MessageResponse");
+
+    // Simple Field (errorClass)
+    writeSimpleField("errorClass", errorClass, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (errorCode)
+    writeSimpleField("errorCode", errorCode, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("S7MessageResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7MessageResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (errorClass)
+    lengthInBits += 8;
+
+    // Simple field (errorCode)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static S7MessageBuilder staticParseS7MessageBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("S7MessageResponse");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short errorClass = readSimpleField("errorClass", readUnsignedShort(readBuffer, 8));
+
+    short errorCode = readSimpleField("errorCode", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("S7MessageResponse");
+    // Create the instance
+    return new S7MessageResponseBuilderImpl(errorClass, errorCode);
+  }
+
+  public static class S7MessageResponseBuilderImpl implements S7Message.S7MessageBuilder {
+    private final short errorClass;
+    private final short errorCode;
+
+    public S7MessageResponseBuilderImpl(short errorClass, short errorCode) {
+      this.errorClass = errorClass;
+      this.errorCode = errorCode;
+    }
+
+    public S7MessageResponse build(int tpduReference, S7Parameter parameter, S7Payload payload) {
+      S7MessageResponse s7MessageResponse =
+          new S7MessageResponse(tpduReference, parameter, payload, errorClass, errorCode);
+      return s7MessageResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7MessageResponse)) {
+      return false;
+    }
+    S7MessageResponse that = (S7MessageResponse) o;
+    return (getErrorClass() == that.getErrorClass())
+        && (getErrorCode() == that.getErrorCode())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getErrorClass(), getErrorCode());
+  }
+
+  @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/S7MessageResponseData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponseData.java
new file mode 100644
index 0000000000..a4e957df96
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponseData.java
@@ -0,0 +1,165 @@
+/*
+ * 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 S7MessageResponseData extends S7Message implements Message {
+
+  // Accessors for discriminator values.
+  public Short getMessageType() {
+    return (short) 0x03;
+  }
+
+  // Properties.
+  protected final short errorClass;
+  protected final short errorCode;
+
+  public S7MessageResponseData(
+      int tpduReference,
+      S7Parameter parameter,
+      S7Payload payload,
+      short errorClass,
+      short errorCode) {
+    super(tpduReference, parameter, payload);
+    this.errorClass = errorClass;
+    this.errorCode = errorCode;
+  }
+
+  public short getErrorClass() {
+    return errorClass;
+  }
+
+  public short getErrorCode() {
+    return errorCode;
+  }
+
+  @Override
+  protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7MessageResponseData");
+
+    // Simple Field (errorClass)
+    writeSimpleField("errorClass", errorClass, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (errorCode)
+    writeSimpleField("errorCode", errorCode, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("S7MessageResponseData");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7MessageResponseData _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (errorClass)
+    lengthInBits += 8;
+
+    // Simple field (errorCode)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static S7MessageBuilder staticParseS7MessageBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("S7MessageResponseData");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short errorClass = readSimpleField("errorClass", readUnsignedShort(readBuffer, 8));
+
+    short errorCode = readSimpleField("errorCode", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("S7MessageResponseData");
+    // Create the instance
+    return new S7MessageResponseDataBuilderImpl(errorClass, errorCode);
+  }
+
+  public static class S7MessageResponseDataBuilderImpl implements S7Message.S7MessageBuilder {
+    private final short errorClass;
+    private final short errorCode;
+
+    public S7MessageResponseDataBuilderImpl(short errorClass, short errorCode) {
+      this.errorClass = errorClass;
+      this.errorCode = errorCode;
+    }
+
+    public S7MessageResponseData build(
+        int tpduReference, S7Parameter parameter, S7Payload payload) {
+      S7MessageResponseData s7MessageResponseData =
+          new S7MessageResponseData(tpduReference, parameter, payload, errorClass, errorCode);
+      return s7MessageResponseData;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7MessageResponseData)) {
+      return false;
+    }
+    S7MessageResponseData that = (S7MessageResponseData) o;
+    return (getErrorClass() == that.getErrorClass())
+        && (getErrorCode() == that.getErrorCode())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getErrorClass(), getErrorCode());
+  }
+
+  @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/S7MessageUserData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageUserData.java
new file mode 100644
index 0000000000..93c380103c
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageUserData.java
@@ -0,0 +1,121 @@
+/*
+ * 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 S7MessageUserData extends S7Message implements Message {
+
+  // Accessors for discriminator values.
+  public Short getMessageType() {
+    return (short) 0x07;
+  }
+
+  public S7MessageUserData(int tpduReference, S7Parameter parameter, S7Payload payload) {
+    super(tpduReference, parameter, payload);
+  }
+
+  @Override
+  protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7MessageUserData");
+
+    writeBuffer.popContext("S7MessageUserData");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7MessageUserData _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    return lengthInBits;
+  }
+
+  public static S7MessageBuilder staticParseS7MessageBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("S7MessageUserData");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    readBuffer.closeContext("S7MessageUserData");
+    // Create the instance
+    return new S7MessageUserDataBuilderImpl();
+  }
+
+  public static class S7MessageUserDataBuilderImpl implements S7Message.S7MessageBuilder {
+
+    public S7MessageUserDataBuilderImpl() {}
+
+    public S7MessageUserData build(int tpduReference, S7Parameter parameter, S7Payload payload) {
+      S7MessageUserData s7MessageUserData =
+          new S7MessageUserData(tpduReference, parameter, payload);
+      return s7MessageUserData;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7MessageUserData)) {
+      return false;
+    }
+    S7MessageUserData that = (S7MessageUserData) o;
+    return super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode());
+  }
+
+  @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/S7Parameter.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Parameter.java
new file mode 100644
index 0000000000..d02b952230
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Parameter.java
@@ -0,0 +1,187 @@
+/*
+ * 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 S7Parameter implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getMessageType();
+
+  public abstract Short getParameterType();
+
+  public S7Parameter() {
+    super();
+  }
+
+  protected abstract void serializeS7ParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7Parameter");
+
+    // Discriminator Field (parameterType) (Used as input to a switch field)
+    writeDiscriminatorField(
+        "parameterType", getParameterType(), writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeS7ParameterChild(writeBuffer);
+
+    writeBuffer.popContext("S7Parameter");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    S7Parameter _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (parameterType)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static S7Parameter staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    if ((args == null) || (args.length != 1)) {
+      throw new PlcRuntimeException(
+          "Wrong number of arguments, expected 1, but got " + args.length);
+    }
+    Short messageType;
+    if (args[0] instanceof Short) {
+      messageType = (Short) args[0];
+    } else if (args[0] instanceof String) {
+      messageType = Short.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type Short or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, messageType);
+  }
+
+  public static S7Parameter staticParse(ReadBuffer readBuffer, Short messageType)
+      throws ParseException {
+    readBuffer.pullContext("S7Parameter");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short parameterType = readDiscriminatorField("parameterType", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    S7ParameterBuilder builder = null;
+    if (EvaluationHelper.equals(parameterType, (short) 0xF0)) {
+      builder =
+          S7ParameterSetupCommunication.staticParseS7ParameterBuilder(readBuffer, messageType);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0x04)
+        && EvaluationHelper.equals(messageType, (short) 0x01)) {
+      builder = S7ParameterReadVarRequest.staticParseS7ParameterBuilder(readBuffer, messageType);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0x04)
+        && EvaluationHelper.equals(messageType, (short) 0x03)) {
+      builder = S7ParameterReadVarResponse.staticParseS7ParameterBuilder(readBuffer, messageType);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0x05)
+        && EvaluationHelper.equals(messageType, (short) 0x01)) {
+      builder = S7ParameterWriteVarRequest.staticParseS7ParameterBuilder(readBuffer, messageType);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0x05)
+        && EvaluationHelper.equals(messageType, (short) 0x03)) {
+      builder = S7ParameterWriteVarResponse.staticParseS7ParameterBuilder(readBuffer, messageType);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0x00)
+        && EvaluationHelper.equals(messageType, (short) 0x07)) {
+      builder = S7ParameterUserData.staticParseS7ParameterBuilder(readBuffer, messageType);
+    } else if (EvaluationHelper.equals(parameterType, (short) 0x01)
+        && EvaluationHelper.equals(messageType, (short) 0x07)) {
+      builder = S7ParameterModeTransition.staticParseS7ParameterBuilder(readBuffer, messageType);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "parameterType="
+              + parameterType
+              + " "
+              + "messageType="
+              + messageType
+              + "]");
+    }
+
+    readBuffer.closeContext("S7Parameter");
+    // Create the instance
+    S7Parameter _s7Parameter = builder.build();
+    return _s7Parameter;
+  }
+
+  public interface S7ParameterBuilder {
+    S7Parameter build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof S7Parameter)) {
+      return false;
+    }
+    S7Parameter that = (S7Parameter) o;
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash();
+  }
+
+  @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/S7ParameterModeTransition.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java
new file mode 100644
index 0000000000..8858e89a02
--- /dev/null
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.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 S7ParameterModeTransition extends S7Parameter implements Message {
+
+  // Accessors for discriminator values.
+  public Short getParameterType() {
+    return (short) 0x01;
+  }
+
+  public Short getMessageType() {
+    return (short) 0x07;
+  }
+
+  // Properties.
+  protected final short method;
+  protected final byte cpuFunctionType;
+  protected final byte cpuFunctionGroup;
+  protected final short currentMode;
+  protected final short sequenceNumber;
+
+  public S7ParameterModeTransition(
+      short method,
+      byte cpuFunctionType,
+      byte cpuFunctionGroup,
+      short currentMode,
+      short sequenceNumber) {
+    super();
+    this.method = method;
+    this.cpuFunctionType = cpuFunctionType;
+    this.cpuFunctionGroup = cpuFunctionGroup;
+    this.currentMode = currentMode;
+    this.sequenceNumber = sequenceNumber;
+  }
+
+  public short getMethod() {
+    return method;
+  }
+
+  public byte getCpuFunctionType() {
+    return cpuFunctionType;
+  }
+
+  public byte getCpuFunctionGroup() {
+    return cpuFunctionGroup;
+  }
+
+  public short getCurrentMode() {
+    return currentMode;
+  }
+
+  public short getSequenceNumber() {
+    return sequenceNumber;
+  }
+
+  @Override
+  protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("S7ParameterModeTransition");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (int) 0x0010, writeUnsignedInt(writeBuffer, 16));
+
+    // Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    short itemLength = (short) ((getLengthInBytes()) - (2));
+    writeImplicitField("itemLength", itemLength, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (method)
+    writeSimpleField("method", method, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (cpuFunctionType)
+    writeSimpleField("cpuFunctionType", cpuFunctionType, writeUnsignedByte(writeBuffer, 4));
+
+    // Simple Field (cpuFunctionGroup)
+    writeSimpleField("cpuFunctionGroup", cpuFunctionGroup, writeUnsignedByte(writeBuffer, 4));
+
+    // Simple Field (currentMode)
+    writeSimpleField("currentMode", currentMode, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (sequenceNumber)
+    writeSimpleField("sequenceNumber", sequenceNumber, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("S7ParameterModeTransition");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    S7ParameterModeTransition _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 16;
+
+    // Implicit Field (itemLength)
+    lengthInBits += 8;
+
+    // Simple field (method)
+    lengthInBits += 8;
+
+    // Simple field (cpuFunctionType)
+    lengthInBits += 4;
+
+    // Simple field (cpuFunctionGroup)
+    lengthInBits += 4;
+
+    // Simple field (currentMode)
+    lengthInBits += 8;
+
+    // Simple field (sequenceNumber)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static S7ParameterBuilder staticParseS7ParameterBuilder(
+      ReadBuffer readBuffer, Short messageType) throws ParseException {
+    readBuffer.pullContext("S7ParameterModeTransition");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Integer reservedField0 =
+        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0010);
+
+    short itemLength = readImplicitField("itemLength", readUnsignedShort(readBuffer, 8));
+
+    short method = readSimpleField("method", readUnsignedShort(readBuffer, 8));
+
+    byte cpuFunctionType = readSimpleField("cpuFunctionType", readUnsignedByte(readBuffer, 4));
+
+    byte cpuFunctionGroup = readSimpleField("cpuFunctionGroup", readUnsignedByte(readBuffer, 4));
+
+    short currentMode = readSimpleField("currentMode", readUnsignedShort(readBuffer, 8));
+
+    short sequenceNumber = readSimpleField("sequenceNumber", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("S7ParameterModeTransition");
+    // Create the instance
+    return new S7ParameterModeTransitionBuilderImpl(
+        method, cpuFunctionType, cpuFunctionGroup, currentMode, sequenceNumber);
+  }
+
+  public static class S7ParameterModeTransitionBuilderImpl
+      implements S7Parameter.S7ParameterBuilder {
+    private final short method;
+    private final byte cpuFunctionType;
+    private final byte cpuFunctionGroup;
+    private final short currentMode;
+    private final short sequenceNumber;
+
+    public S7ParameterModeTransitionBuilderImpl(
+        short method,
+        byte cpuFunctionType,
+        byte cpuFunctionGroup,
+        short currentMode,
+        short sequenceNumber) {
+      this.method = method;
+      this.cpuFunctionType = cpuFunctionType;
+      this.cpuFunctionGroup = cpuFunctionGroup;
+      this.currentMode = currentMode;
+      this.sequenceNumber = sequenceNumber;
+    }
+
... 11966 lines suppressed ...