You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2023/01/23 21:08:06 UTC

[plc4x] branch develop updated: feat(plc4j/driver/open-protocol): Implemented a rough skeleton for an open-protocol driver (Not functional yet ... It just compiles the mspec generated types)

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new e3cbcdf4ae feat(plc4j/driver/open-protocol): Implemented a rough skeleton for an open-protocol driver (Not functional yet ... It just compiles the mspec generated types)
e3cbcdf4ae is described below

commit e3cbcdf4aeea7991e934cdcac664d85bacbd391c
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Jan 23 22:07:57 2023 +0100

    feat(plc4j/driver/open-protocol): Implemented a rough skeleton for an open-protocol driver (Not functional yet ... It just compiles the mspec generated types)
---
 plc4j/drivers/open-protocol/pom.xml                | 175 ++++++++
 ...licationCommunicationStartAcknowledgeBlock.java | 203 +++++++++
 ...onCommunicationStartAcknowledgeBlockCellId.java | 150 +++++++
 ...ommunicationStartAcknowledgeBlockChannelId.java | 153 +++++++
 ...CommunicationStartAcknowledgeBlockClientId.java | 153 +++++++
 ...icationStartAcknowledgeBlockControllerName.java | 154 +++++++
 ...tartAcknowledgeBlockControllerSerialNumber.java | 159 +++++++
 ...tAcknowledgeBlockControllerSoftwareVersion.java | 165 +++++++
 ...tartAcknowledgeBlockLinkingHandlingSupport.java | 171 +++++++
 ...onStartAcknowledgeBlockOpenProtocolVersion.java | 159 +++++++
 ...nCommunicationStartAcknowledgeBlockRbuType.java | 149 +++++++
 ...StartAcknowledgeBlockSequenceNumberSupport.java | 171 +++++++
 ...ommunicationStartAcknowledgeBlockStationId.java | 149 +++++++
 ...municationStartAcknowledgeBlockStationName.java | 153 +++++++
 ...unicationStartAcknowledgeBlockSupplierCode.java | 153 +++++++
 ...nicationStartAcknowledgeBlockSystemSubtype.java | 153 +++++++
 ...mmunicationStartAcknowledgeBlockSystemType.java | 149 +++++++
 ...onStartAcknowledgeBlockToolSoftwareVersion.java | 159 +++++++
 .../java/openprotocol/readwrite/Constants.java     | 126 ++++++
 .../plc4x/java/openprotocol/readwrite/Error.java   | 142 ++++++
 .../plc4x/java/openprotocol/readwrite/Mid.java     | 239 ++++++++++
 .../java/openprotocol/readwrite/MidTypes.java      |  74 ++++
 .../readwrite/OpenProtocolMessage.java             | 373 ++++++++++++++++
 ...nProtocolMessageApplicationCommandAccepted.java | 183 ++++++++
 ...OpenProtocolMessageApplicationCommandError.java | 213 +++++++++
 ...otocolMessageApplicationCommunicationStart.java | 154 +++++++
 ...geApplicationCommunicationStartAcknowledge.java | 190 ++++++++
 ...rotocolMessageApplicationCommunicationStop.java | 154 +++++++
 ...otocolMessageApplicationGenericDataRequest.java | 250 +++++++++++
 .../readwrite/OpenProtocolRevision.java            |  88 ++++
 .../java/openprotocol/OpenProtocolDriver.java      | 130 ++++++
 .../config/OpenProtocolConfiguration.java          |  38 ++
 .../protocol/OpenProtocolProtocolLogic.java        |  76 ++++
 .../java/openprotocol/tag/OpenProtocolTag.java     |  48 ++
 .../openprotocol/tag/OpenProtocolTagHandler.java   |  38 ++
 .../services/org.apache.plc4x.java.api.PlcDriver   |  19 +
 plc4j/drivers/pom.xml                              |   1 +
 .../protocols/openprotocol/open-protocol.mspec     | 490 ++++++++++-----------
 38 files changed, 5659 insertions(+), 245 deletions(-)

diff --git a/plc4j/drivers/open-protocol/pom.xml b/plc4j/drivers/open-protocol/pom.xml
new file mode 100644
index 0000000000..4ba4128eef
--- /dev/null
+++ b/plc4j/drivers/open-protocol/pom.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4j-drivers</artifactId>
+    <version>0.11.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>plc4j-driver-open-protocol</artifactId>
+  <name>PLC4J: Driver: Open-Protocol</name>
+  <description>Implementation of a PLC4X driver for the Open-Protocol protocol.</description>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.plc4x.plugins</groupId>
+        <artifactId>plc4x-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>generate-driver</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>generate-driver</goal>
+            </goals>
+            <configuration>
+              <protocolName>open-protocol</protocolName>
+              <languageName>java</languageName>
+              <outputFlavor>read-write</outputFlavor>
+              <outputDir>src/main/generated</outputDir>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.karaf.tooling</groupId>
+        <artifactId>karaf-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>generate-feature-xml</id>
+            <phase>compile</phase>
+            <goals>
+              <!-- Generate the feature.xml -->
+              <goal>features-generate-descriptor</goal>
+              <!-- Check the feature.xml -->
+              <goal>verify</goal>
+            </goals>
+            <configuration>
+              <enableGeneration>true</enableGeneration>
+              <aggregateFeatures>true</aggregateFeatures>
+            </configuration>
+          </execution>
+          <execution>
+            <id>build-kar</id>
+            <phase>package</phase>
+            <goals>
+              <!--
+                Build a kar archive (Jar containing the feature.xml
+                as well as the module content and it's dependencies.
+              -->
+              <goal>kar</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
+            <Bundle-Activator>org.apache.plc4x.java.osgi.DriverActivator</Bundle-Activator>
+            <Export-Service>org.apache.plc4x.java.api.PlcDriver,org.apache.plc4x.java.modbus.tcp.ModbusTcpDriver</Export-Service>
+            <Import-Package>
+              com.fasterxml.jackson.annotation;resolution:=optional,
+              *
+            </Import-Package>
+          </instructions>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4j-transport-serial</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4x-code-generation-language-java</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4x-protocols-open-protocol</usedDependency>
+          </usedDependencies>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-api</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-spi</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-transport-tcp</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-transport-serial</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-buffer</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-utils-test-utils</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-code-generation-language-java</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+      <!-- Scope is 'provided' as this way it's not shipped with the driver -->
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-protocols-open-protocol</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+      <!-- Scope is 'provided' as this way it's not shipped with the driver -->
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-protocols-open-protocol</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+      <classifier>tests</classifier>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlock.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlock.java
new file mode 100644
index 0000000000..e4f6a33adf
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlock.java
@@ -0,0 +1,203 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Integer getBlockType();
+
+  public ApplicationCommunicationStartAcknowledgeBlock() {
+    super();
+  }
+
+  protected abstract void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlock");
+
+    // Discriminator Field (blockType) (Used as input to a switch field)
+    writeDiscriminatorField("blockType", getBlockType(), writeUnsignedInt(writeBuffer, 16));
+
+    // Switch field (Serialize the sub-type)
+    serializeApplicationCommunicationStartAcknowledgeBlockChild(writeBuffer);
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlock");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ApplicationCommunicationStartAcknowledgeBlock _value = this;
+
+    // Discriminator Field (blockType)
+    lengthInBits += 16;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlock staticParse(
+      ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlock staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlock");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    int blockType =
+        readDiscriminatorField(
+            "blockType", readUnsignedInt(readBuffer, 16), WithOption.WithEncoding("AsciiUint"));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    ApplicationCommunicationStartAcknowledgeBlockBuilder builder = null;
+    if (EvaluationHelper.equals(blockType, (int) 1)) {
+      builder = ApplicationCommunicationStartAcknowledgeBlockCellId.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 2)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockChannelId.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 3)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockControllerName.staticParseBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 4)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockSupplierCode.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 5)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion.staticParseBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 6)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion.staticParseBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 7)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion.staticParseBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 8)) {
+      builder = ApplicationCommunicationStartAcknowledgeBlockRbuType.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 9)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber.staticParseBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 10)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockSystemType.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 11)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockSystemSubtype.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 12)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport.staticParseBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 13)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport.staticParseBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 14)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockStationId.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 15)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockStationName.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(blockType, (int) 16)) {
+      builder =
+          ApplicationCommunicationStartAcknowledgeBlockClientId.staticParseBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "blockType="
+              + blockType
+              + "]");
+    }
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlock");
+    // Create the instance
+    ApplicationCommunicationStartAcknowledgeBlock _applicationCommunicationStartAcknowledgeBlock =
+        builder.build();
+    return _applicationCommunicationStartAcknowledgeBlock;
+  }
+
+  public static interface ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    ApplicationCommunicationStartAcknowledgeBlock build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlock)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlock that =
+        (ApplicationCommunicationStartAcknowledgeBlock) 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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockCellId.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockCellId.java
new file mode 100644
index 0000000000..b74b70fc2c
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockCellId.java
@@ -0,0 +1,150 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockCellId
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 1;
+  }
+
+  // Properties.
+  protected final long cellId;
+
+  public ApplicationCommunicationStartAcknowledgeBlockCellId(long cellId) {
+    super();
+    this.cellId = cellId;
+  }
+
+  public long getCellId() {
+    return cellId;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockCellId");
+
+    // Simple Field (cellId)
+    writeSimpleField(
+        "cellId", cellId, writeUnsignedLong(writeBuffer, 32), WithOption.WithEncoding("AsciiUint"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockCellId");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockCellId _value = this;
+
+    // Simple field (cellId)
+    lengthInBits += 32;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockCellIdBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockCellId");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    long cellId =
+        readSimpleField(
+            "cellId", readUnsignedLong(readBuffer, 32), WithOption.WithEncoding("AsciiUint"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockCellId");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockCellIdBuilder(cellId);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockCellIdBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final long cellId;
+
+    public ApplicationCommunicationStartAcknowledgeBlockCellIdBuilder(long cellId) {
+
+      this.cellId = cellId;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockCellId build() {
+      ApplicationCommunicationStartAcknowledgeBlockCellId
+          applicationCommunicationStartAcknowledgeBlockCellId =
+              new ApplicationCommunicationStartAcknowledgeBlockCellId(cellId);
+      return applicationCommunicationStartAcknowledgeBlockCellId;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockCellId)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockCellId that =
+        (ApplicationCommunicationStartAcknowledgeBlockCellId) o;
+    return (getCellId() == that.getCellId()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getCellId());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockChannelId.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockChannelId.java
new file mode 100644
index 0000000000..b5103122fa
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockChannelId.java
@@ -0,0 +1,153 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockChannelId
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 2;
+  }
+
+  // Properties.
+  protected final int channelId;
+
+  public ApplicationCommunicationStartAcknowledgeBlockChannelId(int channelId) {
+    super();
+    this.channelId = channelId;
+  }
+
+  public int getChannelId() {
+    return channelId;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockChannelId");
+
+    // Simple Field (channelId)
+    writeSimpleField(
+        "channelId",
+        channelId,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithEncoding("AsciiUint"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockChannelId");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockChannelId _value = this;
+
+    // Simple field (channelId)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockChannelIdBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockChannelId");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    int channelId =
+        readSimpleField(
+            "channelId", readUnsignedInt(readBuffer, 16), WithOption.WithEncoding("AsciiUint"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockChannelId");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockChannelIdBuilder(channelId);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockChannelIdBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final int channelId;
+
+    public ApplicationCommunicationStartAcknowledgeBlockChannelIdBuilder(int channelId) {
+
+      this.channelId = channelId;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockChannelId build() {
+      ApplicationCommunicationStartAcknowledgeBlockChannelId
+          applicationCommunicationStartAcknowledgeBlockChannelId =
+              new ApplicationCommunicationStartAcknowledgeBlockChannelId(channelId);
+      return applicationCommunicationStartAcknowledgeBlockChannelId;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockChannelId)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockChannelId that =
+        (ApplicationCommunicationStartAcknowledgeBlockChannelId) o;
+    return (getChannelId() == that.getChannelId()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getChannelId());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockClientId.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockClientId.java
new file mode 100644
index 0000000000..1f7efac0b8
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockClientId.java
@@ -0,0 +1,153 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockClientId
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 16;
+  }
+
+  // Properties.
+  protected final short clientId;
+
+  public ApplicationCommunicationStartAcknowledgeBlockClientId(short clientId) {
+    super();
+    this.clientId = clientId;
+  }
+
+  public short getClientId() {
+    return clientId;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockClientId");
+
+    // Simple Field (clientId)
+    writeSimpleField(
+        "clientId",
+        clientId,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithEncoding("AsciiUint"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockClientId");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockClientId _value = this;
+
+    // Simple field (clientId)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockClientIdBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockClientId");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    short clientId =
+        readSimpleField(
+            "clientId", readUnsignedShort(readBuffer, 8), WithOption.WithEncoding("AsciiUint"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockClientId");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockClientIdBuilder(clientId);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockClientIdBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final short clientId;
+
+    public ApplicationCommunicationStartAcknowledgeBlockClientIdBuilder(short clientId) {
+
+      this.clientId = clientId;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockClientId build() {
+      ApplicationCommunicationStartAcknowledgeBlockClientId
+          applicationCommunicationStartAcknowledgeBlockClientId =
+              new ApplicationCommunicationStartAcknowledgeBlockClientId(clientId);
+      return applicationCommunicationStartAcknowledgeBlockClientId;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockClientId)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockClientId that =
+        (ApplicationCommunicationStartAcknowledgeBlockClientId) o;
+    return (getClientId() == that.getClientId()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getClientId());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerName.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerName.java
new file mode 100644
index 0000000000..d275d266e9
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerName.java
@@ -0,0 +1,154 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockControllerName
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 3;
+  }
+
+  // Properties.
+  protected final String controllerName;
+
+  public ApplicationCommunicationStartAcknowledgeBlockControllerName(String controllerName) {
+    super();
+    this.controllerName = controllerName;
+  }
+
+  public String getControllerName() {
+    return controllerName;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockControllerName");
+
+    // Simple Field (controllerName)
+    writeSimpleField(
+        "controllerName",
+        controllerName,
+        writeString(writeBuffer, 200),
+        WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockControllerName");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockControllerName _value = this;
+
+    // Simple field (controllerName)
+    lengthInBits += 200;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockControllerNameBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockControllerName");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String controllerName =
+        readSimpleField(
+            "controllerName", readString(readBuffer, 200), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockControllerName");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockControllerNameBuilder(controllerName);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockControllerNameBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String controllerName;
+
+    public ApplicationCommunicationStartAcknowledgeBlockControllerNameBuilder(
+        String controllerName) {
+
+      this.controllerName = controllerName;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockControllerName build() {
+      ApplicationCommunicationStartAcknowledgeBlockControllerName
+          applicationCommunicationStartAcknowledgeBlockControllerName =
+              new ApplicationCommunicationStartAcknowledgeBlockControllerName(controllerName);
+      return applicationCommunicationStartAcknowledgeBlockControllerName;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockControllerName)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockControllerName that =
+        (ApplicationCommunicationStartAcknowledgeBlockControllerName) o;
+    return (getControllerName() == that.getControllerName()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getControllerName());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber.java
new file mode 100644
index 0000000000..f5ef2e20d8
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber.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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 9;
+  }
+
+  // Properties.
+  protected final String controllerSerialNumber;
+
+  public ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber(
+      String controllerSerialNumber) {
+    super();
+    this.controllerSerialNumber = controllerSerialNumber;
+  }
+
+  public String getControllerSerialNumber() {
+    return controllerSerialNumber;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber");
+
+    // Simple Field (controllerSerialNumber)
+    writeSimpleField(
+        "controllerSerialNumber",
+        controllerSerialNumber,
+        writeString(writeBuffer, 80),
+        WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber _value = this;
+
+    // Simple field (controllerSerialNumber)
+    lengthInBits += 80;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumberBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String controllerSerialNumber =
+        readSimpleField(
+            "controllerSerialNumber", readString(readBuffer, 80), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumberBuilder(
+        controllerSerialNumber);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumberBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String controllerSerialNumber;
+
+    public ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumberBuilder(
+        String controllerSerialNumber) {
+
+      this.controllerSerialNumber = controllerSerialNumber;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber build() {
+      ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber
+          applicationCommunicationStartAcknowledgeBlockControllerSerialNumber =
+              new ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber(
+                  controllerSerialNumber);
+      return applicationCommunicationStartAcknowledgeBlockControllerSerialNumber;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber that =
+        (ApplicationCommunicationStartAcknowledgeBlockControllerSerialNumber) o;
+    return (getControllerSerialNumber() == that.getControllerSerialNumber())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getControllerSerialNumber());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion.java
new file mode 100644
index 0000000000..e2be9f9585
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion.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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 6;
+  }
+
+  // Properties.
+  protected final String controllerSoftwareVersion;
+
+  public ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion(
+      String controllerSoftwareVersion) {
+    super();
+    this.controllerSoftwareVersion = controllerSoftwareVersion;
+  }
+
+  public String getControllerSoftwareVersion() {
+    return controllerSoftwareVersion;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext(
+        "ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion");
+
+    // Simple Field (controllerSoftwareVersion)
+    writeSimpleField(
+        "controllerSoftwareVersion",
+        controllerSoftwareVersion,
+        writeString(writeBuffer, 152),
+        WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext(
+        "ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion _value = this;
+
+    // Simple field (controllerSoftwareVersion)
+    lengthInBits += 152;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersionBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext(
+        "ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String controllerSoftwareVersion =
+        readSimpleField(
+            "controllerSoftwareVersion",
+            readString(readBuffer, 152),
+            WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext(
+        "ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersionBuilder(
+        controllerSoftwareVersion);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersionBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String controllerSoftwareVersion;
+
+    public ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersionBuilder(
+        String controllerSoftwareVersion) {
+
+      this.controllerSoftwareVersion = controllerSoftwareVersion;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion build() {
+      ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion
+          applicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion =
+              new ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion(
+                  controllerSoftwareVersion);
+      return applicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion that =
+        (ApplicationCommunicationStartAcknowledgeBlockControllerSoftwareVersion) o;
+    return (getControllerSoftwareVersion() == that.getControllerSoftwareVersion())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getControllerSoftwareVersion());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport.java
new file mode 100644
index 0000000000..94fe1027a9
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport.java
@@ -0,0 +1,171 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 13;
+  }
+
+  // Properties.
+  protected final boolean linkingHandlingSupport;
+  // Reserved Fields
+  private Short reservedField0;
+
+  public ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport(
+      boolean linkingHandlingSupport) {
+    super();
+    this.linkingHandlingSupport = linkingHandlingSupport;
+  }
+
+  public boolean getLinkingHandlingSupport() {
+    return linkingHandlingSupport;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport");
+
+    // Reserved Field (reserved)
+    writeReservedField(
+        "reserved",
+        reservedField0 != null ? reservedField0 : (short) 0x00,
+        writeUnsignedShort(writeBuffer, 7));
+
+    // Simple Field (linkingHandlingSupport)
+    writeSimpleField("linkingHandlingSupport", linkingHandlingSupport, writeBoolean(writeBuffer));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport _value = this;
+
+    // Reserved Field (reserved)
+    lengthInBits += 7;
+
+    // Simple field (linkingHandlingSupport)
+    lengthInBits += 1;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupportBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 7), (short) 0x00);
+
+    boolean linkingHandlingSupport =
+        readSimpleField("linkingHandlingSupport", readBoolean(readBuffer));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupportBuilder(
+        linkingHandlingSupport, reservedField0);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupportBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final boolean linkingHandlingSupport;
+    private final Short reservedField0;
+
+    public ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupportBuilder(
+        boolean linkingHandlingSupport, Short reservedField0) {
+      this.linkingHandlingSupport = linkingHandlingSupport;
+      this.reservedField0 = reservedField0;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport build() {
+      ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport
+          applicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport =
+              new ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport(
+                  linkingHandlingSupport);
+      applicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport.reservedField0 =
+          reservedField0;
+      return applicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport that =
+        (ApplicationCommunicationStartAcknowledgeBlockLinkingHandlingSupport) o;
+    return (getLinkingHandlingSupport() == that.getLinkingHandlingSupport())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getLinkingHandlingSupport());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion.java
new file mode 100644
index 0000000000..7ed5d4a2c9
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion.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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 5;
+  }
+
+  // Properties.
+  protected final String openProtocolVersion;
+
+  public ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion(
+      String openProtocolVersion) {
+    super();
+    this.openProtocolVersion = openProtocolVersion;
+  }
+
+  public String getOpenProtocolVersion() {
+    return openProtocolVersion;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion");
+
+    // Simple Field (openProtocolVersion)
+    writeSimpleField(
+        "openProtocolVersion",
+        openProtocolVersion,
+        writeString(writeBuffer, 152),
+        WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion _value = this;
+
+    // Simple field (openProtocolVersion)
+    lengthInBits += 152;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersionBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String openProtocolVersion =
+        readSimpleField(
+            "openProtocolVersion", readString(readBuffer, 152), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersionBuilder(
+        openProtocolVersion);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersionBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String openProtocolVersion;
+
+    public ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersionBuilder(
+        String openProtocolVersion) {
+
+      this.openProtocolVersion = openProtocolVersion;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion build() {
+      ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion
+          applicationCommunicationStartAcknowledgeBlockOpenProtocolVersion =
+              new ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion(
+                  openProtocolVersion);
+      return applicationCommunicationStartAcknowledgeBlockOpenProtocolVersion;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion that =
+        (ApplicationCommunicationStartAcknowledgeBlockOpenProtocolVersion) o;
+    return (getOpenProtocolVersion() == that.getOpenProtocolVersion())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getOpenProtocolVersion());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockRbuType.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockRbuType.java
new file mode 100644
index 0000000000..d1b26a9fca
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockRbuType.java
@@ -0,0 +1,149 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockRbuType
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 8;
+  }
+
+  // Properties.
+  protected final String rbuType;
+
+  public ApplicationCommunicationStartAcknowledgeBlockRbuType(String rbuType) {
+    super();
+    this.rbuType = rbuType;
+  }
+
+  public String getRbuType() {
+    return rbuType;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockRbuType");
+
+    // Simple Field (rbuType)
+    writeSimpleField(
+        "rbuType", rbuType, writeString(writeBuffer, 192), WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockRbuType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockRbuType _value = this;
+
+    // Simple field (rbuType)
+    lengthInBits += 192;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockRbuTypeBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockRbuType");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String rbuType =
+        readSimpleField("rbuType", readString(readBuffer, 192), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockRbuType");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockRbuTypeBuilder(rbuType);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockRbuTypeBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String rbuType;
+
+    public ApplicationCommunicationStartAcknowledgeBlockRbuTypeBuilder(String rbuType) {
+
+      this.rbuType = rbuType;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockRbuType build() {
+      ApplicationCommunicationStartAcknowledgeBlockRbuType
+          applicationCommunicationStartAcknowledgeBlockRbuType =
+              new ApplicationCommunicationStartAcknowledgeBlockRbuType(rbuType);
+      return applicationCommunicationStartAcknowledgeBlockRbuType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockRbuType)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockRbuType that =
+        (ApplicationCommunicationStartAcknowledgeBlockRbuType) o;
+    return (getRbuType() == that.getRbuType()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getRbuType());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport.java
new file mode 100644
index 0000000000..c96be1bf96
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport.java
@@ -0,0 +1,171 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 12;
+  }
+
+  // Properties.
+  protected final boolean sequenceNumberSupport;
+  // Reserved Fields
+  private Short reservedField0;
+
+  public ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport(
+      boolean sequenceNumberSupport) {
+    super();
+    this.sequenceNumberSupport = sequenceNumberSupport;
+  }
+
+  public boolean getSequenceNumberSupport() {
+    return sequenceNumberSupport;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport");
+
+    // Reserved Field (reserved)
+    writeReservedField(
+        "reserved",
+        reservedField0 != null ? reservedField0 : (short) 0x00,
+        writeUnsignedShort(writeBuffer, 7));
+
+    // Simple Field (sequenceNumberSupport)
+    writeSimpleField("sequenceNumberSupport", sequenceNumberSupport, writeBoolean(writeBuffer));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport _value = this;
+
+    // Reserved Field (reserved)
+    lengthInBits += 7;
+
+    // Simple field (sequenceNumberSupport)
+    lengthInBits += 1;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupportBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 7), (short) 0x00);
+
+    boolean sequenceNumberSupport =
+        readSimpleField("sequenceNumberSupport", readBoolean(readBuffer));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupportBuilder(
+        sequenceNumberSupport, reservedField0);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupportBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final boolean sequenceNumberSupport;
+    private final Short reservedField0;
+
+    public ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupportBuilder(
+        boolean sequenceNumberSupport, Short reservedField0) {
+      this.sequenceNumberSupport = sequenceNumberSupport;
+      this.reservedField0 = reservedField0;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport build() {
+      ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport
+          applicationCommunicationStartAcknowledgeBlockSequenceNumberSupport =
+              new ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport(
+                  sequenceNumberSupport);
+      applicationCommunicationStartAcknowledgeBlockSequenceNumberSupport.reservedField0 =
+          reservedField0;
+      return applicationCommunicationStartAcknowledgeBlockSequenceNumberSupport;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport that =
+        (ApplicationCommunicationStartAcknowledgeBlockSequenceNumberSupport) o;
+    return (getSequenceNumberSupport() == that.getSequenceNumberSupport())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSequenceNumberSupport());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockStationId.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockStationId.java
new file mode 100644
index 0000000000..91c3eb72a5
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockStationId.java
@@ -0,0 +1,149 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockStationId
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 14;
+  }
+
+  // Properties.
+  protected final String stationId;
+
+  public ApplicationCommunicationStartAcknowledgeBlockStationId(String stationId) {
+    super();
+    this.stationId = stationId;
+  }
+
+  public String getStationId() {
+    return stationId;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockStationId");
+
+    // Simple Field (stationId)
+    writeSimpleField(
+        "stationId", stationId, writeString(writeBuffer, 80), WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockStationId");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockStationId _value = this;
+
+    // Simple field (stationId)
+    lengthInBits += 80;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockStationIdBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockStationId");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String stationId =
+        readSimpleField("stationId", readString(readBuffer, 80), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockStationId");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockStationIdBuilder(stationId);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockStationIdBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String stationId;
+
+    public ApplicationCommunicationStartAcknowledgeBlockStationIdBuilder(String stationId) {
+
+      this.stationId = stationId;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockStationId build() {
+      ApplicationCommunicationStartAcknowledgeBlockStationId
+          applicationCommunicationStartAcknowledgeBlockStationId =
+              new ApplicationCommunicationStartAcknowledgeBlockStationId(stationId);
+      return applicationCommunicationStartAcknowledgeBlockStationId;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockStationId)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockStationId that =
+        (ApplicationCommunicationStartAcknowledgeBlockStationId) o;
+    return (getStationId() == that.getStationId()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getStationId());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockStationName.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockStationName.java
new file mode 100644
index 0000000000..3e2fb65b4c
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockStationName.java
@@ -0,0 +1,153 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockStationName
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 15;
+  }
+
+  // Properties.
+  protected final String stationName;
+
+  public ApplicationCommunicationStartAcknowledgeBlockStationName(String stationName) {
+    super();
+    this.stationName = stationName;
+  }
+
+  public String getStationName() {
+    return stationName;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockStationName");
+
+    // Simple Field (stationName)
+    writeSimpleField(
+        "stationName",
+        stationName,
+        writeString(writeBuffer, 200),
+        WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockStationName");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockStationName _value = this;
+
+    // Simple field (stationName)
+    lengthInBits += 200;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockStationNameBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockStationName");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String stationName =
+        readSimpleField(
+            "stationName", readString(readBuffer, 200), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockStationName");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockStationNameBuilder(stationName);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockStationNameBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String stationName;
+
+    public ApplicationCommunicationStartAcknowledgeBlockStationNameBuilder(String stationName) {
+
+      this.stationName = stationName;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockStationName build() {
+      ApplicationCommunicationStartAcknowledgeBlockStationName
+          applicationCommunicationStartAcknowledgeBlockStationName =
+              new ApplicationCommunicationStartAcknowledgeBlockStationName(stationName);
+      return applicationCommunicationStartAcknowledgeBlockStationName;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockStationName)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockStationName that =
+        (ApplicationCommunicationStartAcknowledgeBlockStationName) o;
+    return (getStationName() == that.getStationName()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getStationName());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSupplierCode.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSupplierCode.java
new file mode 100644
index 0000000000..18e35b3deb
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSupplierCode.java
@@ -0,0 +1,153 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockSupplierCode
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 4;
+  }
+
+  // Properties.
+  protected final long supplierCode;
+
+  public ApplicationCommunicationStartAcknowledgeBlockSupplierCode(long supplierCode) {
+    super();
+    this.supplierCode = supplierCode;
+  }
+
+  public long getSupplierCode() {
+    return supplierCode;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockSupplierCode");
+
+    // Simple Field (supplierCode)
+    writeSimpleField(
+        "supplierCode",
+        supplierCode,
+        writeUnsignedLong(writeBuffer, 24),
+        WithOption.WithEncoding("AsciiUint"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockSupplierCode");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockSupplierCode _value = this;
+
+    // Simple field (supplierCode)
+    lengthInBits += 24;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockSupplierCodeBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockSupplierCode");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    long supplierCode =
+        readSimpleField(
+            "supplierCode", readUnsignedLong(readBuffer, 24), WithOption.WithEncoding("AsciiUint"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockSupplierCode");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockSupplierCodeBuilder(supplierCode);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockSupplierCodeBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final long supplierCode;
+
+    public ApplicationCommunicationStartAcknowledgeBlockSupplierCodeBuilder(long supplierCode) {
+
+      this.supplierCode = supplierCode;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockSupplierCode build() {
+      ApplicationCommunicationStartAcknowledgeBlockSupplierCode
+          applicationCommunicationStartAcknowledgeBlockSupplierCode =
+              new ApplicationCommunicationStartAcknowledgeBlockSupplierCode(supplierCode);
+      return applicationCommunicationStartAcknowledgeBlockSupplierCode;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockSupplierCode)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockSupplierCode that =
+        (ApplicationCommunicationStartAcknowledgeBlockSupplierCode) o;
+    return (getSupplierCode() == that.getSupplierCode()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSupplierCode());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSystemSubtype.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSystemSubtype.java
new file mode 100644
index 0000000000..ea4c9bd025
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSystemSubtype.java
@@ -0,0 +1,153 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockSystemSubtype
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 11;
+  }
+
+  // Properties.
+  protected final String systemSubtype;
+
+  public ApplicationCommunicationStartAcknowledgeBlockSystemSubtype(String systemSubtype) {
+    super();
+    this.systemSubtype = systemSubtype;
+  }
+
+  public String getSystemSubtype() {
+    return systemSubtype;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockSystemSubtype");
+
+    // Simple Field (systemSubtype)
+    writeSimpleField(
+        "systemSubtype",
+        systemSubtype,
+        writeString(writeBuffer, 24),
+        WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockSystemSubtype");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockSystemSubtype _value = this;
+
+    // Simple field (systemSubtype)
+    lengthInBits += 24;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockSystemSubtypeBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockSystemSubtype");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String systemSubtype =
+        readSimpleField(
+            "systemSubtype", readString(readBuffer, 24), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockSystemSubtype");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockSystemSubtypeBuilder(systemSubtype);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockSystemSubtypeBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String systemSubtype;
+
+    public ApplicationCommunicationStartAcknowledgeBlockSystemSubtypeBuilder(String systemSubtype) {
+
+      this.systemSubtype = systemSubtype;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockSystemSubtype build() {
+      ApplicationCommunicationStartAcknowledgeBlockSystemSubtype
+          applicationCommunicationStartAcknowledgeBlockSystemSubtype =
+              new ApplicationCommunicationStartAcknowledgeBlockSystemSubtype(systemSubtype);
+      return applicationCommunicationStartAcknowledgeBlockSystemSubtype;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockSystemSubtype)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockSystemSubtype that =
+        (ApplicationCommunicationStartAcknowledgeBlockSystemSubtype) o;
+    return (getSystemSubtype() == that.getSystemSubtype()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSystemSubtype());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSystemType.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSystemType.java
new file mode 100644
index 0000000000..6a8d0cce78
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockSystemType.java
@@ -0,0 +1,149 @@
+/*
+ * 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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockSystemType
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 10;
+  }
+
+  // Properties.
+  protected final String systemType;
+
+  public ApplicationCommunicationStartAcknowledgeBlockSystemType(String systemType) {
+    super();
+    this.systemType = systemType;
+  }
+
+  public String getSystemType() {
+    return systemType;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockSystemType");
+
+    // Simple Field (systemType)
+    writeSimpleField(
+        "systemType", systemType, writeString(writeBuffer, 24), WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockSystemType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockSystemType _value = this;
+
+    // Simple field (systemType)
+    lengthInBits += 24;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockSystemTypeBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockSystemType");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String systemType =
+        readSimpleField("systemType", readString(readBuffer, 24), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockSystemType");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockSystemTypeBuilder(systemType);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockSystemTypeBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String systemType;
+
+    public ApplicationCommunicationStartAcknowledgeBlockSystemTypeBuilder(String systemType) {
+
+      this.systemType = systemType;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockSystemType build() {
+      ApplicationCommunicationStartAcknowledgeBlockSystemType
+          applicationCommunicationStartAcknowledgeBlockSystemType =
+              new ApplicationCommunicationStartAcknowledgeBlockSystemType(systemType);
+      return applicationCommunicationStartAcknowledgeBlockSystemType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockSystemType)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockSystemType that =
+        (ApplicationCommunicationStartAcknowledgeBlockSystemType) o;
+    return (getSystemType() == that.getSystemType()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSystemType());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion.java
new file mode 100644
index 0000000000..0ddd7b72be
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion.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.openprotocol.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 ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion
+    extends ApplicationCommunicationStartAcknowledgeBlock implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getBlockType() {
+    return (int) 7;
+  }
+
+  // Properties.
+  protected final String toolSoftwareVersion;
+
+  public ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion(
+      String toolSoftwareVersion) {
+    super();
+    this.toolSoftwareVersion = toolSoftwareVersion;
+  }
+
+  public String getToolSoftwareVersion() {
+    return toolSoftwareVersion;
+  }
+
+  @Override
+  protected void serializeApplicationCommunicationStartAcknowledgeBlockChild(
+      WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion");
+
+    // Simple Field (toolSoftwareVersion)
+    writeSimpleField(
+        "toolSoftwareVersion",
+        toolSoftwareVersion,
+        writeString(writeBuffer, 152),
+        WithOption.WithEncoding("ASCII"));
+
+    writeBuffer.popContext("ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion _value = this;
+
+    // Simple field (toolSoftwareVersion)
+    lengthInBits += 152;
+
+    return lengthInBits;
+  }
+
+  public static ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersionBuilder
+      staticParseBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    String toolSoftwareVersion =
+        readSimpleField(
+            "toolSoftwareVersion", readString(readBuffer, 152), WithOption.WithEncoding("ASCII"));
+
+    readBuffer.closeContext("ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion");
+    // Create the instance
+    return new ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersionBuilder(
+        toolSoftwareVersion);
+  }
+
+  public static class ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersionBuilder
+      implements ApplicationCommunicationStartAcknowledgeBlock
+          .ApplicationCommunicationStartAcknowledgeBlockBuilder {
+    private final String toolSoftwareVersion;
+
+    public ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersionBuilder(
+        String toolSoftwareVersion) {
+
+      this.toolSoftwareVersion = toolSoftwareVersion;
+    }
+
+    public ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion build() {
+      ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion
+          applicationCommunicationStartAcknowledgeBlockToolSoftwareVersion =
+              new ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion(
+                  toolSoftwareVersion);
+      return applicationCommunicationStartAcknowledgeBlockToolSoftwareVersion;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion)) {
+      return false;
+    }
+    ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion that =
+        (ApplicationCommunicationStartAcknowledgeBlockToolSoftwareVersion) o;
+    return (getToolSoftwareVersion() == that.getToolSoftwareVersion())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getToolSoftwareVersion());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Constants.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Constants.java
new file mode 100644
index 0000000000..d0bdbdb53b
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Constants.java
@@ -0,0 +1,126 @@
+/*
+ * 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.openprotocol.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 Constants implements Message {
+
+  // Constant values.
+  public static final Integer TCPDEFAULTPORT = 4545;
+
+  public Constants() {
+    super();
+  }
+
+  public int getTcpDefaultPort() {
+    return TCPDEFAULTPORT;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("Constants");
+
+    // Const Field (tcpDefaultPort)
+    writeConstField("tcpDefaultPort", TCPDEFAULTPORT, writeUnsignedInt(writeBuffer, 16));
+
+    writeBuffer.popContext("Constants");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    Constants _value = this;
+
+    // Const Field (tcpDefaultPort)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static Constants staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static Constants staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("Constants");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    int tcpDefaultPort =
+        readConstField("tcpDefaultPort", readUnsignedInt(readBuffer, 16), Constants.TCPDEFAULTPORT);
+
+    readBuffer.closeContext("Constants");
+    // Create the instance
+    Constants _constants;
+    _constants = new Constants();
+    return _constants;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof Constants)) {
+      return false;
+    }
+    Constants that = (Constants) 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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Error.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Error.java
new file mode 100644
index 0000000000..002f461fb5
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Error.java
@@ -0,0 +1,142 @@
+/*
+ * 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.openprotocol.readwrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum Error {
+  NoError((int) 0),
+  InvalidData((int) 1),
+  ParameterSetIdNotPresent((int) 2),
+  ParameterSetCanNotBeSet((int) 3),
+  ParameterSetNotRunning((int) 4),
+  VinUploadSubscriptionAlreadyExists((int) 6),
+  VinUploadSubscriptionDoesNotExist((int) 7),
+  VinInputSourceNotGranted((int) 8),
+  LastTighteningResultSubscriptionAlreadyExists((int) 9),
+  LastTighteningResultSubscriptionDoesNowExist((int) 10),
+  AlarmSubscriptionAlreadyExists((int) 11),
+  AlarmSubscriptionDoesNotExist((int) 12),
+  ParameterSetSubscriptionAlreadyExists((int) 13),
+  ParameterSetSubscriptionDoesNotExist((int) 14),
+  TighteningIdRequestedNotFound((int) 15),
+  ConnectionRejectedProtocolBusy((int) 16),
+  JobIdNotPresent((int) 17),
+  JobInfoSubscriptionAlreadyExists((int) 18),
+  JobInfoSubscriptionDoesNotExist((int) 19),
+  JobCanNotBeSet((int) 20),
+  JobNotRunning((int) 21),
+  NotPossibleToExecuteDynamicJobRequest((int) 22),
+  JobBatchDecrementFailed((int) 23),
+  NotPossibleToCreatePset((int) 24),
+  ProgrammingControlNotGranted((int) 25),
+  WrongToolTypeToPsetDownloadConnected((int) 26),
+  ToolIsInaccessible((int) 27),
+  JobAbortionIsInProgress((int) 28),
+  ControllerIdNotASyncMasterOrStationController((int) 30),
+  MultiSpindleStatusSubscriptionAlreadyExists((int) 31),
+  MultiSpindleStatusSubscriptionDoesNotExist((int) 32),
+  MultiSpindleResultSubscriptionAlreadyExists((int) 33),
+  MultiSpindleResultSubscriptionDoesNotExist((int) 34),
+  OtherMasterClientAlreadyConnected((int) 35),
+  JobLineControlInfoSubscriptionAlreadyExists((int) 40),
+  JobLineControlInfoSubscriptionDoesNotExist((int) 41),
+  IdentifierInputSourceNotGranted((int) 42),
+  MultipleIdentifiersWorkOrderSubscriptionAlreadyExists((int) 43),
+  MultipleIdentifiersWorkOrderSubscriptionDoesNotExist((int) 44),
+  StatusExternalMonitoredInputsSubscriptionAlreadyExists((int) 50),
+  StatusExternalMonitoredInputsSubscriptionDoesNotExist((int) 51),
+  IoDeviceNotConnected((int) 52),
+  FaultyIoDeviceId((int) 53),
+  ToolTagIdUnknown((int) 54),
+  ToolTagIdSubscriptionAlreadyExists((int) 55),
+  ToolTagIdSubscriptionDoesNotExist((int) 56),
+  ToolMotorTuningFailed((int) 57),
+  NoAlarmPresent((int) 58),
+  ToolCurrentlyInUse((int) 59),
+  NoHistogramAvailable((int) 60),
+  PairingFailed((int) 61),
+  PairingDenied((int) 62),
+  PairingOrPairingAbortionAttemptOrWrongToolType((int) 63),
+  PairingAbortionDenied((int) 64),
+  PairingAbortionFailed((int) 65),
+  PairingDisconnectionFailed((int) 66),
+  PairingInProgressOrAlreadyDone((int) 67),
+  PairingDeniedNoProgramControl((int) 68),
+  UnsupportedExtraDataRevision((int) 69),
+  CalibrationFailed((int) 70),
+  SubscriptionAlreadyExists((int) 71),
+  SubscriptionDoesNotExist((int) 72),
+  SubscribedMidUnsupported((int) 73),
+  SubscribedMidRevisionUnsupported((int) 74),
+  RequestedMidUnsupported((int) 75),
+  RequestedMidRevisionUnsupported((int) 76),
+  RequestedOnSpecificDataNotSupported((int) 77),
+  SubscriptionOnSpecificDataNotSupported((int) 78),
+  CommandFailed((int) 79),
+  AudiEmergencyStatusSubscriptionAlreadyExists((int) 80),
+  AudiEmergencyStatusSubscriptionDoesNotExist((int) 81),
+  AutomaticOrManualModeSubscriptionAlreadyExists((int) 82),
+  AutomaticOrManualModeSubscriptionDoesNotExist((int) 83),
+  TheRelayFunctionSubscriptionAlreadyExists((int) 84),
+  TheRelayFunctionSubscriptionDoesNotExist((int) 85),
+  TheSelectorSocketInfoSubscriptionAlreadyExists((int) 86),
+  TheSelectorSocketInfoSubscriptionDoesNotExist((int) 87),
+  TheDiginInfoSubscriptionAlreadyExists((int) 88),
+  TheDiginInfoSubscriptionDoesNotExist((int) 89),
+  LockAtBatchDoneSubscriptionAlreadyExists((int) 90),
+  LockAtBatchDoneSubscriptionDoesNotExist((int) 91),
+  OpenProtocolCommendsDisabled((int) 92),
+  OpenProtocolCommendsDisabledSubscriptionAlreadyExists((int) 93),
+  OpenProtocolCommendsDisabledSubscriptionDoesNotExist((int) 94),
+  RejectRequestPowerMacsIsInManualMode((int) 95),
+  RejectConnectionClientAlreadyConnected((int) 96),
+  MidRevisionUnsupported((int) 97),
+  ControllerInternalRequestTimeout((int) 98),
+  UnknownMid((int) 99);
+  private static final Map<Integer, Error> map;
+
+  static {
+    map = new HashMap<>();
+    for (Error value : Error.values()) {
+      map.put((int) value.getValue(), value);
+    }
+  }
+
+  private int value;
+
+  Error(int value) {
+    this.value = value;
+  }
+
+  public int getValue() {
+    return value;
+  }
+
+  public static Error enumForValue(int value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(int value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Mid.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Mid.java
new file mode 100644
index 0000000000..6e4793200c
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/Mid.java
@@ -0,0 +1,239 @@
+/*
+ * 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.openprotocol.readwrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum Mid {
+  ApplicationCommunicationStart((long) 1L),
+  ApplicationCommunicationStartAcknowledge((long) 2L),
+  ApplicationCommunicationStop((long) 3L),
+  ApplicationCommandError((long) 4L),
+  ApplicationCommandAccepted((long) 5L),
+  ApplicationGenericDataRequest((long) 6L),
+  Reserved((long) 7L),
+  ApplicationGenericSubscription((long) 8L),
+  ApplicationGenericUnsubscribe((long) 9L),
+  ParameterSetIdUploadRequest((long) 10L),
+  ParameterSetIdUploadReply((long) 11L),
+  ParameterSetDataUploadRequest((long) 12L),
+  ParameterSetDataUploadReply((long) 13L),
+  ParameterSetSelectedSubscribe((long) 14L),
+  ParameterSetSelected((long) 15L),
+  ParameterSetSelectedAcknowledge((long) 16L),
+  ParameterSetSelectedUnsubscribe((long) 17L),
+  SelectParameterSet((long) 18L),
+  SetParameterSetBatchSize((long) 19L),
+  ResetParameterSetBatchCounter((long) 20L),
+  LockAtBatchDoneSubscribe((long) 21L),
+  LockAtBatchDoneUpload((long) 22L),
+  LockAtBatchDoneUploadAcknowledge((long) 23L),
+  LockAtBatchDoneUnsubscribe((long) 24L),
+  ReservedForFord((long) 25L),
+  JobIdUploadRequest((long) 30L),
+  JobIdUploadReply((long) 31L),
+  JobDataUploadRequest((long) 32L),
+  JobDataUploadReply((long) 33L),
+  JobInfoSubscribe((long) 34L),
+  JobInfo((long) 35L),
+  JobInfoAcknowledge((long) 36L),
+  JobInfoUnsubscribe((long) 37L),
+  SelectJob((long) 38L),
+  JobRestart((long) 39L),
+  ToolDataUploadRequest((long) 40L),
+  ToolDataUploadReply((long) 41L),
+  DisableTool((long) 42L),
+  EnableTool((long) 43L),
+  DisconnectToolRequest((long) 44L),
+  SetCalibrationValueRequest((long) 45L),
+  SetPrimaryToolRequest((long) 46L),
+  PairingHandling((long) 47L),
+  PairingStatus((long) 48L),
+  PairingStatusAcknowledge((long) 49L),
+  VehicleIdNumberDownloadRequest((long) 50L),
+  VehicleIdNumberSubscribe((long) 51L),
+  VehicleIdNumber((long) 52L),
+  VehicleIdNumberAcknowledge((long) 53L),
+  VehicleIdNumberUnsubscribe((long) 54L),
+  LastTighteningResultDataSubscribe((long) 60L),
+  LastTighteningResultData((long) 61L),
+  LastTighteningResultDataAcknowledge((long) 62L),
+  LastTighteningResultDataUnsubscribe((long) 63L),
+  OldTighteningResultUploadRequest((long) 64L),
+  OldTighteningResultUploadReply((long) 65L),
+  AlarmSubscribe((long) 70L),
+  Alarm((long) 71L),
+  AlarmAcknowledge((long) 72L),
+  AlarmUnsubscribe((long) 73L),
+  AlarmAcknowledgedOnController((long) 74L),
+  AlarmAcknowledgedOnControllerAcknowledge((long) 75L),
+  AlarmStatus((long) 76L),
+  AlarmStatusAcknowledge((long) 77L),
+  AcknowledgeAlarmRemotelyOnController((long) 78L),
+  ReadTimeUploadRequest((long) 80L),
+  ReadTimeUploadReply((long) 81L),
+  SetTime((long) 82L),
+  MultiSpindleStatusSubscribe((long) 90L),
+  MultiSpindleStatus((long) 91L),
+  MultiSpindleStatusAcknowledge((long) 92L),
+  MultiSpindleStatusUnsubscribe((long) 93L),
+  MultiSpindleResultSubscribe((long) 100L),
+  MultiSpindleResult((long) 101L),
+  MultiSpindleResultAcknowledge((long) 102L),
+  MultiSpindleResultUnsubscribe((long) 103L),
+  LastPowerMacsTighteningResultDataSubscribe((long) 105L),
+  LastPowerMacsTighteningResultStationData((long) 106L),
+  LastPowerMacsTighteningResultBoltData((long) 107L),
+  LastPowerMacsTighteningResultDataAcknowledge((long) 108L),
+  LastPowerMacsTighteningResultDataUnsubscribe((long) 109L),
+  DisplayUserTextOnCompact((long) 110L),
+  DisplayUserTextOnGraph((long) 111L),
+  FlashGreenLightOnTool((long) 113L),
+  JobLineControlInfoSubscribe((long) 120L),
+  JobLineControlStarted((long) 121L),
+  JobLineControlAlert1((long) 122L),
+  JobLineControlAlert2((long) 123L),
+  JobLineControlDone((long) 124L),
+  JobLineControlInfoAcknowledge((long) 125L),
+  JobLineControlUnsubscribe((long) 126L),
+  AbortJob((long) 127L),
+  JobBatchIncrement((long) 128L),
+  JobBatchDecrement((long) 129L),
+  JobOff((long) 130L),
+  SetJobLineControlStart((long) 131L),
+  SetJobLineControlAlert1((long) 132L),
+  SetJobLineControlAlert2((long) 133L),
+  ExecuteDynamicJobRequest((long) 140L),
+  IdentifierDownloadRequest((long) 150L),
+  MultipleIdentifiersWorkOrderSubscribe((long) 151L),
+  MultipleIdentifiersWorkOrder((long) 152L),
+  MultipleIdentifiersWorkOrderAcknowledge((long) 153L),
+  MultipleIdentifiersWorkOrderUnsubscribe((long) 154L),
+  BypassIdentifier((long) 155L),
+  ResetLatestIdentifier((long) 156L),
+  ResetAllIdentifiers((long) 157L),
+  SetExternalControlledRelays((long) 200L),
+  StatusExternalMonitoredInputsSubscribe((long) 210L),
+  StatusExternalMonitoredInputs((long) 211L),
+  StatusExternalMonitoredInputsAcknowledge((long) 212L),
+  StatusExternalMonitoredInputsUnsubscribe((long) 213L),
+  IoDeviceStatusRequest((long) 214L),
+  IoDeviceStatusReply((long) 215L),
+  RelayFunctionSubscribe((long) 216L),
+  RelayFunction((long) 217L),
+  RelayFunctionAcknowledge((long) 218L),
+  RelayFunctionUnsubscribe((long) 219L),
+  DigitalInputFunctionSubscribe((long) 220L),
+  DigitalInputFunction((long) 221L),
+  DigitalInputFunctionAcknowledge((long) 222L),
+  DigitalInputFunctionUnsubscribe((long) 223L),
+  SetDigitalInputFunction((long) 224L),
+  ResetDigitalInputFunction((long) 225L),
+  UserDataDownload((long) 240L),
+  UserDataSubscribe((long) 241L),
+  UserData((long) 242L),
+  UserDataAcknowledge((long) 243L),
+  UserDataUnsubscribe((long) 244L),
+  UserDataDownloadWithOffset((long) 245L),
+  SelectorSocketInfoSubscribe((long) 250L),
+  SelectorSocketInfo((long) 251L),
+  SelectorSocketInfoAcknowledge((long) 252L),
+  SelectorSocketInfoUnsubscribe((long) 253L),
+  SelectorControlGreenLights((long) 254L),
+  SelectorControlRedLights((long) 255L),
+  ToolTagIdRequest((long) 260L),
+  ToolTagIdSubscribe((long) 261L),
+  ToolTagId((long) 262L),
+  ToolTagIdAcknowledge((long) 263L),
+  ToolTagIdUnsubscribe((long) 264L),
+  ControllerRebootRequest((long) 270L),
+  HistogramUploadRequest((long) 300L),
+  HistogramUploadReply((long) 301L),
+  AutomaticManualModeSubscribe((long) 400L),
+  AutomaticManualMode((long) 401L),
+  AutomaticManualModeAcknowledge((long) 402L),
+  AutomaticManualModeUnsubscribe((long) 403L),
+  AutoDisableSettingsRequest((long) 410L),
+  AutoDisableSettingsReply((long) 411L),
+  OpenProtocolCommandsDisabledSubscribe((long) 420L),
+  OpenProtocolCommandsDisabled((long) 421L),
+  OpenProtocolCommandsDisabledAcknowledge((long) 422L),
+  OpenProtocolCommandsDisabledUnsubscribe((long) 423L),
+  MotorTuningResultDataSubscribe((long) 500L),
+  MotorTuningResultData((long) 501L),
+  MotorTuningResultDataAcknowledge((long) 502L),
+  MotorTuningResultDataUnsubscribe((long) 503L),
+  MotorTuningRequest((long) 504L),
+  TighteningDataDownloadStatusForRadioTools((long) 700L),
+  ResultTracesCurve((long) 900L),
+  ResultTracesCurvePlotData((long) 901L),
+  LastOperationResultOverallData((long) 1201L),
+  LastOperationResultObjectData((long) 1202L),
+  LastOperationResultDataAcknowledge((long) 1203L),
+  DeviceCommand((long) 2100L),
+  ProgramDataDownload((long) 2500L),
+  ProgramDataUploadReply((long) 2501L),
+  PasswordRequest((long) 2502L),
+  PasswordReply((long) 2503L),
+  ProgramPsetSelectionInDynamicJob((long) 2504L),
+  DynamicPsetSelection((long) 2505L),
+  ModeIdUploadRequest((long) 2600L),
+  ModeIdUploadReply((long) 2601L),
+  ModeDataUploadRequest((long) 2602L),
+  ModeDataUploadReply((long) 2603L),
+  ModeSelected((long) 2604L),
+  ModeSelectedAcknowledge((long) 2605L),
+  SelectMode((long) 2606L),
+  AudiEmergencyStatusSubscribe((long) 8000L),
+  AudiEmergencyStatus((long) 8001L),
+  AudiEmergencyStatusAcknowledge((long) 8002L),
+  AudiEmergencyStatusUnsubscribe((long) 8003L),
+  LinkLevelPositiveAcknowledge((long) 9997L),
+  LinkLevelNegativeAcknowledge((long) 9998L),
+  KeepAliveOpenProtocolCommunication((long) 9999L);
+  private static final Map<Long, Mid> map;
+
+  static {
+    map = new HashMap<>();
+    for (Mid value : Mid.values()) {
+      map.put((long) value.getValue(), value);
+    }
+  }
+
+  private long value;
+
+  Mid(long value) {
+    this.value = value;
+  }
+
+  public long getValue() {
+    return value;
+  }
+
+  public static Mid enumForValue(long value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(long value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/MidTypes.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/MidTypes.java
new file mode 100644
index 0000000000..5cf75deaad
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/MidTypes.java
@@ -0,0 +1,74 @@
+/*
+ * 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.openprotocol.readwrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum MidTypes {
+  JobMessage((long) 0L),
+  ToolMessage((long) 1L),
+  VinMessage((long) 2L),
+  TighteningResultMessage((long) 3L),
+  AlarmMessage((long) 4L),
+  TimeMessage((long) 5L),
+  MultiSpindleStatusMessage((long) 6L),
+  MultiSpindleResultMessage((long) 7L),
+  UserInterfaceMessage((long) 8L),
+  JobMessageAdvanced((long) 9L),
+  MultipleIdentifiersMessage((long) 10L),
+  IOInterfaceMessage((long) 11L),
+  PlcUserDataMessage((long) 12L),
+  SelectorMessage((long) 13L),
+  ToolLocationSystemMessage((long) 14L),
+  ControllerMessage((long) 15L),
+  StatisticMessage((long) 16L),
+  AutomaticManualModeMessage((long) 17L),
+  OpenProtocolCommandsDisabledMessage((long) 18L),
+  ParameterSetMessage((long) 19L),
+  NewGroupsMessage((long) 20L);
+  private static final Map<Long, MidTypes> map;
+
+  static {
+    map = new HashMap<>();
+    for (MidTypes value : MidTypes.values()) {
+      map.put((long) value.getValue(), value);
+    }
+  }
+
+  private long value;
+
+  MidTypes(long value) {
+    this.value = value;
+  }
+
+  public long getValue() {
+    return value;
+  }
+
+  public static MidTypes enumForValue(long value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(long value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessage.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessage.java
new file mode 100644
index 0000000000..50aae65ee4
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessage.java
@@ -0,0 +1,373 @@
+/*
+ * 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.openprotocol.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 OpenProtocolMessage implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Mid getMid();
+
+  // Constant values.
+  public static final Short END = 0x00;
+
+  // Properties.
+  protected final OpenProtocolRevision revision;
+  protected final short noAckFlag;
+  protected final int stationId;
+  protected final int spindleId;
+  protected final int sequenceNumber;
+  protected final short numberOfMessageParts;
+  protected final short messagePartNumber;
+
+  public OpenProtocolMessage(
+      OpenProtocolRevision revision,
+      short noAckFlag,
+      int stationId,
+      int spindleId,
+      int sequenceNumber,
+      short numberOfMessageParts,
+      short messagePartNumber) {
+    super();
+    this.revision = revision;
+    this.noAckFlag = noAckFlag;
+    this.stationId = stationId;
+    this.spindleId = spindleId;
+    this.sequenceNumber = sequenceNumber;
+    this.numberOfMessageParts = numberOfMessageParts;
+    this.messagePartNumber = messagePartNumber;
+  }
+
+  public OpenProtocolRevision getRevision() {
+    return revision;
+  }
+
+  public short getNoAckFlag() {
+    return noAckFlag;
+  }
+
+  public int getStationId() {
+    return stationId;
+  }
+
+  public int getSpindleId() {
+    return spindleId;
+  }
+
+  public int getSequenceNumber() {
+    return sequenceNumber;
+  }
+
+  public short getNumberOfMessageParts() {
+    return numberOfMessageParts;
+  }
+
+  public short getMessagePartNumber() {
+    return messagePartNumber;
+  }
+
+  public short getEnd() {
+    return END;
+  }
+
+  protected abstract void serializeOpenProtocolMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("OpenProtocolMessage");
+
+    // Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    long length = (long) (getLengthInBytes());
+    writeImplicitField("length", length, writeUnsignedLong(writeBuffer, 32));
+
+    // Discriminator Field (mid) (Used as input to a switch field)
+    writeDiscriminatorEnumField(
+        "mid",
+        "Mid",
+        getMid(),
+        new DataWriterEnumDefault<>(Mid::getValue, Mid::name, writeUnsignedLong(writeBuffer, 32)));
+
+    // Simple Field (revision)
+    writeSimpleEnumField(
+        "revision",
+        "OpenProtocolRevision",
+        revision,
+        new DataWriterEnumDefault<>(
+            OpenProtocolRevision::getValue,
+            OpenProtocolRevision::name,
+            writeUnsignedLong(writeBuffer, 24)));
+
+    // Simple Field (noAckFlag)
+    writeSimpleField("noAckFlag", noAckFlag, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (stationId)
+    writeSimpleField(
+        "stationId",
+        stationId,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithEncoding("AsciiUint"));
+
+    // Simple Field (spindleId)
+    writeSimpleField(
+        "spindleId",
+        spindleId,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithEncoding("AsciiUint"));
+
+    // Simple Field (sequenceNumber)
+    writeSimpleField(
+        "sequenceNumber",
+        sequenceNumber,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithEncoding("AsciiUint"));
+
+    // Simple Field (numberOfMessageParts)
+    writeSimpleField(
+        "numberOfMessageParts",
+        numberOfMessageParts,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithEncoding("AsciiUint"));
+
+    // Simple Field (messagePartNumber)
+    writeSimpleField(
+        "messagePartNumber",
+        messagePartNumber,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithEncoding("AsciiUint"));
+
+    // Switch field (Serialize the sub-type)
+    serializeOpenProtocolMessageChild(writeBuffer);
+
+    // Const Field (end)
+    writeConstField("end", END, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("OpenProtocolMessage");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    OpenProtocolMessage _value = this;
+
+    // Implicit Field (length)
+    lengthInBits += 32;
+
+    // Discriminator Field (mid)
+    lengthInBits += 32;
+
+    // Simple field (revision)
+    lengthInBits += 24;
+
+    // Simple field (noAckFlag)
+    lengthInBits += 8;
+
+    // Simple field (stationId)
+    lengthInBits += 16;
+
+    // Simple field (spindleId)
+    lengthInBits += 16;
+
+    // Simple field (sequenceNumber)
+    lengthInBits += 16;
+
+    // Simple field (numberOfMessageParts)
+    lengthInBits += 8;
+
+    // Simple field (messagePartNumber)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    // Const Field (end)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static OpenProtocolMessage staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static OpenProtocolMessage staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OpenProtocolMessage");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    long length =
+        readImplicitField(
+            "length", readUnsignedLong(readBuffer, 32), WithOption.WithEncoding("AsciiUint"));
+
+    Mid mid =
+        readDiscriminatorField(
+            "mid",
+            new DataReaderEnumDefault<>(Mid::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    OpenProtocolRevision revision =
+        readEnumField(
+            "revision",
+            "OpenProtocolRevision",
+            new DataReaderEnumDefault<>(
+                OpenProtocolRevision::enumForValue, readUnsignedLong(readBuffer, 24)));
+
+    short noAckFlag = readSimpleField("noAckFlag", readUnsignedShort(readBuffer, 8));
+
+    int stationId =
+        readSimpleField(
+            "stationId", readUnsignedInt(readBuffer, 16), WithOption.WithEncoding("AsciiUint"));
+
+    int spindleId =
+        readSimpleField(
+            "spindleId", readUnsignedInt(readBuffer, 16), WithOption.WithEncoding("AsciiUint"));
+
+    int sequenceNumber =
+        readSimpleField(
+            "sequenceNumber",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithEncoding("AsciiUint"));
+
+    short numberOfMessageParts =
+        readSimpleField(
+            "numberOfMessageParts",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithEncoding("AsciiUint"));
+
+    short messagePartNumber =
+        readSimpleField(
+            "messagePartNumber",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithEncoding("AsciiUint"));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    OpenProtocolMessageBuilder builder = null;
+    if (EvaluationHelper.equals(mid, Mid.ApplicationCommunicationStart)) {
+      builder = OpenProtocolMessageApplicationCommunicationStart.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(mid, Mid.ApplicationCommunicationStartAcknowledge)) {
+      builder =
+          OpenProtocolMessageApplicationCommunicationStartAcknowledge.staticParseBuilder(
+              readBuffer, revision);
+    } else if (EvaluationHelper.equals(mid, Mid.ApplicationCommunicationStop)) {
+      builder = OpenProtocolMessageApplicationCommunicationStop.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(mid, Mid.ApplicationCommandError)) {
+      builder = OpenProtocolMessageApplicationCommandError.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(mid, Mid.ApplicationCommandAccepted)) {
+      builder = OpenProtocolMessageApplicationCommandAccepted.staticParseBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(mid, Mid.ApplicationGenericDataRequest)) {
+      builder = OpenProtocolMessageApplicationGenericDataRequest.staticParseBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type" + " parameters [" + "mid=" + mid + "]");
+    }
+
+    short end = readConstField("end", readUnsignedShort(readBuffer, 8), OpenProtocolMessage.END);
+
+    readBuffer.closeContext("OpenProtocolMessage");
+    // Create the instance
+    OpenProtocolMessage _openProtocolMessage =
+        builder.build(
+            revision,
+            noAckFlag,
+            stationId,
+            spindleId,
+            sequenceNumber,
+            numberOfMessageParts,
+            messagePartNumber);
+    return _openProtocolMessage;
+  }
+
+  public static interface OpenProtocolMessageBuilder {
+    OpenProtocolMessage build(
+        OpenProtocolRevision revision,
+        short noAckFlag,
+        int stationId,
+        int spindleId,
+        int sequenceNumber,
+        short numberOfMessageParts,
+        short messagePartNumber);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OpenProtocolMessage)) {
+      return false;
+    }
+    OpenProtocolMessage that = (OpenProtocolMessage) o;
+    return (getRevision() == that.getRevision())
+        && (getNoAckFlag() == that.getNoAckFlag())
+        && (getStationId() == that.getStationId())
+        && (getSpindleId() == that.getSpindleId())
+        && (getSequenceNumber() == that.getSequenceNumber())
+        && (getNumberOfMessageParts() == that.getNumberOfMessageParts())
+        && (getMessagePartNumber() == that.getMessagePartNumber())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getRevision(),
+        getNoAckFlag(),
+        getStationId(),
+        getSpindleId(),
+        getSequenceNumber(),
+        getNumberOfMessageParts(),
+        getMessagePartNumber());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommandAccepted.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommandAccepted.java
new file mode 100644
index 0000000000..ded7fd7e39
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommandAccepted.java
@@ -0,0 +1,183 @@
+/*
+ * 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.openprotocol.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 OpenProtocolMessageApplicationCommandAccepted extends OpenProtocolMessage
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Mid getMid() {
+    return Mid.ApplicationCommandAccepted;
+  }
+
+  // Properties.
+  protected final Mid requestMid;
+
+  public OpenProtocolMessageApplicationCommandAccepted(
+      OpenProtocolRevision revision,
+      short noAckFlag,
+      int stationId,
+      int spindleId,
+      int sequenceNumber,
+      short numberOfMessageParts,
+      short messagePartNumber,
+      Mid requestMid) {
+    super(
+        revision,
+        noAckFlag,
+        stationId,
+        spindleId,
+        sequenceNumber,
+        numberOfMessageParts,
+        messagePartNumber);
+    this.requestMid = requestMid;
+  }
+
+  public Mid getRequestMid() {
+    return requestMid;
+  }
+
+  @Override
+  protected void serializeOpenProtocolMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("OpenProtocolMessageApplicationCommandAccepted");
+
+    // Simple Field (requestMid)
+    writeSimpleEnumField(
+        "requestMid",
+        "Mid",
+        requestMid,
+        new DataWriterEnumDefault<>(Mid::getValue, Mid::name, writeUnsignedLong(writeBuffer, 32)));
+
+    writeBuffer.popContext("OpenProtocolMessageApplicationCommandAccepted");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    OpenProtocolMessageApplicationCommandAccepted _value = this;
+
+    // Simple field (requestMid)
+    lengthInBits += 32;
+
+    return lengthInBits;
+  }
+
+  public static OpenProtocolMessageApplicationCommandAcceptedBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OpenProtocolMessageApplicationCommandAccepted");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    Mid requestMid =
+        readEnumField(
+            "requestMid",
+            "Mid",
+            new DataReaderEnumDefault<>(Mid::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    readBuffer.closeContext("OpenProtocolMessageApplicationCommandAccepted");
+    // Create the instance
+    return new OpenProtocolMessageApplicationCommandAcceptedBuilder(requestMid);
+  }
+
+  public static class OpenProtocolMessageApplicationCommandAcceptedBuilder
+      implements OpenProtocolMessage.OpenProtocolMessageBuilder {
+    private final Mid requestMid;
+
+    public OpenProtocolMessageApplicationCommandAcceptedBuilder(Mid requestMid) {
+
+      this.requestMid = requestMid;
+    }
+
+    public OpenProtocolMessageApplicationCommandAccepted build(
+        OpenProtocolRevision revision,
+        short noAckFlag,
+        int stationId,
+        int spindleId,
+        int sequenceNumber,
+        short numberOfMessageParts,
+        short messagePartNumber) {
+      OpenProtocolMessageApplicationCommandAccepted openProtocolMessageApplicationCommandAccepted =
+          new OpenProtocolMessageApplicationCommandAccepted(
+              revision,
+              noAckFlag,
+              stationId,
+              spindleId,
+              sequenceNumber,
+              numberOfMessageParts,
+              messagePartNumber,
+              requestMid);
+      return openProtocolMessageApplicationCommandAccepted;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OpenProtocolMessageApplicationCommandAccepted)) {
+      return false;
+    }
+    OpenProtocolMessageApplicationCommandAccepted that =
+        (OpenProtocolMessageApplicationCommandAccepted) o;
+    return (getRequestMid() == that.getRequestMid()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getRequestMid());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommandError.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommandError.java
new file mode 100644
index 0000000000..8ca76c10a5
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommandError.java
@@ -0,0 +1,213 @@
+/*
+ * 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.openprotocol.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 OpenProtocolMessageApplicationCommandError extends OpenProtocolMessage
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Mid getMid() {
+    return Mid.ApplicationCommandError;
+  }
+
+  // Properties.
+  protected final Mid requestMid;
+  protected final Error error;
+
+  public OpenProtocolMessageApplicationCommandError(
+      OpenProtocolRevision revision,
+      short noAckFlag,
+      int stationId,
+      int spindleId,
+      int sequenceNumber,
+      short numberOfMessageParts,
+      short messagePartNumber,
+      Mid requestMid,
+      Error error) {
+    super(
+        revision,
+        noAckFlag,
+        stationId,
+        spindleId,
+        sequenceNumber,
+        numberOfMessageParts,
+        messagePartNumber);
+    this.requestMid = requestMid;
+    this.error = error;
+  }
+
+  public Mid getRequestMid() {
+    return requestMid;
+  }
+
+  public Error getError() {
+    return error;
+  }
+
+  @Override
+  protected void serializeOpenProtocolMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("OpenProtocolMessageApplicationCommandError");
+
+    // Simple Field (requestMid)
+    writeSimpleEnumField(
+        "requestMid",
+        "Mid",
+        requestMid,
+        new DataWriterEnumDefault<>(Mid::getValue, Mid::name, writeUnsignedLong(writeBuffer, 32)));
+
+    // Simple Field (error)
+    writeSimpleEnumField(
+        "error",
+        "Error",
+        error,
+        new DataWriterEnumDefault<>(
+            Error::getValue, Error::name, writeUnsignedInt(writeBuffer, 16)));
+
+    writeBuffer.popContext("OpenProtocolMessageApplicationCommandError");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    OpenProtocolMessageApplicationCommandError _value = this;
+
+    // Simple field (requestMid)
+    lengthInBits += 32;
+
+    // Simple field (error)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static OpenProtocolMessageApplicationCommandErrorBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OpenProtocolMessageApplicationCommandError");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    Mid requestMid =
+        readEnumField(
+            "requestMid",
+            "Mid",
+            new DataReaderEnumDefault<>(Mid::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    Error error =
+        readEnumField(
+            "error",
+            "Error",
+            new DataReaderEnumDefault<>(Error::enumForValue, readUnsignedInt(readBuffer, 16)));
+
+    readBuffer.closeContext("OpenProtocolMessageApplicationCommandError");
+    // Create the instance
+    return new OpenProtocolMessageApplicationCommandErrorBuilder(requestMid, error);
+  }
+
+  public static class OpenProtocolMessageApplicationCommandErrorBuilder
+      implements OpenProtocolMessage.OpenProtocolMessageBuilder {
+    private final Mid requestMid;
+    private final Error error;
+
+    public OpenProtocolMessageApplicationCommandErrorBuilder(Mid requestMid, Error error) {
+
+      this.requestMid = requestMid;
+      this.error = error;
+    }
+
+    public OpenProtocolMessageApplicationCommandError build(
+        OpenProtocolRevision revision,
+        short noAckFlag,
+        int stationId,
+        int spindleId,
+        int sequenceNumber,
+        short numberOfMessageParts,
+        short messagePartNumber) {
+      OpenProtocolMessageApplicationCommandError openProtocolMessageApplicationCommandError =
+          new OpenProtocolMessageApplicationCommandError(
+              revision,
+              noAckFlag,
+              stationId,
+              spindleId,
+              sequenceNumber,
+              numberOfMessageParts,
+              messagePartNumber,
+              requestMid,
+              error);
+      return openProtocolMessageApplicationCommandError;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OpenProtocolMessageApplicationCommandError)) {
+      return false;
+    }
+    OpenProtocolMessageApplicationCommandError that =
+        (OpenProtocolMessageApplicationCommandError) o;
+    return (getRequestMid() == that.getRequestMid())
+        && (getError() == that.getError())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getRequestMid(), getError());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStart.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStart.java
new file mode 100644
index 0000000000..4cb9c89ba1
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStart.java
@@ -0,0 +1,154 @@
+/*
+ * 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.openprotocol.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 OpenProtocolMessageApplicationCommunicationStart extends OpenProtocolMessage
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Mid getMid() {
+    return Mid.ApplicationCommunicationStart;
+  }
+
+  public OpenProtocolMessageApplicationCommunicationStart(
+      OpenProtocolRevision revision,
+      short noAckFlag,
+      int stationId,
+      int spindleId,
+      int sequenceNumber,
+      short numberOfMessageParts,
+      short messagePartNumber) {
+    super(
+        revision,
+        noAckFlag,
+        stationId,
+        spindleId,
+        sequenceNumber,
+        numberOfMessageParts,
+        messagePartNumber);
+  }
+
+  @Override
+  protected void serializeOpenProtocolMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("OpenProtocolMessageApplicationCommunicationStart");
+
+    writeBuffer.popContext("OpenProtocolMessageApplicationCommunicationStart");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    OpenProtocolMessageApplicationCommunicationStart _value = this;
+
+    return lengthInBits;
+  }
+
+  public static OpenProtocolMessageApplicationCommunicationStartBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OpenProtocolMessageApplicationCommunicationStart");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    readBuffer.closeContext("OpenProtocolMessageApplicationCommunicationStart");
+    // Create the instance
+    return new OpenProtocolMessageApplicationCommunicationStartBuilder();
+  }
+
+  public static class OpenProtocolMessageApplicationCommunicationStartBuilder
+      implements OpenProtocolMessage.OpenProtocolMessageBuilder {
+
+    public OpenProtocolMessageApplicationCommunicationStartBuilder() {}
+
+    public OpenProtocolMessageApplicationCommunicationStart build(
+        OpenProtocolRevision revision,
+        short noAckFlag,
+        int stationId,
+        int spindleId,
+        int sequenceNumber,
+        short numberOfMessageParts,
+        short messagePartNumber) {
+      OpenProtocolMessageApplicationCommunicationStart
+          openProtocolMessageApplicationCommunicationStart =
+              new OpenProtocolMessageApplicationCommunicationStart(
+                  revision,
+                  noAckFlag,
+                  stationId,
+                  spindleId,
+                  sequenceNumber,
+                  numberOfMessageParts,
+                  messagePartNumber);
+      return openProtocolMessageApplicationCommunicationStart;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OpenProtocolMessageApplicationCommunicationStart)) {
+      return false;
+    }
+    OpenProtocolMessageApplicationCommunicationStart that =
+        (OpenProtocolMessageApplicationCommunicationStart) 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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStartAcknowledge.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStartAcknowledge.java
new file mode 100644
index 0000000000..bc8bfdd7ca
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStartAcknowledge.java
@@ -0,0 +1,190 @@
+/*
+ * 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.openprotocol.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 OpenProtocolMessageApplicationCommunicationStartAcknowledge extends OpenProtocolMessage
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Mid getMid() {
+    return Mid.ApplicationCommunicationStartAcknowledge;
+  }
+
+  // Properties.
+  protected final List<ApplicationCommunicationStartAcknowledgeBlock> blocks;
+
+  public OpenProtocolMessageApplicationCommunicationStartAcknowledge(
+      OpenProtocolRevision revision,
+      short noAckFlag,
+      int stationId,
+      int spindleId,
+      int sequenceNumber,
+      short numberOfMessageParts,
+      short messagePartNumber,
+      List<ApplicationCommunicationStartAcknowledgeBlock> blocks) {
+    super(
+        revision,
+        noAckFlag,
+        stationId,
+        spindleId,
+        sequenceNumber,
+        numberOfMessageParts,
+        messagePartNumber);
+    this.blocks = blocks;
+  }
+
+  public List<ApplicationCommunicationStartAcknowledgeBlock> getBlocks() {
+    return blocks;
+  }
+
+  @Override
+  protected void serializeOpenProtocolMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("OpenProtocolMessageApplicationCommunicationStartAcknowledge");
+
+    // Array Field (blocks)
+    writeComplexTypeArrayField("blocks", blocks, writeBuffer);
+
+    writeBuffer.popContext("OpenProtocolMessageApplicationCommunicationStartAcknowledge");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    OpenProtocolMessageApplicationCommunicationStartAcknowledge _value = this;
+
+    // Array field
+    if (blocks != null) {
+      int i = 0;
+      for (ApplicationCommunicationStartAcknowledgeBlock element : blocks) {
+        boolean last = ++i >= blocks.size();
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static OpenProtocolMessageApplicationCommunicationStartAcknowledgeBuilder
+      staticParseBuilder(ReadBuffer readBuffer, OpenProtocolRevision revision)
+          throws ParseException {
+    readBuffer.pullContext("OpenProtocolMessageApplicationCommunicationStartAcknowledge");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    List<ApplicationCommunicationStartAcknowledgeBlock> blocks =
+        readCountArrayField(
+            "blocks",
+            new DataReaderComplexDefault<>(
+                () -> ApplicationCommunicationStartAcknowledgeBlock.staticParse(readBuffer),
+                readBuffer),
+            revision.getNumCommunicationStartAcknowledgeBlocks());
+
+    readBuffer.closeContext("OpenProtocolMessageApplicationCommunicationStartAcknowledge");
+    // Create the instance
+    return new OpenProtocolMessageApplicationCommunicationStartAcknowledgeBuilder(blocks);
+  }
+
+  public static class OpenProtocolMessageApplicationCommunicationStartAcknowledgeBuilder
+      implements OpenProtocolMessage.OpenProtocolMessageBuilder {
+    private final List<ApplicationCommunicationStartAcknowledgeBlock> blocks;
+
+    public OpenProtocolMessageApplicationCommunicationStartAcknowledgeBuilder(
+        List<ApplicationCommunicationStartAcknowledgeBlock> blocks) {
+
+      this.blocks = blocks;
+    }
+
+    public OpenProtocolMessageApplicationCommunicationStartAcknowledge build(
+        OpenProtocolRevision revision,
+        short noAckFlag,
+        int stationId,
+        int spindleId,
+        int sequenceNumber,
+        short numberOfMessageParts,
+        short messagePartNumber) {
+      OpenProtocolMessageApplicationCommunicationStartAcknowledge
+          openProtocolMessageApplicationCommunicationStartAcknowledge =
+              new OpenProtocolMessageApplicationCommunicationStartAcknowledge(
+                  revision,
+                  noAckFlag,
+                  stationId,
+                  spindleId,
+                  sequenceNumber,
+                  numberOfMessageParts,
+                  messagePartNumber,
+                  blocks);
+      return openProtocolMessageApplicationCommunicationStartAcknowledge;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OpenProtocolMessageApplicationCommunicationStartAcknowledge)) {
+      return false;
+    }
+    OpenProtocolMessageApplicationCommunicationStartAcknowledge that =
+        (OpenProtocolMessageApplicationCommunicationStartAcknowledge) o;
+    return (getBlocks() == that.getBlocks()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getBlocks());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStop.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStop.java
new file mode 100644
index 0000000000..83ca7ec577
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationCommunicationStop.java
@@ -0,0 +1,154 @@
+/*
+ * 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.openprotocol.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 OpenProtocolMessageApplicationCommunicationStop extends OpenProtocolMessage
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Mid getMid() {
+    return Mid.ApplicationCommunicationStop;
+  }
+
+  public OpenProtocolMessageApplicationCommunicationStop(
+      OpenProtocolRevision revision,
+      short noAckFlag,
+      int stationId,
+      int spindleId,
+      int sequenceNumber,
+      short numberOfMessageParts,
+      short messagePartNumber) {
+    super(
+        revision,
+        noAckFlag,
+        stationId,
+        spindleId,
+        sequenceNumber,
+        numberOfMessageParts,
+        messagePartNumber);
+  }
+
+  @Override
+  protected void serializeOpenProtocolMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("OpenProtocolMessageApplicationCommunicationStop");
+
+    writeBuffer.popContext("OpenProtocolMessageApplicationCommunicationStop");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    OpenProtocolMessageApplicationCommunicationStop _value = this;
+
+    return lengthInBits;
+  }
+
+  public static OpenProtocolMessageApplicationCommunicationStopBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OpenProtocolMessageApplicationCommunicationStop");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    readBuffer.closeContext("OpenProtocolMessageApplicationCommunicationStop");
+    // Create the instance
+    return new OpenProtocolMessageApplicationCommunicationStopBuilder();
+  }
+
+  public static class OpenProtocolMessageApplicationCommunicationStopBuilder
+      implements OpenProtocolMessage.OpenProtocolMessageBuilder {
+
+    public OpenProtocolMessageApplicationCommunicationStopBuilder() {}
+
+    public OpenProtocolMessageApplicationCommunicationStop build(
+        OpenProtocolRevision revision,
+        short noAckFlag,
+        int stationId,
+        int spindleId,
+        int sequenceNumber,
+        short numberOfMessageParts,
+        short messagePartNumber) {
+      OpenProtocolMessageApplicationCommunicationStop
+          openProtocolMessageApplicationCommunicationStop =
+              new OpenProtocolMessageApplicationCommunicationStop(
+                  revision,
+                  noAckFlag,
+                  stationId,
+                  spindleId,
+                  sequenceNumber,
+                  numberOfMessageParts,
+                  messagePartNumber);
+      return openProtocolMessageApplicationCommunicationStop;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OpenProtocolMessageApplicationCommunicationStop)) {
+      return false;
+    }
+    OpenProtocolMessageApplicationCommunicationStop that =
+        (OpenProtocolMessageApplicationCommunicationStop) 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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationGenericDataRequest.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationGenericDataRequest.java
new file mode 100644
index 0000000000..5381c55931
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolMessageApplicationGenericDataRequest.java
@@ -0,0 +1,250 @@
+/*
+ * 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.openprotocol.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 OpenProtocolMessageApplicationGenericDataRequest extends OpenProtocolMessage
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Mid getMid() {
+    return Mid.ApplicationGenericDataRequest;
+  }
+
+  // Properties.
+  protected final Mid requestMid;
+  protected final OpenProtocolRevision wantedRevision;
+  protected final byte[] extraData;
+
+  public OpenProtocolMessageApplicationGenericDataRequest(
+      OpenProtocolRevision revision,
+      short noAckFlag,
+      int stationId,
+      int spindleId,
+      int sequenceNumber,
+      short numberOfMessageParts,
+      short messagePartNumber,
+      Mid requestMid,
+      OpenProtocolRevision wantedRevision,
+      byte[] extraData) {
+    super(
+        revision,
+        noAckFlag,
+        stationId,
+        spindleId,
+        sequenceNumber,
+        numberOfMessageParts,
+        messagePartNumber);
+    this.requestMid = requestMid;
+    this.wantedRevision = wantedRevision;
+    this.extraData = extraData;
+  }
+
+  public Mid getRequestMid() {
+    return requestMid;
+  }
+
+  public OpenProtocolRevision getWantedRevision() {
+    return wantedRevision;
+  }
+
+  public byte[] getExtraData() {
+    return extraData;
+  }
+
+  @Override
+  protected void serializeOpenProtocolMessageChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("OpenProtocolMessageApplicationGenericDataRequest");
+
+    // Simple Field (requestMid)
+    writeSimpleEnumField(
+        "requestMid",
+        "Mid",
+        requestMid,
+        new DataWriterEnumDefault<>(Mid::getValue, Mid::name, writeUnsignedLong(writeBuffer, 32)));
+
+    // Simple Field (wantedRevision)
+    writeSimpleEnumField(
+        "wantedRevision",
+        "OpenProtocolRevision",
+        wantedRevision,
+        new DataWriterEnumDefault<>(
+            OpenProtocolRevision::getValue,
+            OpenProtocolRevision::name,
+            writeUnsignedLong(writeBuffer, 24)));
+
+    // Implicit Field (extraDataLength) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int extraDataLength = (int) (COUNT(getExtraData()));
+    writeImplicitField("extraDataLength", extraDataLength, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (extraData)
+    writeByteArrayField("extraData", extraData, writeByteArray(writeBuffer, 8));
+
+    writeBuffer.popContext("OpenProtocolMessageApplicationGenericDataRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    OpenProtocolMessageApplicationGenericDataRequest _value = this;
+
+    // Simple field (requestMid)
+    lengthInBits += 32;
+
+    // Simple field (wantedRevision)
+    lengthInBits += 24;
+
+    // Implicit Field (extraDataLength)
+    lengthInBits += 16;
+
+    // Array field
+    if (extraData != null) {
+      lengthInBits += 8 * extraData.length;
+    }
+
+    return lengthInBits;
+  }
+
+  public static OpenProtocolMessageApplicationGenericDataRequestBuilder staticParseBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OpenProtocolMessageApplicationGenericDataRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    Mid requestMid =
+        readEnumField(
+            "requestMid",
+            "Mid",
+            new DataReaderEnumDefault<>(Mid::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    OpenProtocolRevision wantedRevision =
+        readEnumField(
+            "wantedRevision",
+            "OpenProtocolRevision",
+            new DataReaderEnumDefault<>(
+                OpenProtocolRevision::enumForValue, readUnsignedLong(readBuffer, 24)));
+
+    int extraDataLength = readImplicitField("extraDataLength", readUnsignedInt(readBuffer, 16));
+
+    byte[] extraData = readBuffer.readByteArray("extraData", Math.toIntExact(extraDataLength));
+
+    readBuffer.closeContext("OpenProtocolMessageApplicationGenericDataRequest");
+    // Create the instance
+    return new OpenProtocolMessageApplicationGenericDataRequestBuilder(
+        requestMid, wantedRevision, extraData);
+  }
+
+  public static class OpenProtocolMessageApplicationGenericDataRequestBuilder
+      implements OpenProtocolMessage.OpenProtocolMessageBuilder {
+    private final Mid requestMid;
+    private final OpenProtocolRevision wantedRevision;
+    private final byte[] extraData;
+
+    public OpenProtocolMessageApplicationGenericDataRequestBuilder(
+        Mid requestMid, OpenProtocolRevision wantedRevision, byte[] extraData) {
+
+      this.requestMid = requestMid;
+      this.wantedRevision = wantedRevision;
+      this.extraData = extraData;
+    }
+
+    public OpenProtocolMessageApplicationGenericDataRequest build(
+        OpenProtocolRevision revision,
+        short noAckFlag,
+        int stationId,
+        int spindleId,
+        int sequenceNumber,
+        short numberOfMessageParts,
+        short messagePartNumber) {
+      OpenProtocolMessageApplicationGenericDataRequest
+          openProtocolMessageApplicationGenericDataRequest =
+              new OpenProtocolMessageApplicationGenericDataRequest(
+                  revision,
+                  noAckFlag,
+                  stationId,
+                  spindleId,
+                  sequenceNumber,
+                  numberOfMessageParts,
+                  messagePartNumber,
+                  requestMid,
+                  wantedRevision,
+                  extraData);
+      return openProtocolMessageApplicationGenericDataRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OpenProtocolMessageApplicationGenericDataRequest)) {
+      return false;
+    }
+    OpenProtocolMessageApplicationGenericDataRequest that =
+        (OpenProtocolMessageApplicationGenericDataRequest) o;
+    return (getRequestMid() == that.getRequestMid())
+        && (getWantedRevision() == that.getWantedRevision())
+        && (getExtraData() == that.getExtraData())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getRequestMid(), getWantedRevision(), getExtraData());
+  }
+
+  @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/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolRevision.java b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolRevision.java
new file mode 100644
index 0000000000..2c669614f7
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/generated/org/apache/plc4x/java/openprotocol/readwrite/OpenProtocolRevision.java
@@ -0,0 +1,88 @@
+/*
+ * 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.openprotocol.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 OpenProtocolRevision {
+  Revision1((long) 1, (short) 3),
+  Revision2((long) 2, (short) 4),
+  Revision3((long) 3, (short) 7),
+  Revision4((long) 4, (short) 9),
+  Revision5((long) 5, (short) 11),
+  Revision6((long) 6, (short) 16);
+  private static final Map<Long, OpenProtocolRevision> map;
+
+  static {
+    map = new HashMap<>();
+    for (OpenProtocolRevision value : OpenProtocolRevision.values()) {
+      map.put((long) value.getValue(), value);
+    }
+  }
+
+  private long value;
+  private short numCommunicationStartAcknowledgeBlocks;
+
+  OpenProtocolRevision(long value, short numCommunicationStartAcknowledgeBlocks) {
+    this.value = value;
+    this.numCommunicationStartAcknowledgeBlocks = numCommunicationStartAcknowledgeBlocks;
+  }
+
+  public long getValue() {
+    return value;
+  }
+
+  public short getNumCommunicationStartAcknowledgeBlocks() {
+    return numCommunicationStartAcknowledgeBlocks;
+  }
+
+  public static OpenProtocolRevision firstEnumForFieldNumCommunicationStartAcknowledgeBlocks(
+      short fieldValue) {
+    for (OpenProtocolRevision _val : OpenProtocolRevision.values()) {
+      if (_val.getNumCommunicationStartAcknowledgeBlocks() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<OpenProtocolRevision> enumsForFieldNumCommunicationStartAcknowledgeBlocks(
+      short fieldValue) {
+    List<OpenProtocolRevision> _values = new ArrayList();
+    for (OpenProtocolRevision _val : OpenProtocolRevision.values()) {
+      if (_val.getNumCommunicationStartAcknowledgeBlocks() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public static OpenProtocolRevision enumForValue(long value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(long value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java
new file mode 100644
index 0000000000..3dfe5e3388
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/OpenProtocolDriver.java
@@ -0,0 +1,130 @@
+/*
+ * 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.openprotocol;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.plc4x.java.api.metadata.PlcDriverMetadata;
+import org.apache.plc4x.java.openprotocol.config.OpenProtocolConfiguration;
+import org.apache.plc4x.java.openprotocol.protocol.OpenProtocolProtocolLogic;
+import org.apache.plc4x.java.openprotocol.readwrite.OpenProtocolMessage;
+import org.apache.plc4x.java.openprotocol.tag.OpenProtocolTag;
+import org.apache.plc4x.java.openprotocol.tag.OpenProtocolTagHandler;
+import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.spi.connection.GeneratedDriverBase;
+import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer;
+import org.apache.plc4x.java.spi.connection.SingleProtocolStackConfigurer;
+import org.apache.plc4x.java.spi.optimizer.BaseOptimizer;
+import org.apache.plc4x.java.spi.optimizer.SingleTagOptimizer;
+import org.apache.plc4x.java.spi.values.PlcValueHandler;
+
+import java.util.function.ToIntFunction;
+
+public class OpenProtocolDriver extends GeneratedDriverBase<OpenProtocolMessage> {
+
+    @Override
+    public String getProtocolCode() {
+        return "open-protocol";
+    }
+
+    @Override
+    public String getProtocolName() {
+        return "Open-Protocol";
+    }
+
+    @Override
+    protected Class<? extends Configuration> getConfigurationType() {
+        return OpenProtocolConfiguration.class;
+    }
+
+    @Override
+    protected String getDefaultTransport() {
+        return "tcp";
+    }
+
+    @Override
+    public PlcDriverMetadata getMetadata() {
+        return new PlcDriverMetadata() {
+            @Override
+            public boolean canDiscover() {
+                return false;
+            }
+        };
+    }
+
+    @Override
+    protected boolean awaitSetupComplete() {
+        return false;
+    }
+
+    @Override
+    protected boolean awaitDisconnectComplete() {
+        return false;
+    }
+
+    @Override
+    protected boolean canRead() {
+        return true;
+    }
+
+    @Override
+    protected boolean canWrite() {
+        return true;
+    }
+
+    @Override
+    protected BaseOptimizer getOptimizer() {
+        return new SingleTagOptimizer();
+    }
+
+    @Override
+    protected OpenProtocolTagHandler getTagHandler() {
+        return new OpenProtocolTagHandler();
+    }
+
+    @Override
+    protected org.apache.plc4x.java.api.value.PlcValueHandler getValueHandler() {
+        return new PlcValueHandler();
+    }
+
+    @Override
+    protected ProtocolStackConfigurer<OpenProtocolMessage> getStackConfigurer() {
+        return SingleProtocolStackConfigurer.builder(OpenProtocolMessage.class,
+                OpenProtocolMessage::staticParse)
+            .withProtocol(OpenProtocolProtocolLogic.class)
+            .withPacketSizeEstimator(ByteLengthEstimator.class)
+            .build();
+    }
+
+    /** Estimate the Length of a Packet */
+    public static class ByteLengthEstimator implements ToIntFunction<ByteBuf> {
+        @Override
+        public int applyAsInt(ByteBuf byteBuf) {
+            if (byteBuf.readableBytes() >= 6) {
+                return byteBuf.getUnsignedShort(byteBuf.readerIndex() + 4) + 6;
+            }
+            return -1;
+        }
+    }
+
+    @Override
+    public OpenProtocolTag prepareTag(String tagAddress){
+        return OpenProtocolTag.of(tagAddress);
+    }
+
+}
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
new file mode 100644
index 0000000000..18252b2a3a
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/config/OpenProtocolConfiguration.java
@@ -0,0 +1,38 @@
+/*
+ * 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.openprotocol.config;
+
+import org.apache.plc4x.java.openprotocol.readwrite.Constants;
+import org.apache.plc4x.java.spi.configuration.Configuration;
+import org.apache.plc4x.java.transport.tcp.TcpTransportConfiguration;
+
+public class OpenProtocolConfiguration implements Configuration, TcpTransportConfiguration {
+
+    @Override
+    public int getDefaultPort() {
+        return Constants.TCPDEFAULTPORT;
+    }
+
+    @Override
+    public String toString() {
+        return "OpenProtocolConfiguration{" +
+            '}';
+    }
+
+}
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/protocol/OpenProtocolProtocolLogic.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/protocol/OpenProtocolProtocolLogic.java
new file mode 100644
index 0000000000..deafb87871
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/protocol/OpenProtocolProtocolLogic.java
@@ -0,0 +1,76 @@
+/*
+ * 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.openprotocol.protocol;
+
+import org.apache.plc4x.java.api.messages.*;
+import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
+import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
+import org.apache.plc4x.java.openprotocol.readwrite.OpenProtocolMessage;
+import org.apache.plc4x.java.spi.ConversationContext;
+import org.apache.plc4x.java.spi.Plc4xProtocolBase;
+import org.apache.plc4x.java.spi.messages.PlcSubscriber;
+import org.apache.plc4x.java.spi.model.DefaultPlcConsumerRegistration;
+
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
+
+public class OpenProtocolProtocolLogic extends Plc4xProtocolBase<OpenProtocolMessage> implements PlcSubscriber {
+
+    @Override
+    public void onConnect(ConversationContext<OpenProtocolMessage> context) {
+    }
+
+    @Override
+    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
+        CompletableFuture<PlcWriteResponse> future = new CompletableFuture<>();
+        return future;
+    }
+
+    @Override
+    public CompletableFuture<PlcSubscriptionResponse> subscribe(PlcSubscriptionRequest subscriptionRequest) {
+        CompletableFuture<PlcSubscriptionResponse> future = new CompletableFuture<>();
+        return future;
+    }
+
+    @Override
+    public CompletableFuture<PlcUnsubscriptionResponse> unsubscribe(PlcUnsubscriptionRequest unsubscriptionRequest) {
+        return null;
+    }
+
+    @Override
+    protected void decode(ConversationContext<OpenProtocolMessage> context, OpenProtocolMessage msg) {
+    }
+
+    @Override
+    public void close(ConversationContext<OpenProtocolMessage> context) {
+    }
+
+    @Override
+    public PlcConsumerRegistration register(Consumer<PlcSubscriptionEvent> consumer, Collection<PlcSubscriptionHandle> collection) {
+        final DefaultPlcConsumerRegistration consumerRegistration =
+            new DefaultPlcConsumerRegistration(this, consumer, collection.toArray(new PlcSubscriptionHandle[0]));
+        return consumerRegistration;
+    }
+
+    @Override
+    public void unregister(PlcConsumerRegistration plcConsumerRegistration) {
+    }
+
+}
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/tag/OpenProtocolTag.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/tag/OpenProtocolTag.java
new file mode 100644
index 0000000000..8b94ad63fa
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/tag/OpenProtocolTag.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   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.openprotocol.tag;
+
+import org.apache.plc4x.java.api.model.ArrayInfo;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.api.types.PlcValueType;
+
+import java.util.List;
+
+public class OpenProtocolTag implements PlcTag {
+
+    public static OpenProtocolTag of(String addressString) {
+        return null;
+    }
+
+    @Override
+    public String getAddressString() {
+        return null;
+    }
+
+    @Override
+    public PlcValueType getPlcValueType() {
+        return PlcTag.super.getPlcValueType();
+    }
+
+    @Override
+    public List<ArrayInfo> getArrayInfo() {
+        return PlcTag.super.getArrayInfo();
+    }
+
+}
diff --git a/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/tag/OpenProtocolTagHandler.java b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/tag/OpenProtocolTagHandler.java
new file mode 100644
index 0000000000..5a7be0b523
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/java/org/apache/plc4x/java/openprotocol/tag/OpenProtocolTagHandler.java
@@ -0,0 +1,38 @@
+/*
+ * 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.openprotocol.tag;
+
+import org.apache.plc4x.java.api.exceptions.PlcInvalidTagException;
+import org.apache.plc4x.java.api.model.PlcQuery;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.spi.connection.PlcTagHandler;
+
+public class OpenProtocolTagHandler implements PlcTagHandler {
+
+    @Override
+    public PlcTag parseTag(String tagAddress) {
+        throw new PlcInvalidTagException(tagAddress);
+    }
+
+    @Override
+    public PlcQuery parseQuery(String query) {
+        throw new UnsupportedOperationException("This driver doesn't support browsing");
+    }
+
+}
diff --git a/plc4j/drivers/open-protocol/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver b/plc4j/drivers/open-protocol/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
new file mode 100644
index 0000000000..912141435a
--- /dev/null
+++ b/plc4j/drivers/open-protocol/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+org.apache.plc4x.java.openprotocol.OpenProtocolDriver
diff --git a/plc4j/drivers/pom.xml b/plc4j/drivers/pom.xml
index 6c85845ad3..c0b47ba33a 100644
--- a/plc4j/drivers/pom.xml
+++ b/plc4j/drivers/pom.xml
@@ -44,6 +44,7 @@
     <module>firmata</module>
     <module>knxnetip</module>
     <module>mock</module>
+    <module>open-protocol</module>
     <module>modbus</module>
     <module>opcua</module>
     <module>plc4x</module>
diff --git a/protocols/open-protocol/src/main/resources/protocols/openprotocol/open-protocol.mspec b/protocols/open-protocol/src/main/resources/protocols/openprotocol/open-protocol.mspec
index 3b3697f21d..91234ac3ed 100644
--- a/protocols/open-protocol/src/main/resources/protocols/openprotocol/open-protocol.mspec
+++ b/protocols/open-protocol/src/main/resources/protocols/openprotocol/open-protocol.mspec
@@ -25,34 +25,34 @@
 ]
 
 [discriminatedType OpenProtocolMessage
-    [implicit      uint 32              length               'lengthInBytes'      encoding="AsciiUint"]
-    [discriminator MID                  mid                                                           ]
-    [simple        OpenProtocolRevision revision                                                      ]
-    [simple        uint 8               noAckFlag                                                     ]
-    [simple        uint 16              stationId                                 encoding="AsciiUint"]
-    [simple        uint 16              spindleId                                 encoding="AsciiUint"]
-    [simple        uint 16              sequenceNumber                            encoding="AsciiUint"]
-    [simple        uint 8               numberOfMessageParts                      encoding="AsciiUint"]
-    [simple        uint 8               messagePartNumber                         encoding="AsciiUint"]
+    [implicit      uint 32              length               'lengthInBytes'      encoding='"AsciiUint"']
+    [discriminator Mid                  mid                                                             ]
+    [simple        OpenProtocolRevision revision                                                        ]
+    [simple        uint 8               noAckFlag                                                       ]
+    [simple        uint 16              stationId                                 encoding='"AsciiUint"']
+    [simple        uint 16              spindleId                                 encoding='"AsciiUint"']
+    [simple        uint 16              sequenceNumber                            encoding='"AsciiUint"']
+    [simple        uint 8               numberOfMessageParts                      encoding='"AsciiUint"']
+    [simple        uint 8               messagePartNumber                         encoding='"AsciiUint"']
     [typeSwitch mid
         ['ApplicationCommunicationStart' *ApplicationCommunicationStart
         ]
-        ['ApplicationCommunicationStartAcknowledge' *ApplicationCommunicationStartAcknowledge(revision)
+        ['ApplicationCommunicationStartAcknowledge' *ApplicationCommunicationStartAcknowledge(OpenProtocolRevision revision)
             [array ApplicationCommunicationStartAcknowledgeBlock blocks           count 'revision.numCommunicationStartAcknowledgeBlocks']
         ]
         ['ApplicationCommunicationStop' *ApplicationCommunicationStop
         ]
         ['ApplicationCommandError' *ApplicationCommandError
-            [simple MID                  requestMid]
+            [simple Mid                  requestMid]
             [simple Error                error     ]
         ]
         ['ApplicationCommandAccepted' *ApplicationCommandAccepted
-            [simple MID                  requestMid]
+            [simple Mid                  requestMid]
         ]
         ['ApplicationGenericDataRequest' *ApplicationGenericDataRequest
-            [simple   MID                  requestMid                             ]
+            [simple   Mid                  requestMid                             ]
             [simple   OpenProtocolRevision wantedRevision                         ]
-            [implicit uint 16              extraDataLength 'LEN(extraData)'       ]
+            [implicit uint 16              extraDataLength 'COUNT(extraData)'     ]
             [array    byte                 extraData       count 'extraDataLength']
         ]
     ]
@@ -60,80 +60,80 @@
 ]
 
 [discriminatedType ApplicationCommunicationStartAcknowledgeBlock
-    [discriminator uint 16 blockType encoding="AsciiUint"]
+    [discriminator uint 16 blockType encoding='"AsciiUint"']
     [typeSwitch blockType
         // Revision 1
-        ['01' *CellId
-            [simple   uint 32    cellId                    encoding="AsciiUint"]
+        ['1' *CellId
+            [simple   uint 32    cellId                    encoding='"AsciiUint"']
         ]
-        ['02' *ChannelId
-            [simple   uint 16    channelId                 encoding="AsciiUint"]
+        ['2' *ChannelId
+            [simple   uint 16    channelId                 encoding='"AsciiUint"']
         ]
-        ['03' *ControllerName
-            [simple   string 200 controllerName            encoding="ASCII"    ]
+        ['3' *ControllerName
+            [simple   string 200 controllerName            encoding='"ASCII"'    ]
         ]
 
         // Additional Blocks for Revision 2
-        ['04' *SupplierCode
-            [simple   uint 24    supplierCode              encoding="AsciiUint"]
+        ['4' *SupplierCode
+            [simple   uint 24    supplierCode              encoding='"AsciiUint"']
         ]
 
         // Additional Blocks for Revision 3
-        ['05' *OpenProtocolVersion
-            [simple   string 152 openProtocolVersion       encoding="ASCII"    ]
+        ['5' *OpenProtocolVersion
+            [simple   string 152 openProtocolVersion       encoding='"ASCII"'    ]
         ]
-        ['06' *ControllerSoftwareVersion
-            [simple   string 152 controllerSoftwareVersion encoding="ASCII"    ]
+        ['6' *ControllerSoftwareVersion
+            [simple   string 152 controllerSoftwareVersion encoding='"ASCII"'    ]
         ]
-        ['07' *ToolSoftwareVersion
-            [simple   string 152 toolSoftwareVersion       encoding="ASCII"    ]
+        ['7' *ToolSoftwareVersion
+            [simple   string 152 toolSoftwareVersion       encoding='"ASCII"'    ]
         ]
 
         // Additional Blocks for Revision 4
-        ['08' *RbuType
-            [simple   string 192 rbuType                   encoding="ASCII"    ]
+        ['8' *RbuType
+            [simple   string 192 rbuType                   encoding='"ASCII"'    ]
         ]
-        ['09' *ControllerSerialNumber
-            [simple   string 80  controllerSerialNumber    encoding="ASCII"    ]
+        ['9' *ControllerSerialNumber
+            [simple   string 80  controllerSerialNumber    encoding='"ASCII"'    ]
         ]
 
         // Additional Blocks for Revision 5
         ['10' *SystemType
-            [simple   string 24  systemType                encoding="ASCII"    ]
+            [simple   string 24  systemType                encoding='"ASCII"'    ]
         ]
         ['11' *SystemSubtype
-            [simple   string 24  systemSubtype             encoding="ASCII"    ]
+            [simple   string 24  systemSubtype             encoding='"ASCII"'    ]
         ]
 
         // Additional Blocks for Revision 6
         ['12' *SequenceNumberSupport
-            [reserved uint 7     0                                             ]
+            [reserved uint 7     '0x00'                                        ]
             [simple   bit        sequenceNumberSupport                         ]
         ]
         ['13' *LinkingHandlingSupport
-            [reserved uint 7     0                                             ]
+            [reserved uint 7     '0x00'                                        ]
             [simple   bit        linkingHandlingSupport                        ]
         ]
         ['14' *StationId
-            [simple   string 80  stationId                 encoding="ASCII"    ]
+            [simple   string 80  stationId                 encoding='"ASCII"'    ]
         ]
         ['15' *StationName
-            [simple   string 200 stationName               encoding="ASCII"    ]
+            [simple   string 200 stationName               encoding='"ASCII"'    ]
         ]
         ['16' *ClientId
-            [simple   uint 8     clientId                  encoding="AsciiUint"]
+            [simple   uint 8     clientId                  encoding='"AsciiUint"']
         ]
     ]
 ]
 
 // Depending on the revision of the device, a different number of blocks are supported.
-[enum uint 24 OpenProtocolRevision(uint 8 numCommunicationStartAcknowledgeBlocks) encoding="AsciiUint"
-    ['1' Revision1                (       3                                     )]
-    ['2' Revision2                (       4                                     )]
-    ['3' Revision3                (       7                                     )]
-    ['4' Revision4                (       9                                     )]
-    ['5' Revision5                (       11                                    )]
-    ['6' Revision6                (       16                                    )]
+[enum uint 24 OpenProtocolRevision(uint 8 numCommunicationStartAcknowledgeBlocks) encoding='"AsciiUint"'
+    ['1' Revision1                [       '3'                                   ]]
+    ['2' Revision2                [       '4'                                   ]]
+    ['3' Revision3                [       '7'                                   ]]
+    ['4' Revision4                [       '9'                                   ]]
+    ['5' Revision5                [       '11'                                  ]]
+    ['6' Revision6                [       '16'                                  ]]
 ]
 
 [enum MidTypes
@@ -160,193 +160,193 @@
     [NewGroupsMessage                   ] // 2600 - 9999
 ]
 
-[enum uint 32 Mid   encoding="AsciiUint"
-    ['0001' ApplicationCommunicationStart               ] // *
-    ['0002' ApplicationCommunicationStartAcknowledge    ] // *
-    ['0003' ApplicationCommunicationStop                ]
-    ['0004' ApplicationCommandError                     ] // *
-    ['0005' ApplicationCommandAccepted                  ] // *
-    ['0006' ApplicationGenericDataRequest               ]
-    ['0007' Reserved                                    ]
-    ['0008' ApplicationGenericSubscription              ] // *
-    ['0009' ApplicationGenericUnsubscribe               ] // *
-    ['0010' ParameterSetIdUploadRequest                 ] // *
-    ['0011' ParameterSetIdUploadReply                   ] // *
-    ['0012' ParameterSetDataUploadRequest               ] // *
-    ['0013' ParameterSetDataUploadReply                 ] // *
-    ['0014' ParameterSetSelectedSubscribe               ]
-    ['0015' ParameterSetSelected                        ]
-    ['0016' ParameterSetSelectedAcknowledge             ]
-    ['0017' ParameterSetSelectedUnsubscribe             ]
-    ['0018' SelectParameterSet                          ] // *
-    ['0019' SetParameterSetBatchSize                    ]
-    ['0020' ResetParameterSetBatchCounter               ]
-    ['0021' LockAtBatchDoneSubscribe                    ]
-    ['0022' LockAtBatchDoneUpload                       ]
-    ['0023' LockAtBatchDoneUploadAcknowledge            ]
-    ['0024' LockAtBatchDoneUnsubscribe                  ]
-    ['0025' ReservedForFord                             ]
-
-    ['0030' JobIdUploadRequest                          ]
-    ['0031' JobIdUploadReply                            ]
-    ['0032' JobDataUploadRequest                        ]
-    ['0033' JobDataUploadReply                          ]
-    ['0034' JobInfoSubscribe                            ]
-    ['0035' JobInfo                                     ]
-    ['0036' JobInfoAcknowledge                          ]
-    ['0037' JobInfoUnsubscribe                          ]
-    ['0038' SelectJob                                   ]
-    ['0039' JobRestart                                  ]
-    ['0040' ToolDataUploadRequest                       ]
-    ['0041' ToolDataUploadReply                         ]
-    ['0042' DisableTool                                 ] // *
-    ['0043' EnableTool                                  ] // *
-    ['0044' DisconnectToolRequest                       ]
-    ['0045' SetCalibrationValueRequest                  ]
-    ['0046' SetPrimaryToolRequest                       ]
-    ['0047' PairingHandling                             ]
-    ['0048' PairingStatus                               ]
-    ['0049' PairingStatusAcknowledge                    ]
-    ['0050' VehicleIdNumberDownloadRequest              ]
-    ['0051' VehicleIdNumberSubscribe                    ]
-    ['0052' VehicleIdNumber                             ]
-    ['0053' VehicleIdNumberAcknowledge                  ]
-    ['0054' VehicleIdNumberUnsubscribe                  ]
-
-    ['0060' LastTighteningResultDataSubscribe           ] // *
-    ['0061' LastTighteningResultData                    ] // *
-    ['0062' LastTighteningResultDataAcknowledge         ]
-    ['0063' LastTighteningResultDataUnsubscribe         ]
-    ['0064' OldTighteningResultUploadRequest            ]
-    ['0065' OldTighteningResultUploadReply              ]
-
-    ['0070' AlarmSubscribe                              ] // *
-    ['0071' Alarm                                       ] // *
-    ['0072' AlarmAcknowledge                            ] // *
-    ['0073' AlarmUnsubscribe                            ] // *
-    ['0074' AlarmAcknowledgedOnController               ]
-    ['0075' AlarmAcknowledgedOnControllerAcknowledge    ]
-    ['0076' AlarmStatus                                 ] // *
-    ['0077' AlarmStatusAcknowledge                      ] // *
-    ['0078' AcknowledgeAlarmRemotelyOnController        ]
-
-    ['0080' ReadTimeUploadRequest                       ]
-    ['0081' ReadTimeUploadReply                         ]
-    ['0082' SetTime                                     ] // *
-
-    ['0090' MultiSpindleStatusSubscribe                 ]
-    ['0091' MultiSpindleStatus                          ]
-    ['0092' MultiSpindleStatusAcknowledge               ]
-    ['0093' MultiSpindleStatusUnsubscribe               ]
-
-    ['0100' MultiSpindleResultSubscribe                 ]
-    ['0101' MultiSpindleResult                          ]
-    ['0102' MultiSpindleResultAcknowledge               ]
-    ['0103' MultiSpindleResultUnsubscribe               ]
-
-    ['0105' LastPowerMacsTighteningResultDataSubscribe  ]
-    ['0106' LastPowerMacsTighteningResultStationData    ]
-    ['0107' LastPowerMacsTighteningResultBoltData       ]
-    ['0108' LastPowerMacsTighteningResultDataAcknowledge]
-    ['0109' LastPowerMacsTighteningResultDataUnsubscribe]
-    ['0110' DisplayUserTextOnCompact                    ]
-    ['0111' DisplayUserTextOnGraph                      ]
-
-    ['0113' FlashGreenLightOnTool                       ]
-
-    ['0120' JobLineControlInfoSubscribe                 ]
-    ['0121' JobLineControlStarted                       ]
-    ['0122' JobLineControlAlert1                        ]
-    ['0123' JobLineControlAlert2                        ]
-    ['0124' JobLineControlDone                          ]
-    ['0125' JobLineControlInfoAcknowledge               ]
-    ['0126' JobLineControlUnsubscribe                   ]
-    ['0127' AbortJob                                    ]
-    ['0128' JobBatchIncrement                           ]
-    ['0129' JobBatchDecrement                           ]
-    ['0130' JobOff                                      ]
-    ['0131' SetJobLineControlStart                      ]
-    ['0132' SetJobLineControlAlert1                     ]
-    ['0133' SetJobLineControlAlert2                     ]
-
-    ['0140' ExecuteDynamicJobRequest                    ] // *
-
-    ['0150' IdentifierDownloadRequest                   ] // *
-    ['0151' MultipleIdentifiersWorkOrderSubscribe       ]
-    ['0152' MultipleIdentifiersWorkOrder                ]
-    ['0153' MultipleIdentifiersWorkOrderAcknowledge     ]
-    ['0154' MultipleIdentifiersWorkOrderUnsubscribe     ]
-    ['0155' BypassIdentifier                            ]
-    ['0156' ResetLatestIdentifier                       ]
-    ['0157' ResetAllIdentifiers                         ]
-
-    ['0200' SetExternalControlledRelays                 ]
-
-    ['0210' StatusExternalMonitoredInputsSubscribe      ]
-    ['0211' StatusExternalMonitoredInputs               ]
-    ['0212' StatusExternalMonitoredInputsAcknowledge    ]
-    ['0213' StatusExternalMonitoredInputsUnsubscribe    ]
-    ['0214' IoDeviceStatusRequest                       ]
-    ['0215' IoDeviceStatusReply                         ]
-    ['0216' RelayFunctionSubscribe                      ]
-    ['0217' RelayFunction                               ]
-    ['0218' RelayFunctionAcknowledge                    ]
-    ['0219' RelayFunctionUnsubscribe                    ]
-    ['0220' DigitalInputFunctionSubscribe               ]
-    ['0221' DigitalInputFunction                        ]
-    ['0222' DigitalInputFunctionAcknowledge             ]
-    ['0223' DigitalInputFunctionUnsubscribe             ]
-    ['0224' SetDigitalInputFunction                     ]
-    ['0225' ResetDigitalInputFunction                   ]
-
-    ['0240' UserDataDownload                            ]
-    ['0241' UserDataSubscribe                           ]
-    ['0242' UserData                                    ]
-    ['0243' UserDataAcknowledge                         ]
-    ['0244' UserDataUnsubscribe                         ]
-    ['0245' UserDataDownloadWithOffset                  ]
-
-    ['0250' SelectorSocketInfoSubscribe                 ]
-    ['0251' SelectorSocketInfo                          ]
-    ['0252' SelectorSocketInfoAcknowledge               ]
-    ['0253' SelectorSocketInfoUnsubscribe               ]
-    ['0254' SelectorControlGreenLights                  ]
-    ['0255' SelectorControlRedLights                    ]
-
-    ['0260' ToolTagIdRequest                            ]
-    ['0261' ToolTagIdSubscribe                          ]
-    ['0262' ToolTagId                                   ]
-    ['0263' ToolTagIdAcknowledge                        ]
-    ['0264' ToolTagIdUnsubscribe                        ]
-
-    ['0270' ControllerRebootRequest                     ]
-
-    ['0300' HistogramUploadRequest                      ]
-    ['0301' HistogramUploadReply                        ]
-
-    ['0400' AutomaticManualModeSubscribe                ]
-    ['0401' AutomaticManualMode                         ]
-    ['0402' AutomaticManualModeAcknowledge              ]
-    ['0403' AutomaticManualModeUnsubscribe              ]
-
-    ['0410' AutoDisableSettingsRequest                  ]
-    ['0411' AutoDisableSettingsReply                    ]
-
-    ['0420' OpenProtocolCommandsDisabledSubscribe       ]
-    ['0421' OpenProtocolCommandsDisabled                ]
-    ['0422' OpenProtocolCommandsDisabledAcknowledge     ]
-    ['0423' OpenProtocolCommandsDisabledUnsubscribe     ]
-
-    ['0500' MotorTuningResultDataSubscribe              ]
-    ['0501' MotorTuningResultData                       ]
-    ['0502' MotorTuningResultDataAcknowledge            ]
-    ['0503' MotorTuningResultDataUnsubscribe            ]
-    ['0504' MotorTuningRequest                          ]
-
-    ['0700' TighteningDataDownloadStatusForRadioTools   ]
-
-    ['0900' ResultTracesCurve                           ] // *
-    ['0901' ResultTracesCurvePlotData                   ] // *
+[enum uint 32 Mid   encoding='"AsciiUint"'
+    ['1' ApplicationCommunicationStart               ] // *
+    ['2' ApplicationCommunicationStartAcknowledge    ] // *
+    ['3' ApplicationCommunicationStop                ]
+    ['4' ApplicationCommandError                     ] // *
+    ['5' ApplicationCommandAccepted                  ] // *
+    ['6' ApplicationGenericDataRequest               ]
+    ['7' Reserved                                    ]
+    ['8' ApplicationGenericSubscription              ] // *
+    ['9' ApplicationGenericUnsubscribe               ] // *
+    ['10' ParameterSetIdUploadRequest                 ] // *
+    ['11' ParameterSetIdUploadReply                   ] // *
+    ['12' ParameterSetDataUploadRequest               ] // *
+    ['13' ParameterSetDataUploadReply                 ] // *
+    ['14' ParameterSetSelectedSubscribe               ]
+    ['15' ParameterSetSelected                        ]
+    ['16' ParameterSetSelectedAcknowledge             ]
+    ['17' ParameterSetSelectedUnsubscribe             ]
+    ['18' SelectParameterSet                          ] // *
+    ['19' SetParameterSetBatchSize                    ]
+    ['20' ResetParameterSetBatchCounter               ]
+    ['21' LockAtBatchDoneSubscribe                    ]
+    ['22' LockAtBatchDoneUpload                       ]
+    ['23' LockAtBatchDoneUploadAcknowledge            ]
+    ['24' LockAtBatchDoneUnsubscribe                  ]
+    ['25' ReservedForFord                             ]
+
+    ['30' JobIdUploadRequest                          ]
+    ['31' JobIdUploadReply                            ]
+    ['32' JobDataUploadRequest                        ]
+    ['33' JobDataUploadReply                          ]
+    ['34' JobInfoSubscribe                            ]
+    ['35' JobInfo                                     ]
+    ['36' JobInfoAcknowledge                          ]
+    ['37' JobInfoUnsubscribe                          ]
+    ['38' SelectJob                                   ]
+    ['39' JobRestart                                  ]
+    ['40' ToolDataUploadRequest                       ]
+    ['41' ToolDataUploadReply                         ]
+    ['42' DisableTool                                 ] // *
+    ['43' EnableTool                                  ] // *
+    ['44' DisconnectToolRequest                       ]
+    ['45' SetCalibrationValueRequest                  ]
+    ['46' SetPrimaryToolRequest                       ]
+    ['47' PairingHandling                             ]
+    ['48' PairingStatus                               ]
+    ['49' PairingStatusAcknowledge                    ]
+    ['50' VehicleIdNumberDownloadRequest              ]
+    ['51' VehicleIdNumberSubscribe                    ]
+    ['52' VehicleIdNumber                             ]
+    ['53' VehicleIdNumberAcknowledge                  ]
+    ['54' VehicleIdNumberUnsubscribe                  ]
+
+    ['60' LastTighteningResultDataSubscribe           ] // *
+    ['61' LastTighteningResultData                    ] // *
+    ['62' LastTighteningResultDataAcknowledge         ]
+    ['63' LastTighteningResultDataUnsubscribe         ]
+    ['64' OldTighteningResultUploadRequest            ]
+    ['65' OldTighteningResultUploadReply              ]
+
+    ['70' AlarmSubscribe                              ] // *
+    ['71' Alarm                                       ] // *
+    ['72' AlarmAcknowledge                            ] // *
+    ['73' AlarmUnsubscribe                            ] // *
+    ['74' AlarmAcknowledgedOnController               ]
+    ['75' AlarmAcknowledgedOnControllerAcknowledge    ]
+    ['76' AlarmStatus                                 ] // *
+    ['77' AlarmStatusAcknowledge                      ] // *
+    ['78' AcknowledgeAlarmRemotelyOnController        ]
+
+    ['80' ReadTimeUploadRequest                       ]
+    ['81' ReadTimeUploadReply                         ]
+    ['82' SetTime                                     ] // *
+
+    ['90' MultiSpindleStatusSubscribe                 ]
+    ['91' MultiSpindleStatus                          ]
+    ['92' MultiSpindleStatusAcknowledge               ]
+    ['93' MultiSpindleStatusUnsubscribe               ]
+
+    ['100' MultiSpindleResultSubscribe                 ]
+    ['101' MultiSpindleResult                          ]
+    ['102' MultiSpindleResultAcknowledge               ]
+    ['103' MultiSpindleResultUnsubscribe               ]
+
+    ['105' LastPowerMacsTighteningResultDataSubscribe  ]
+    ['106' LastPowerMacsTighteningResultStationData    ]
+    ['107' LastPowerMacsTighteningResultBoltData       ]
+    ['108' LastPowerMacsTighteningResultDataAcknowledge]
+    ['109' LastPowerMacsTighteningResultDataUnsubscribe]
+    ['110' DisplayUserTextOnCompact                    ]
+    ['111' DisplayUserTextOnGraph                      ]
+
+    ['113' FlashGreenLightOnTool                       ]
+
+    ['120' JobLineControlInfoSubscribe                 ]
+    ['121' JobLineControlStarted                       ]
+    ['122' JobLineControlAlert1                        ]
+    ['123' JobLineControlAlert2                        ]
+    ['124' JobLineControlDone                          ]
+    ['125' JobLineControlInfoAcknowledge               ]
+    ['126' JobLineControlUnsubscribe                   ]
+    ['127' AbortJob                                    ]
+    ['128' JobBatchIncrement                           ]
+    ['129' JobBatchDecrement                           ]
+    ['130' JobOff                                      ]
+    ['131' SetJobLineControlStart                      ]
+    ['132' SetJobLineControlAlert1                     ]
+    ['133' SetJobLineControlAlert2                     ]
+
+    ['140' ExecuteDynamicJobRequest                    ] // *
+
+    ['150' IdentifierDownloadRequest                   ] // *
+    ['151' MultipleIdentifiersWorkOrderSubscribe       ]
+    ['152' MultipleIdentifiersWorkOrder                ]
+    ['153' MultipleIdentifiersWorkOrderAcknowledge     ]
+    ['154' MultipleIdentifiersWorkOrderUnsubscribe     ]
+    ['155' BypassIdentifier                            ]
+    ['156' ResetLatestIdentifier                       ]
+    ['157' ResetAllIdentifiers                         ]
+
+    ['200' SetExternalControlledRelays                 ]
+
+    ['210' StatusExternalMonitoredInputsSubscribe      ]
+    ['211' StatusExternalMonitoredInputs               ]
+    ['212' StatusExternalMonitoredInputsAcknowledge    ]
+    ['213' StatusExternalMonitoredInputsUnsubscribe    ]
+    ['214' IoDeviceStatusRequest                       ]
+    ['215' IoDeviceStatusReply                         ]
+    ['216' RelayFunctionSubscribe                      ]
+    ['217' RelayFunction                               ]
+    ['218' RelayFunctionAcknowledge                    ]
+    ['219' RelayFunctionUnsubscribe                    ]
+    ['220' DigitalInputFunctionSubscribe               ]
+    ['221' DigitalInputFunction                        ]
+    ['222' DigitalInputFunctionAcknowledge             ]
+    ['223' DigitalInputFunctionUnsubscribe             ]
+    ['224' SetDigitalInputFunction                     ]
+    ['225' ResetDigitalInputFunction                   ]
+
+    ['240' UserDataDownload                            ]
+    ['241' UserDataSubscribe                           ]
+    ['242' UserData                                    ]
+    ['243' UserDataAcknowledge                         ]
+    ['244' UserDataUnsubscribe                         ]
+    ['245' UserDataDownloadWithOffset                  ]
+
+    ['250' SelectorSocketInfoSubscribe                 ]
+    ['251' SelectorSocketInfo                          ]
+    ['252' SelectorSocketInfoAcknowledge               ]
+    ['253' SelectorSocketInfoUnsubscribe               ]
+    ['254' SelectorControlGreenLights                  ]
+    ['255' SelectorControlRedLights                    ]
+
+    ['260' ToolTagIdRequest                            ]
+    ['261' ToolTagIdSubscribe                          ]
+    ['262' ToolTagId                                   ]
+    ['263' ToolTagIdAcknowledge                        ]
+    ['264' ToolTagIdUnsubscribe                        ]
+
+    ['270' ControllerRebootRequest                     ]
+
+    ['300' HistogramUploadRequest                      ]
+    ['301' HistogramUploadReply                        ]
+
+    ['400' AutomaticManualModeSubscribe                ]
+    ['401' AutomaticManualMode                         ]
+    ['402' AutomaticManualModeAcknowledge              ]
+    ['403' AutomaticManualModeUnsubscribe              ]
+
+    ['410' AutoDisableSettingsRequest                  ]
+    ['411' AutoDisableSettingsReply                    ]
+
+    ['420' OpenProtocolCommandsDisabledSubscribe       ]
+    ['421' OpenProtocolCommandsDisabled                ]
+    ['422' OpenProtocolCommandsDisabledAcknowledge     ]
+    ['423' OpenProtocolCommandsDisabledUnsubscribe     ]
+
+    ['500' MotorTuningResultDataSubscribe              ]
+    ['501' MotorTuningResultData                       ]
+    ['502' MotorTuningResultDataAcknowledge            ]
+    ['503' MotorTuningResultDataUnsubscribe            ]
+    ['504' MotorTuningRequest                          ]
+
+    ['700' TighteningDataDownloadStatusForRadioTools   ]
+
+    ['900' ResultTracesCurve                           ] // *
+    ['901' ResultTracesCurvePlotData                   ] // *
 
     ['1201' LastOperationResultOverallData              ]
     ['1202' LastOperationResultObjectData               ]
@@ -379,17 +379,17 @@
     ['9999' KeepAliveOpenProtocolCommunication          ] // *
 ]
 
-[enum uint 16 Error encoding="AsciiUint"
-    ['00' NoError]
-    ['01' InvalidData]
-    ['02' ParameterSetIdNotPresent]
-    ['03' ParameterSetCanNotBeSet]
-    ['04' ParameterSetNotRunning]
-
-    ['06' VinUploadSubscriptionAlreadyExists]
-    ['07' VinUploadSubscriptionDoesNotExist]
-    ['08' VinInputSourceNotGranted]
-    ['09' LastTighteningResultSubscriptionAlreadyExists]
+[enum uint 16 Error encoding='"AsciiUint"'
+    ['0'  NoError]
+    ['1'  InvalidData]
+    ['2'  ParameterSetIdNotPresent]
+    ['3'  ParameterSetCanNotBeSet]
+    ['4'  ParameterSetNotRunning]
+
+    ['6'  VinUploadSubscriptionAlreadyExists]
+    ['7'  VinUploadSubscriptionDoesNotExist]
+    ['8'  VinInputSourceNotGranted]
+    ['9'  LastTighteningResultSubscriptionAlreadyExists]
     ['10' LastTighteningResultSubscriptionDoesNowExist]
     ['11' AlarmSubscriptionAlreadyExists]
     ['12' AlarmSubscriptionDoesNotExist]