You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2023/02/13 11:04:04 UTC

[plc4x] 01/02: fix(plc4j/profinet): split profinet mspec and checked endianess of PNIO packets

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

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

commit 635602db1c74f2d5056d257a7c94274ea8c387c8
Author: Ben Hutcheson <be...@gmail.com>
AuthorDate: Sat Feb 11 10:05:29 2023 +0100

    fix(plc4j/profinet): split profinet mspec and checked endianess of PNIO packets
---
 .../profinet/readwrite/PcDcp_Pdu_DelayReq.java     |  115 +-
 .../plc4x/java/profinet/readwrite/PnDcp_Block.java |   32 +-
 .../PnDcp_Block_DevicePropertiesAliasName.java     |   26 +-
 .../PnDcp_Block_DevicePropertiesDeviceId.java      |   37 +-
 ...PnDcp_Block_DevicePropertiesDeviceInstance.java |   31 +-
 .../PnDcp_Block_DevicePropertiesDeviceOptions.java |   18 +-
 .../PnDcp_Block_DevicePropertiesDeviceRole.java    |   72 +-
 .../PnDcp_Block_DevicePropertiesDeviceVendor.java  |   26 +-
 .../PnDcp_Block_DevicePropertiesNameOfStation.java |   26 +-
 .../readwrite/PnDcp_Block_IpMacAddress.java        |   18 +-
 .../readwrite/PnDcp_Block_IpParameter.java         |   92 +-
 .../plc4x/java/profinet/readwrite/PnDcp_Pdu.java   |   15 +-
 .../profinet/readwrite/PnDcp_Pdu_AlarmLow.java     |  136 +-
 .../profinet/readwrite/PnDcp_Pdu_IdentifyReq.java  |  101 +-
 .../profinet/readwrite/PnDcp_Pdu_IdentifyRes.java  |   96 +-
 .../readwrite/PnDcp_Pdu_IdentifyRes_Payload.java   |   49 +-
 .../readwrite/PnDcp_Pdu_RealTimeCyclic.java        |  115 +-
 .../java/profinet/readwrite/PnDcp_ServiceType.java |   44 +-
 .../readwrite/PnDcp_SupportedDeviceOption.java     |   20 +-
 .../readwrite/PnIoCm_DataUnitDataObject.java       |   21 +-
 .../profinet/readwrite/PnIoCm_DataUnitIoCs.java    |   43 +-
 .../PnIoCm_ExpectedSubmoduleBlockReqApi.java       |   73 +-
 .../profinet/readwrite/PnIoCm_IoCrBlockReqApi.java |   52 +-
 .../plc4x/java/profinet/readwrite/PnIoCm_IoCs.java |   40 +-
 .../profinet/readwrite/PnIoCm_IoDataObject.java    |   34 +-
 .../java/profinet/readwrite/PnIoCm_Packet.java     |    6 +
 .../{UserData.java => PnIoCm_Packet_Fault.java}    |   97 +-
 .../{UserData.java => PnIoCm_Packet_NoCall.java}   |   91 +-
 .../{UserData.java => PnIoCm_Packet_Ping.java}     |   90 +-
 .../java/profinet/readwrite/PnIoCm_Submodule.java  |   77 +-
 .../PnIoCm_Submodule_InputAndOutputData.java       |   88 +-
 .../readwrite/PnIoCm_Submodule_InputData.java      |   46 +-
 .../PnIoCm_Submodule_NoInputNoOutputData.java      |   36 +-
 .../readwrite/PnIoCm_Submodule_OutputData.java     |   46 +-
 .../plc4x/java/profinet/readwrite/UserData.java    |   12 +-
 .../plc4x/protocol/profinet/ProfinetProtocol.java  |   25 +-
 .../main/resources/protocols/profinet/dcerpc.mspec |  159 +++
 .../resources/protocols/profinet/ethernet.mspec    |  110 ++
 .../main/resources/protocols/profinet/lldp.mspec   |  166 +++
 .../main/resources/protocols/profinet/pndcp.mspec  |  407 ++++++
 .../main/resources/protocols/profinet/pnio.mspec   |  644 +++++++++
 .../resources/protocols/profinet/profinet.mspec    | 1431 --------------------
 42 files changed, 2915 insertions(+), 1948 deletions(-)

diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java
index cd11e338df..d1d5946b72 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PcDcp_Pdu_DelayReq.java
@@ -103,46 +103,78 @@ public class PcDcp_Pdu_DelayReq extends PnDcp_Pdu implements Message {
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (long) 0x00000000,
-        writeUnsignedLong(writeBuffer, 32));
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField1 != null ? reservedField1 : (long) 0x00000000,
-        writeUnsignedLong(writeBuffer, 32));
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField2 != null ? reservedField2 : (long) 0x00000000,
-        writeUnsignedLong(writeBuffer, 32));
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (sequenceId)
-    writeSimpleField("sequenceId", sequenceId, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "sequenceId",
+        sequenceId,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField3 != null ? reservedField3 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (delayInNs)
-    writeSimpleField("delayInNs", delayInNs, writeUnsignedLong(writeBuffer, 32));
+    writeSimpleField(
+        "delayInNs",
+        delayInNs,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (parameterType)
-    writeConstField("parameterType", PARAMETERTYPE, writeUnsignedShort(writeBuffer, 7));
+    writeConstField(
+        "parameterType",
+        PARAMETERTYPE,
+        writeUnsignedShort(writeBuffer, 7),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (parameterLength)
-    writeConstField("parameterLength", PARAMETERLENGTH, writeUnsignedInt(writeBuffer, 9));
+    writeConstField(
+        "parameterLength",
+        PARAMETERLENGTH,
+        writeUnsignedInt(writeBuffer, 9),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (portMacAddress)
-    writeSimpleField("portMacAddress", portMacAddress, new DataWriterComplexDefault<>(writeBuffer));
+    writeSimpleField(
+        "portMacAddress",
+        portMacAddress,
+        new DataWriterComplexDefault<>(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (endType)
-    writeConstField("endType", ENDTYPE, writeUnsignedShort(writeBuffer, 7));
+    writeConstField(
+        "endType",
+        ENDTYPE,
+        writeUnsignedShort(writeBuffer, 7),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (endLength)
-    writeConstField("endLength", ENDLENGTH, writeUnsignedInt(writeBuffer, 9));
+    writeConstField(
+        "endLength",
+        ENDLENGTH,
+        writeUnsignedInt(writeBuffer, 9),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PcDcp_Pdu_DelayReq");
   }
@@ -203,39 +235,78 @@ public class PcDcp_Pdu_DelayReq extends PnDcp_Pdu implements Message {
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Long reservedField0 =
-        readReservedField("reserved", readUnsignedLong(readBuffer, 32), (long) 0x00000000);
+        readReservedField(
+            "reserved",
+            readUnsignedLong(readBuffer, 32),
+            (long) 0x00000000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Long reservedField1 =
-        readReservedField("reserved", readUnsignedLong(readBuffer, 32), (long) 0x00000000);
+        readReservedField(
+            "reserved",
+            readUnsignedLong(readBuffer, 32),
+            (long) 0x00000000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Long reservedField2 =
-        readReservedField("reserved", readUnsignedLong(readBuffer, 32), (long) 0x00000000);
+        readReservedField(
+            "reserved",
+            readUnsignedLong(readBuffer, 32),
+            (long) 0x00000000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    int sequenceId = readSimpleField("sequenceId", readUnsignedInt(readBuffer, 16));
+    int sequenceId =
+        readSimpleField(
+            "sequenceId",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Integer reservedField3 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    long delayInNs = readSimpleField("delayInNs", readUnsignedLong(readBuffer, 32));
+    long delayInNs =
+        readSimpleField(
+            "delayInNs",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     short parameterType =
         readConstField(
-            "parameterType", readUnsignedShort(readBuffer, 7), PcDcp_Pdu_DelayReq.PARAMETERTYPE);
+            "parameterType",
+            readUnsignedShort(readBuffer, 7),
+            PcDcp_Pdu_DelayReq.PARAMETERTYPE,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int parameterLength =
         readConstField(
-            "parameterLength", readUnsignedInt(readBuffer, 9), PcDcp_Pdu_DelayReq.PARAMETERLENGTH);
+            "parameterLength",
+            readUnsignedInt(readBuffer, 9),
+            PcDcp_Pdu_DelayReq.PARAMETERLENGTH,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     MacAddress portMacAddress =
         readSimpleField(
             "portMacAddress",
-            new DataReaderComplexDefault<>(() -> MacAddress.staticParse(readBuffer), readBuffer));
+            new DataReaderComplexDefault<>(() -> MacAddress.staticParse(readBuffer), readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     short endType =
-        readConstField("endType", readUnsignedShort(readBuffer, 7), PcDcp_Pdu_DelayReq.ENDTYPE);
+        readConstField(
+            "endType",
+            readUnsignedShort(readBuffer, 7),
+            PcDcp_Pdu_DelayReq.ENDTYPE,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int endLength =
-        readConstField("endLength", readUnsignedInt(readBuffer, 9), PcDcp_Pdu_DelayReq.ENDLENGTH);
+        readConstField(
+            "endLength",
+            readUnsignedInt(readBuffer, 9),
+            PcDcp_Pdu_DelayReq.ENDLENGTH,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PcDcp_Pdu_DelayReq");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block.java
index 1d067e7ebb..9375dcff2b 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block.java
@@ -63,15 +63,24 @@ public abstract class PnDcp_Block implements Message {
         new DataWriterEnumDefault<>(
             PnDcp_BlockOptions::getValue,
             PnDcp_BlockOptions::name,
-            writeUnsignedShort(writeBuffer, 8)));
+            writeUnsignedShort(writeBuffer, 8)),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Discriminator Field (suboption) (Used as input to a switch field)
-    writeDiscriminatorField("suboption", getSuboption(), writeUnsignedShort(writeBuffer, 8));
+    writeDiscriminatorField(
+        "suboption",
+        getSuboption(),
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (blockLength) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
     int blockLength = (int) ((getLengthInBytes()) - (4));
-    writeImplicitField("blockLength", blockLength, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "blockLength",
+        blockLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Switch field (Serialize the sub-type)
     serializePnDcp_BlockChild(writeBuffer);
@@ -121,11 +130,20 @@ public abstract class PnDcp_Block implements Message {
         readDiscriminatorField(
             "option",
             new DataReaderEnumDefault<>(
-                PnDcp_BlockOptions::enumForValue, readUnsignedShort(readBuffer, 8)));
+                PnDcp_BlockOptions::enumForValue, readUnsignedShort(readBuffer, 8)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    short suboption = readDiscriminatorField("suboption", readUnsignedShort(readBuffer, 8));
-
-    int blockLength = readImplicitField("blockLength", readUnsignedInt(readBuffer, 16));
+    short suboption =
+        readDiscriminatorField(
+            "suboption",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int blockLength =
+        readImplicitField(
+            "blockLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
     PnDcp_BlockBuilder builder = null;
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java
index aed02e84ee..8c67332c28 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesAliasName.java
@@ -75,10 +75,15 @@ public class PnDcp_Block_DevicePropertiesAliasName extends PnDcp_Block implement
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (aliasNameValue)
-    writeByteArrayField("aliasNameValue", aliasNameValue, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "aliasNameValue",
+        aliasNameValue,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Padding Field (padding)
     writePaddingField(
@@ -88,7 +93,8 @@ public class PnDcp_Block_DevicePropertiesAliasName extends PnDcp_Block implement
                     aliasNameValue))
                 % (2)),
         (short) 0x00,
-        writeUnsignedShort(writeBuffer, 8));
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_DevicePropertiesAliasName");
   }
@@ -134,17 +140,25 @@ public class PnDcp_Block_DevicePropertiesAliasName extends PnDcp_Block implement
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     byte[] aliasNameValue =
-        readBuffer.readByteArray("aliasNameValue", Math.toIntExact((blockLength) - (2)));
+        readBuffer.readByteArray(
+            "aliasNameValue",
+            Math.toIntExact((blockLength) - (2)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readPaddingField(
         readUnsignedShort(readBuffer, 8),
         (int)
             ((org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.arrayLength(
                     aliasNameValue))
-                % (2)));
+                % (2)),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_DevicePropertiesAliasName");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java
index 00e4a8e8d8..eb1ee6d2f9 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceId.java
@@ -78,13 +78,22 @@ public class PnDcp_Block_DevicePropertiesDeviceId extends PnDcp_Block implements
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (vendorId)
-    writeSimpleField("vendorId", vendorId, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "vendorId",
+        vendorId,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (deviceId)
-    writeSimpleField("deviceId", deviceId, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "deviceId",
+        deviceId,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_DevicePropertiesDeviceId");
   }
@@ -121,11 +130,23 @@ public class PnDcp_Block_DevicePropertiesDeviceId extends PnDcp_Block implements
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
-
-    int vendorId = readSimpleField("vendorId", readUnsignedInt(readBuffer, 16));
-
-    int deviceId = readSimpleField("deviceId", readUnsignedInt(readBuffer, 16));
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int vendorId =
+        readSimpleField(
+            "vendorId",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int deviceId =
+        readSimpleField(
+            "deviceId",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceId");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java
index 16b54e4044..82257857da 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceInstance.java
@@ -79,13 +79,22 @@ public class PnDcp_Block_DevicePropertiesDeviceInstance extends PnDcp_Block impl
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (deviceInstanceHigh)
-    writeSimpleField("deviceInstanceHigh", deviceInstanceHigh, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "deviceInstanceHigh",
+        deviceInstanceHigh,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (deviceInstanceLow)
-    writeSimpleField("deviceInstanceLow", deviceInstanceLow, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "deviceInstanceLow",
+        deviceInstanceLow,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_DevicePropertiesDeviceInstance");
   }
@@ -122,13 +131,23 @@ public class PnDcp_Block_DevicePropertiesDeviceInstance extends PnDcp_Block impl
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     short deviceInstanceHigh =
-        readSimpleField("deviceInstanceHigh", readUnsignedShort(readBuffer, 8));
+        readSimpleField(
+            "deviceInstanceHigh",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     short deviceInstanceLow =
-        readSimpleField("deviceInstanceLow", readUnsignedShort(readBuffer, 8));
+        readSimpleField(
+            "deviceInstanceLow",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceInstance");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java
index 6fa9ff7c12..cad2ebdb24 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceOptions.java
@@ -76,10 +76,15 @@ public class PnDcp_Block_DevicePropertiesDeviceOptions extends PnDcp_Block imple
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (supportedOptions)
-    writeComplexTypeArrayField("supportedOptions", supportedOptions, writeBuffer);
+    writeComplexTypeArrayField(
+        "supportedOptions",
+        supportedOptions,
+        writeBuffer,
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_DevicePropertiesDeviceOptions");
   }
@@ -117,14 +122,19 @@ public class PnDcp_Block_DevicePropertiesDeviceOptions extends PnDcp_Block imple
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     List<PnDcp_SupportedDeviceOption> supportedOptions =
         readLengthArrayField(
             "supportedOptions",
             new DataReaderComplexDefault<>(
                 () -> PnDcp_SupportedDeviceOption.staticParse(readBuffer), readBuffer),
-            (blockLength) - (2));
+            (blockLength) - (2),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceOptions");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java
index 8804e1b437..9a0bc9a186 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceRole.java
@@ -92,25 +92,43 @@ public class PnDcp_Block_DevicePropertiesDeviceRole extends PnDcp_Block implemen
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (long) 0x000000,
-        writeUnsignedLong(writeBuffer, 20));
+        writeUnsignedLong(writeBuffer, 20),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (pnioSupervisor)
-    writeSimpleField("pnioSupervisor", pnioSupervisor, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "pnioSupervisor",
+        pnioSupervisor,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (pnioMultidevive)
-    writeSimpleField("pnioMultidevive", pnioMultidevive, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "pnioMultidevive",
+        pnioMultidevive,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (pnioController)
-    writeSimpleField("pnioController", pnioController, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "pnioController",
+        pnioController,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (pnioDevice)
-    writeSimpleField("pnioDevice", pnioDevice, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "pnioDevice",
+        pnioDevice,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField1 != null ? reservedField1 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 8));
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_DevicePropertiesDeviceRole");
   }
@@ -156,18 +174,40 @@ public class PnDcp_Block_DevicePropertiesDeviceRole extends PnDcp_Block implemen
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Long reservedField0 =
-        readReservedField("reserved", readUnsignedLong(readBuffer, 20), (long) 0x000000);
-
-    boolean pnioSupervisor = readSimpleField("pnioSupervisor", readBoolean(readBuffer));
-
-    boolean pnioMultidevive = readSimpleField("pnioMultidevive", readBoolean(readBuffer));
-
-    boolean pnioController = readSimpleField("pnioController", readBoolean(readBuffer));
-
-    boolean pnioDevice = readSimpleField("pnioDevice", readBoolean(readBuffer));
+        readReservedField(
+            "reserved",
+            readUnsignedLong(readBuffer, 20),
+            (long) 0x000000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean pnioSupervisor =
+        readSimpleField(
+            "pnioSupervisor",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean pnioMultidevive =
+        readSimpleField(
+            "pnioMultidevive",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean pnioController =
+        readSimpleField(
+            "pnioController",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean pnioDevice =
+        readSimpleField(
+            "pnioDevice", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Short reservedField1 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+        readReservedField(
+            "reserved",
+            readUnsignedShort(readBuffer, 8),
+            (short) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceRole");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java
index 0394d6aed5..f02caa6c00 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesDeviceVendor.java
@@ -75,10 +75,15 @@ public class PnDcp_Block_DevicePropertiesDeviceVendor extends PnDcp_Block implem
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (deviceVendorValue)
-    writeByteArrayField("deviceVendorValue", deviceVendorValue, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "deviceVendorValue",
+        deviceVendorValue,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Padding Field (padding)
     writePaddingField(
@@ -88,7 +93,8 @@ public class PnDcp_Block_DevicePropertiesDeviceVendor extends PnDcp_Block implem
                     deviceVendorValue))
                 % (2)),
         (short) 0x00,
-        writeUnsignedShort(writeBuffer, 8));
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_DevicePropertiesDeviceVendor");
   }
@@ -134,17 +140,25 @@ public class PnDcp_Block_DevicePropertiesDeviceVendor extends PnDcp_Block implem
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     byte[] deviceVendorValue =
-        readBuffer.readByteArray("deviceVendorValue", Math.toIntExact((blockLength) - (2)));
+        readBuffer.readByteArray(
+            "deviceVendorValue",
+            Math.toIntExact((blockLength) - (2)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readPaddingField(
         readUnsignedShort(readBuffer, 8),
         (int)
             ((org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.arrayLength(
                     deviceVendorValue))
-                % (2)));
+                % (2)),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_DevicePropertiesDeviceVendor");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java
index cbd068d825..619a6fe35c 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_DevicePropertiesNameOfStation.java
@@ -75,10 +75,15 @@ public class PnDcp_Block_DevicePropertiesNameOfStation extends PnDcp_Block imple
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (nameOfStation)
-    writeByteArrayField("nameOfStation", nameOfStation, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "nameOfStation",
+        nameOfStation,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Padding Field (padding)
     writePaddingField(
@@ -88,7 +93,8 @@ public class PnDcp_Block_DevicePropertiesNameOfStation extends PnDcp_Block imple
                     nameOfStation))
                 % (2)),
         (short) 0x00,
-        writeUnsignedShort(writeBuffer, 8));
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_DevicePropertiesNameOfStation");
   }
@@ -134,17 +140,25 @@ public class PnDcp_Block_DevicePropertiesNameOfStation extends PnDcp_Block imple
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     byte[] nameOfStation =
-        readBuffer.readByteArray("nameOfStation", Math.toIntExact((blockLength) - (2)));
+        readBuffer.readByteArray(
+            "nameOfStation",
+            Math.toIntExact((blockLength) - (2)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readPaddingField(
         readUnsignedShort(readBuffer, 8),
         (int)
             ((org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.arrayLength(
                     nameOfStation))
-                % (2)));
+                % (2)),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_DevicePropertiesNameOfStation");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java
index 15df4feceb..c2dabd7a74 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpMacAddress.java
@@ -72,10 +72,15 @@ public class PnDcp_Block_IpMacAddress extends PnDcp_Block implements Message {
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (macAddress)
-    writeSimpleField("macAddress", macAddress, new DataWriterComplexDefault<>(writeBuffer));
+    writeSimpleField(
+        "macAddress",
+        macAddress,
+        new DataWriterComplexDefault<>(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_IpMacAddress");
   }
@@ -109,12 +114,17 @@ public class PnDcp_Block_IpMacAddress extends PnDcp_Block implements Message {
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     MacAddress macAddress =
         readSimpleField(
             "macAddress",
-            new DataReaderComplexDefault<>(() -> MacAddress.staticParse(readBuffer), readBuffer));
+            new DataReaderComplexDefault<>(() -> MacAddress.staticParse(readBuffer), readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_IpMacAddress");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java
index e3fcc1e170..affe678ab3 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_IpParameter.java
@@ -109,31 +109,57 @@ public class PnDcp_Block_IpParameter extends PnDcp_Block implements Message {
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 8));
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (ipConflictDetected)
-    writeSimpleField("ipConflictDetected", ipConflictDetected, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "ipConflictDetected",
+        ipConflictDetected,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField1 != null ? reservedField1 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 5));
+        writeUnsignedShort(writeBuffer, 5),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (setViaDhcp)
-    writeSimpleField("setViaDhcp", setViaDhcp, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "setViaDhcp",
+        setViaDhcp,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (setManually)
-    writeSimpleField("setManually", setManually, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "setManually",
+        setManually,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (ipAddress)
-    writeByteArrayField("ipAddress", ipAddress, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "ipAddress",
+        ipAddress,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (subnetMask)
-    writeByteArrayField("subnetMask", subnetMask, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "subnetMask",
+        subnetMask,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (standardGateway)
-    writeByteArrayField("standardGateway", standardGateway, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "standardGateway",
+        standardGateway,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Block_IpParameter");
   }
@@ -191,22 +217,44 @@ public class PnDcp_Block_IpParameter extends PnDcp_Block implements Message {
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Short reservedField0 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
-
-    boolean ipConflictDetected = readSimpleField("ipConflictDetected", readBoolean(readBuffer));
+        readReservedField(
+            "reserved",
+            readUnsignedShort(readBuffer, 8),
+            (short) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean ipConflictDetected =
+        readSimpleField(
+            "ipConflictDetected",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Short reservedField1 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 5), (short) 0x00);
-
-    boolean setViaDhcp = readSimpleField("setViaDhcp", readBoolean(readBuffer));
-
-    boolean setManually = readSimpleField("setManually", readBoolean(readBuffer));
-
-    byte[] ipAddress = readBuffer.readByteArray("ipAddress", Math.toIntExact(4));
-
-    byte[] subnetMask = readBuffer.readByteArray("subnetMask", Math.toIntExact(4));
-
-    byte[] standardGateway = readBuffer.readByteArray("standardGateway", Math.toIntExact(4));
+        readReservedField(
+            "reserved",
+            readUnsignedShort(readBuffer, 5),
+            (short) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean setViaDhcp =
+        readSimpleField(
+            "setViaDhcp", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean setManually =
+        readSimpleField(
+            "setManually", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte[] ipAddress =
+        readBuffer.readByteArray(
+            "ipAddress", Math.toIntExact(4), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte[] subnetMask =
+        readBuffer.readByteArray(
+            "subnetMask", Math.toIntExact(4), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte[] standardGateway =
+        readBuffer.readByteArray(
+            "standardGateway", Math.toIntExact(4), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Block_IpParameter");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java
index 3422cefe19..fecec26267 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu.java
@@ -66,7 +66,11 @@ public abstract class PnDcp_Pdu implements Message {
     writeBuffer.pushContext("PnDcp_Pdu");
 
     // Simple Field (frameIdValue)
-    writeSimpleField("frameIdValue", frameIdValue, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "frameIdValue",
+        frameIdValue,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Virtual field (doesn't actually serialize anything, just makes the value available)
     PnDcp_FrameId frameId = getFrameId();
@@ -111,12 +115,17 @@ public abstract class PnDcp_Pdu implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int frameIdValue = readSimpleField("frameIdValue", readUnsignedInt(readBuffer, 16));
+    int frameIdValue =
+        readSimpleField(
+            "frameIdValue",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
     PnDcp_FrameId frameId =
         readVirtualField(
             "frameId",
             PnDcp_FrameId.class,
-            org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.getFrameId(frameIdValue));
+            org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.getFrameId(frameIdValue),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
     PnDcp_PduBuilder builder = null;
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java
index b07d37ce1c..0bed18c4a9 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_AlarmLow.java
@@ -117,36 +117,76 @@ public class PnDcp_Pdu_AlarmLow extends PnDcp_Pdu implements Message {
     writeBuffer.pushContext("PnDcp_Pdu_AlarmLow");
 
     // Simple Field (alarmDstEndpoint)
-    writeSimpleField("alarmDstEndpoint", alarmDstEndpoint, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "alarmDstEndpoint",
+        alarmDstEndpoint,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (alarmSrcEndpoint)
-    writeSimpleField("alarmSrcEndpoint", alarmSrcEndpoint, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "alarmSrcEndpoint",
+        alarmSrcEndpoint,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (version)
-    writeSimpleField("version", version, writeUnsignedByte(writeBuffer, 4));
+    writeSimpleField(
+        "version",
+        version,
+        writeUnsignedByte(writeBuffer, 4),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (errorType)
-    writeSimpleField("errorType", errorType, writeUnsignedByte(writeBuffer, 4));
+    writeSimpleField(
+        "errorType",
+        errorType,
+        writeUnsignedByte(writeBuffer, 4),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (tAck)
-    writeSimpleField("tAck", tAck, writeUnsignedByte(writeBuffer, 4));
+    writeSimpleField(
+        "tAck",
+        tAck,
+        writeUnsignedByte(writeBuffer, 4),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (windowSize)
-    writeSimpleField("windowSize", windowSize, writeUnsignedByte(writeBuffer, 4));
+    writeSimpleField(
+        "windowSize",
+        windowSize,
+        writeUnsignedByte(writeBuffer, 4),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (senSeqNum)
-    writeSimpleField("senSeqNum", senSeqNum, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "senSeqNum",
+        senSeqNum,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (ackSeqNum)
-    writeSimpleField("ackSeqNum", ackSeqNum, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "ackSeqNum",
+        ackSeqNum,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (varPartLen) (Used for parsing, but its value is not stored as it's implicitly
     // given by the objects content)
     int varPartLen = (int) (COUNT(getVarPart()));
-    writeImplicitField("varPartLen", varPartLen, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "varPartLen",
+        varPartLen,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (varPart)
-    writeByteArrayField("varPart", varPart, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "varPart",
+        varPart,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Pdu_AlarmLow");
   }
@@ -205,25 +245,63 @@ public class PnDcp_Pdu_AlarmLow extends PnDcp_Pdu implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int alarmDstEndpoint = readSimpleField("alarmDstEndpoint", readUnsignedInt(readBuffer, 16));
-
-    int alarmSrcEndpoint = readSimpleField("alarmSrcEndpoint", readUnsignedInt(readBuffer, 16));
-
-    byte version = readSimpleField("version", readUnsignedByte(readBuffer, 4));
-
-    byte errorType = readSimpleField("errorType", readUnsignedByte(readBuffer, 4));
-
-    byte tAck = readSimpleField("tAck", readUnsignedByte(readBuffer, 4));
-
-    byte windowSize = readSimpleField("windowSize", readUnsignedByte(readBuffer, 4));
-
-    int senSeqNum = readSimpleField("senSeqNum", readUnsignedInt(readBuffer, 16));
-
-    int ackSeqNum = readSimpleField("ackSeqNum", readUnsignedInt(readBuffer, 16));
-
-    int varPartLen = readImplicitField("varPartLen", readUnsignedInt(readBuffer, 16));
-
-    byte[] varPart = readBuffer.readByteArray("varPart", Math.toIntExact(varPartLen));
+    int alarmDstEndpoint =
+        readSimpleField(
+            "alarmDstEndpoint",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int alarmSrcEndpoint =
+        readSimpleField(
+            "alarmSrcEndpoint",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte version =
+        readSimpleField(
+            "version",
+            readUnsignedByte(readBuffer, 4),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte errorType =
+        readSimpleField(
+            "errorType",
+            readUnsignedByte(readBuffer, 4),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte tAck =
+        readSimpleField(
+            "tAck",
+            readUnsignedByte(readBuffer, 4),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte windowSize =
+        readSimpleField(
+            "windowSize",
+            readUnsignedByte(readBuffer, 4),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int senSeqNum =
+        readSimpleField(
+            "senSeqNum",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int ackSeqNum =
+        readSimpleField(
+            "ackSeqNum",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int varPartLen =
+        readImplicitField(
+            "varPartLen",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    byte[] varPart =
+        readBuffer.readByteArray(
+            "varPart", Math.toIntExact(varPartLen), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Pdu_AlarmLow");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java
index d72f0e438a..6c685be839 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyReq.java
@@ -93,39 +93,66 @@ public class PnDcp_Pdu_IdentifyReq extends PnDcp_Pdu implements Message {
     writeBuffer.pushContext("PnDcp_Pdu_IdentifyReq");
 
     // Const Field (serviceId)
-    writeConstField("serviceId", SERVICEID, writeUnsignedShort(writeBuffer, 8));
+    writeConstField(
+        "serviceId",
+        SERVICEID,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 5));
+        writeUnsignedShort(writeBuffer, 5),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (notSupported)
-    writeConstField("notSupported", NOTSUPPORTED, writeBoolean(writeBuffer));
+    writeConstField(
+        "notSupported",
+        NOTSUPPORTED,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField1 != null ? reservedField1 : (byte) 0x00,
-        writeUnsignedByte(writeBuffer, 1));
+        writeUnsignedByte(writeBuffer, 1),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (response)
-    writeConstField("response", RESPONSE, writeBoolean(writeBuffer));
+    writeConstField(
+        "response",
+        RESPONSE,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (xid)
-    writeSimpleField("xid", xid, writeUnsignedLong(writeBuffer, 32));
+    writeSimpleField(
+        "xid",
+        xid,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (responseDelay)
-    writeSimpleField("responseDelay", responseDelay, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "responseDelay",
+        responseDelay,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (dcpDataLength) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
     int dcpDataLength = (int) ((getLengthInBytes()) - (12));
-    writeImplicitField("dcpDataLength", dcpDataLength, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "dcpDataLength",
+        dcpDataLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (blocks)
-    writeComplexTypeArrayField("blocks", blocks, writeBuffer);
+    writeComplexTypeArrayField(
+        "blocks", blocks, writeBuffer, WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Pdu_IdentifyReq");
   }
@@ -185,31 +212,63 @@ public class PnDcp_Pdu_IdentifyReq extends PnDcp_Pdu implements Message {
 
     short serviceId =
         readConstField(
-            "serviceId", readUnsignedShort(readBuffer, 8), PnDcp_Pdu_IdentifyReq.SERVICEID);
+            "serviceId",
+            readUnsignedShort(readBuffer, 8),
+            PnDcp_Pdu_IdentifyReq.SERVICEID,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Short reservedField0 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 5), (short) 0x00);
+        readReservedField(
+            "reserved",
+            readUnsignedShort(readBuffer, 5),
+            (short) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     boolean notSupported =
-        readConstField("notSupported", readBoolean(readBuffer), PnDcp_Pdu_IdentifyReq.NOTSUPPORTED);
+        readConstField(
+            "notSupported",
+            readBoolean(readBuffer),
+            PnDcp_Pdu_IdentifyReq.NOTSUPPORTED,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Byte reservedField1 =
-        readReservedField("reserved", readUnsignedByte(readBuffer, 1), (byte) 0x00);
+        readReservedField(
+            "reserved",
+            readUnsignedByte(readBuffer, 1),
+            (byte) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     boolean response =
-        readConstField("response", readBoolean(readBuffer), PnDcp_Pdu_IdentifyReq.RESPONSE);
-
-    long xid = readSimpleField("xid", readUnsignedLong(readBuffer, 32));
-
-    int responseDelay = readSimpleField("responseDelay", readUnsignedInt(readBuffer, 16));
-
-    int dcpDataLength = readImplicitField("dcpDataLength", readUnsignedInt(readBuffer, 16));
+        readConstField(
+            "response",
+            readBoolean(readBuffer),
+            PnDcp_Pdu_IdentifyReq.RESPONSE,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    long xid =
+        readSimpleField(
+            "xid",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int responseDelay =
+        readSimpleField(
+            "responseDelay",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int dcpDataLength =
+        readImplicitField(
+            "dcpDataLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     List<PnDcp_Block> blocks =
         readLengthArrayField(
             "blocks",
             new DataReaderComplexDefault<>(() -> PnDcp_Block.staticParse(readBuffer), readBuffer),
-            dcpDataLength);
+            dcpDataLength,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Pdu_IdentifyReq");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java
index cbb3379cd3..14217e1eb2 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes.java
@@ -89,42 +89,66 @@ public class PnDcp_Pdu_IdentifyRes extends PnDcp_Pdu implements Message {
     writeBuffer.pushContext("PnDcp_Pdu_IdentifyRes");
 
     // Const Field (serviceId)
-    writeConstField("serviceId", SERVICEID, writeUnsignedShort(writeBuffer, 8));
+    writeConstField(
+        "serviceId",
+        SERVICEID,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 5));
+        writeUnsignedShort(writeBuffer, 5),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (notSupported)
-    writeSimpleField("notSupported", notSupported, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "notSupported",
+        notSupported,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField1 != null ? reservedField1 : (byte) 0x00,
-        writeUnsignedByte(writeBuffer, 1));
+        writeUnsignedByte(writeBuffer, 1),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (response)
-    writeConstField("response", RESPONSE, writeBoolean(writeBuffer));
+    writeConstField(
+        "response",
+        RESPONSE,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (xid)
-    writeSimpleField("xid", xid, writeUnsignedLong(writeBuffer, 32));
+    writeSimpleField(
+        "xid",
+        xid,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField2 != null ? reservedField2 : (int) 0x0000,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (dcpDataLength) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
     int dcpDataLength = (int) ((getLengthInBytes()) - (12));
-    writeImplicitField("dcpDataLength", dcpDataLength, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "dcpDataLength",
+        dcpDataLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (blocks)
-    writeComplexTypeArrayField("blocks", blocks, writeBuffer);
+    writeComplexTypeArrayField(
+        "blocks", blocks, writeBuffer, WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Pdu_IdentifyRes");
   }
@@ -184,31 +208,63 @@ public class PnDcp_Pdu_IdentifyRes extends PnDcp_Pdu implements Message {
 
     short serviceId =
         readConstField(
-            "serviceId", readUnsignedShort(readBuffer, 8), PnDcp_Pdu_IdentifyRes.SERVICEID);
+            "serviceId",
+            readUnsignedShort(readBuffer, 8),
+            PnDcp_Pdu_IdentifyRes.SERVICEID,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Short reservedField0 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 5), (short) 0x00);
-
-    boolean notSupported = readSimpleField("notSupported", readBoolean(readBuffer));
+        readReservedField(
+            "reserved",
+            readUnsignedShort(readBuffer, 5),
+            (short) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean notSupported =
+        readSimpleField(
+            "notSupported",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Byte reservedField1 =
-        readReservedField("reserved", readUnsignedByte(readBuffer, 1), (byte) 0x00);
+        readReservedField(
+            "reserved",
+            readUnsignedByte(readBuffer, 1),
+            (byte) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     boolean response =
-        readConstField("response", readBoolean(readBuffer), PnDcp_Pdu_IdentifyRes.RESPONSE);
+        readConstField(
+            "response",
+            readBoolean(readBuffer),
+            PnDcp_Pdu_IdentifyRes.RESPONSE,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    long xid = readSimpleField("xid", readUnsignedLong(readBuffer, 32));
+    long xid =
+        readSimpleField(
+            "xid",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Integer reservedField2 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x0000);
-
-    int dcpDataLength = readImplicitField("dcpDataLength", readUnsignedInt(readBuffer, 16));
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int dcpDataLength =
+        readImplicitField(
+            "dcpDataLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     List<PnDcp_Block> blocks =
         readLengthArrayField(
             "blocks",
             new DataReaderComplexDefault<>(() -> PnDcp_Block.staticParse(readBuffer), readBuffer),
-            dcpDataLength);
+            dcpDataLength,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Pdu_IdentifyRes");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes_Payload.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes_Payload.java
index ec2d0201c4..f06f094d99 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes_Payload.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_IdentifyRes_Payload.java
@@ -82,24 +82,38 @@ public abstract class PnDcp_Pdu_IdentifyRes_Payload implements Message {
         "PnDcp_ServiceId",
         getServiceId(),
         new DataWriterEnumDefault<>(
-            PnDcp_ServiceId::getValue, PnDcp_ServiceId::name, writeUnsignedShort(writeBuffer, 8)));
+            PnDcp_ServiceId::getValue, PnDcp_ServiceId::name, writeUnsignedShort(writeBuffer, 8)),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (serviceType)
-    writeSimpleField("serviceType", serviceType, new DataWriterComplexDefault<>(writeBuffer));
+    writeSimpleField(
+        "serviceType",
+        serviceType,
+        new DataWriterComplexDefault<>(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (xid)
-    writeSimpleField("xid", xid, writeUnsignedLong(writeBuffer, 32));
+    writeSimpleField(
+        "xid",
+        xid,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (responseDelayFactorOrPadding)
     writeSimpleField(
         "responseDelayFactorOrPadding",
         responseDelayFactorOrPadding,
-        writeUnsignedInt(writeBuffer, 16));
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (dcpDataLength) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
     int dcpDataLength = (int) ((getLengthInBytes()) - (12));
-    writeImplicitField("dcpDataLength", dcpDataLength, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "dcpDataLength",
+        dcpDataLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Switch field (Serialize the sub-type)
     serializePnDcp_Pdu_IdentifyRes_PayloadChild(writeBuffer);
@@ -156,20 +170,33 @@ public abstract class PnDcp_Pdu_IdentifyRes_Payload implements Message {
         readDiscriminatorField(
             "serviceId",
             new DataReaderEnumDefault<>(
-                PnDcp_ServiceId::enumForValue, readUnsignedShort(readBuffer, 8)));
+                PnDcp_ServiceId::enumForValue, readUnsignedShort(readBuffer, 8)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     PnDcp_ServiceType serviceType =
         readSimpleField(
             "serviceType",
             new DataReaderComplexDefault<>(
-                () -> PnDcp_ServiceType.staticParse(readBuffer), readBuffer));
+                () -> PnDcp_ServiceType.staticParse(readBuffer), readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    long xid = readSimpleField("xid", readUnsignedLong(readBuffer, 32));
+    long xid =
+        readSimpleField(
+            "xid",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int responseDelayFactorOrPadding =
-        readSimpleField("responseDelayFactorOrPadding", readUnsignedInt(readBuffer, 16));
-
-    int dcpDataLength = readImplicitField("dcpDataLength", readUnsignedInt(readBuffer, 16));
+        readSimpleField(
+            "responseDelayFactorOrPadding",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int dcpDataLength =
+        readImplicitField(
+            "dcpDataLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
     PnDcp_Pdu_IdentifyRes_PayloadBuilder builder = null;
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java
index 9ed532a12d..898ffdf8f9 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Pdu_RealTimeCyclic.java
@@ -120,47 +120,78 @@ public class PnDcp_Pdu_RealTimeCyclic extends PnDcp_Pdu implements Message {
         () ->
             org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.writeDataUnit(
                 writeBuffer, dataUnit),
-        writeBuffer);
+        writeBuffer,
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (cycleCounter)
-    writeSimpleField("cycleCounter", cycleCounter, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "cycleCounter",
+        cycleCounter,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (ignore)
-    writeSimpleField("ignore", ignore, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "ignore",
+        ignore,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (boolean) false,
-        writeBoolean(writeBuffer));
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (stationProblemIndicatorOk)
     writeSimpleField(
-        "stationProblemIndicatorOk", stationProblemIndicatorOk, writeBoolean(writeBuffer));
+        "stationProblemIndicatorOk",
+        stationProblemIndicatorOk,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (providerStateRun)
-    writeSimpleField("providerStateRun", providerStateRun, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "providerStateRun",
+        providerStateRun,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField1 != null ? reservedField1 : (boolean) false,
-        writeBoolean(writeBuffer));
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (dataValid)
-    writeSimpleField("dataValid", dataValid, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "dataValid",
+        dataValid,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (redundancy)
-    writeSimpleField("redundancy", redundancy, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "redundancy",
+        redundancy,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (statePrimary)
-    writeSimpleField("statePrimary", statePrimary, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "statePrimary",
+        statePrimary,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField2 != null ? reservedField2 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 8));
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_Pdu_RealTimeCyclic");
   }
@@ -227,31 +258,65 @@ public class PnDcp_Pdu_RealTimeCyclic extends PnDcp_Pdu implements Message {
             () ->
                 (PnIo_CyclicServiceDataUnit)
                     (org.apache.plc4x.java.profinet.readwrite.utils.StaticHelper.readDataUnit(
-                        readBuffer)));
+                        readBuffer)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    int cycleCounter = readSimpleField("cycleCounter", readUnsignedInt(readBuffer, 16));
+    int cycleCounter =
+        readSimpleField(
+            "cycleCounter",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    boolean ignore = readSimpleField("ignore", readBoolean(readBuffer));
+    boolean ignore =
+        readSimpleField(
+            "ignore", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Boolean reservedField0 =
-        readReservedField("reserved", readBoolean(readBuffer), (boolean) false);
+        readReservedField(
+            "reserved",
+            readBoolean(readBuffer),
+            (boolean) false,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     boolean stationProblemIndicatorOk =
-        readSimpleField("stationProblemIndicatorOk", readBoolean(readBuffer));
+        readSimpleField(
+            "stationProblemIndicatorOk",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    boolean providerStateRun = readSimpleField("providerStateRun", readBoolean(readBuffer));
+    boolean providerStateRun =
+        readSimpleField(
+            "providerStateRun",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Boolean reservedField1 =
-        readReservedField("reserved", readBoolean(readBuffer), (boolean) false);
-
-    boolean dataValid = readSimpleField("dataValid", readBoolean(readBuffer));
-
-    boolean redundancy = readSimpleField("redundancy", readBoolean(readBuffer));
-
-    boolean statePrimary = readSimpleField("statePrimary", readBoolean(readBuffer));
+        readReservedField(
+            "reserved",
+            readBoolean(readBuffer),
+            (boolean) false,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean dataValid =
+        readSimpleField(
+            "dataValid", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean redundancy =
+        readSimpleField(
+            "redundancy", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean statePrimary =
+        readSimpleField(
+            "statePrimary",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Short reservedField2 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+        readReservedField(
+            "reserved",
+            readUnsignedShort(readBuffer, 8),
+            (short) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_Pdu_RealTimeCyclic");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java
index e3d440cdb6..af0bc910a8 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_ServiceType.java
@@ -69,19 +69,29 @@ public class PnDcp_ServiceType implements Message {
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 5));
+        writeUnsignedShort(writeBuffer, 5),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (notSupported)
-    writeSimpleField("notSupported", notSupported, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "notSupported",
+        notSupported,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField1 != null ? reservedField1 : (byte) 0x00,
-        writeUnsignedByte(writeBuffer, 1));
+        writeUnsignedByte(writeBuffer, 1),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (response)
-    writeSimpleField("response", response, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "response",
+        response,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_ServiceType");
   }
@@ -126,14 +136,28 @@ public class PnDcp_ServiceType implements Message {
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     Short reservedField0 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 5), (short) 0x00);
-
-    boolean notSupported = readSimpleField("notSupported", readBoolean(readBuffer));
+        readReservedField(
+            "reserved",
+            readUnsignedShort(readBuffer, 5),
+            (short) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean notSupported =
+        readSimpleField(
+            "notSupported",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Byte reservedField1 =
-        readReservedField("reserved", readUnsignedByte(readBuffer, 1), (byte) 0x00);
-
-    boolean response = readSimpleField("response", readBoolean(readBuffer));
+        readReservedField(
+            "reserved",
+            readUnsignedByte(readBuffer, 1),
+            (byte) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean response =
+        readSimpleField(
+            "response", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_ServiceType");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_SupportedDeviceOption.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_SupportedDeviceOption.java
index 71a62b8e46..6cc94a3b95 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_SupportedDeviceOption.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_SupportedDeviceOption.java
@@ -69,10 +69,15 @@ public class PnDcp_SupportedDeviceOption implements Message {
         new DataWriterEnumDefault<>(
             PnDcp_BlockOptions::getValue,
             PnDcp_BlockOptions::name,
-            writeUnsignedShort(writeBuffer, 8)));
+            writeUnsignedShort(writeBuffer, 8)),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (suboption)
-    writeSimpleField("suboption", suboption, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "suboption",
+        suboption,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnDcp_SupportedDeviceOption");
   }
@@ -116,9 +121,14 @@ public class PnDcp_SupportedDeviceOption implements Message {
             "option",
             "PnDcp_BlockOptions",
             new DataReaderEnumDefault<>(
-                PnDcp_BlockOptions::enumForValue, readUnsignedShort(readBuffer, 8)));
-
-    short suboption = readSimpleField("suboption", readUnsignedShort(readBuffer, 8));
+                PnDcp_BlockOptions::enumForValue, readUnsignedShort(readBuffer, 8)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short suboption =
+        readSimpleField(
+            "suboption",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnDcp_SupportedDeviceOption");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java
index 4fa3f3cf45..bad7d82aa7 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitDataObject.java
@@ -67,10 +67,18 @@ public class PnIoCm_DataUnitDataObject implements Message {
     writeBuffer.pushContext("PnIoCm_DataUnitDataObject");
 
     // Array Field (dataState)
-    writeByteArrayField("dataState", dataState, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "dataState",
+        dataState,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (iops)
-    writeSimpleField("iops", iops, new DataWriterComplexDefault<>(writeBuffer));
+    writeSimpleField(
+        "iops",
+        iops,
+        new DataWriterComplexDefault<>(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_DataUnitDataObject");
   }
@@ -125,13 +133,18 @@ public class PnIoCm_DataUnitDataObject implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    byte[] dataState = readBuffer.readByteArray("dataState", Math.toIntExact(dataObjectLength));
+    byte[] dataState =
+        readBuffer.readByteArray(
+            "dataState",
+            Math.toIntExact(dataObjectLength),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     PnIoCm_DataUnitIoCs iops =
         readSimpleField(
             "iops",
             new DataReaderComplexDefault<>(
-                () -> PnIoCm_DataUnitIoCs.staticParse(readBuffer), readBuffer));
+                () -> PnIoCm_DataUnitIoCs.staticParse(readBuffer), readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_DataUnitDataObject");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java
index 12aab1c257..0e19b3e476 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_DataUnitIoCs.java
@@ -71,19 +71,32 @@ public class PnIoCm_DataUnitIoCs implements Message {
     writeBuffer.pushContext("PnIoCm_DataUnitIoCs");
 
     // Simple Field (dataState)
-    writeSimpleField("dataState", dataState, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "dataState",
+        dataState,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (instance)
-    writeSimpleField("instance", instance, writeUnsignedByte(writeBuffer, 2));
+    writeSimpleField(
+        "instance",
+        instance,
+        writeUnsignedByte(writeBuffer, 2),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (byte) 0x00,
-        writeUnsignedByte(writeBuffer, 4));
+        writeUnsignedByte(writeBuffer, 4),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (extension)
-    writeSimpleField("extension", extension, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "extension",
+        extension,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_DataUnitIoCs");
   }
@@ -127,14 +140,26 @@ public class PnIoCm_DataUnitIoCs implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    boolean dataState = readSimpleField("dataState", readBoolean(readBuffer));
+    boolean dataState =
+        readSimpleField(
+            "dataState", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    byte instance = readSimpleField("instance", readUnsignedByte(readBuffer, 2));
+    byte instance =
+        readSimpleField(
+            "instance",
+            readUnsignedByte(readBuffer, 2),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Byte reservedField0 =
-        readReservedField("reserved", readUnsignedByte(readBuffer, 4), (byte) 0x00);
-
-    boolean extension = readSimpleField("extension", readBoolean(readBuffer));
+        readReservedField(
+            "reserved",
+            readUnsignedByte(readBuffer, 4),
+            (byte) 0x00,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    boolean extension =
+        readSimpleField(
+            "extension", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_DataUnitIoCs");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ExpectedSubmoduleBlockReqApi.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ExpectedSubmoduleBlockReqApi.java
index 64640e1538..24b850dfca 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ExpectedSubmoduleBlockReqApi.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_ExpectedSubmoduleBlockReqApi.java
@@ -85,24 +85,45 @@ public class PnIoCm_ExpectedSubmoduleBlockReqApi implements Message {
     writeBuffer.pushContext("PnIoCm_ExpectedSubmoduleBlockReqApi");
 
     // Const Field (api)
-    writeConstField("api", API, writeUnsignedLong(writeBuffer, 32));
+    writeConstField(
+        "api",
+        API,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (slotNumber)
-    writeSimpleField("slotNumber", slotNumber, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "slotNumber",
+        slotNumber,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (moduleIdentNumber)
-    writeSimpleField("moduleIdentNumber", moduleIdentNumber, writeUnsignedLong(writeBuffer, 32));
+    writeSimpleField(
+        "moduleIdentNumber",
+        moduleIdentNumber,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (moduleProperties)
-    writeSimpleField("moduleProperties", moduleProperties, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "moduleProperties",
+        moduleProperties,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (numSubmodules) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
     int numSubmodules = (int) (COUNT(getSubmodules()));
-    writeImplicitField("numSubmodules", numSubmodules, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "numSubmodules",
+        numSubmodules,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (submodules)
-    writeComplexTypeArrayField("submodules", submodules, writeBuffer);
+    writeComplexTypeArrayField(
+        "submodules", submodules, writeBuffer, WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_ExpectedSubmoduleBlockReqApi");
   }
@@ -161,22 +182,42 @@ public class PnIoCm_ExpectedSubmoduleBlockReqApi implements Message {
 
     long api =
         readConstField(
-            "api", readUnsignedLong(readBuffer, 32), PnIoCm_ExpectedSubmoduleBlockReqApi.API);
-
-    int slotNumber = readSimpleField("slotNumber", readUnsignedInt(readBuffer, 16));
-
-    long moduleIdentNumber = readSimpleField("moduleIdentNumber", readUnsignedLong(readBuffer, 32));
-
-    int moduleProperties = readSimpleField("moduleProperties", readUnsignedInt(readBuffer, 16));
-
-    int numSubmodules = readImplicitField("numSubmodules", readUnsignedInt(readBuffer, 16));
+            "api",
+            readUnsignedLong(readBuffer, 32),
+            PnIoCm_ExpectedSubmoduleBlockReqApi.API,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int slotNumber =
+        readSimpleField(
+            "slotNumber",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    long moduleIdentNumber =
+        readSimpleField(
+            "moduleIdentNumber",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int moduleProperties =
+        readSimpleField(
+            "moduleProperties",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int numSubmodules =
+        readImplicitField(
+            "numSubmodules",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     List<PnIoCm_Submodule> submodules =
         readCountArrayField(
             "submodules",
             new DataReaderComplexDefault<>(
                 () -> PnIoCm_Submodule.staticParse(readBuffer), readBuffer),
-            numSubmodules);
+            numSubmodules,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_ExpectedSubmoduleBlockReqApi");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCrBlockReqApi.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCrBlockReqApi.java
index f4b764e708..7889fc3250 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCrBlockReqApi.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCrBlockReqApi.java
@@ -69,23 +69,40 @@ public class PnIoCm_IoCrBlockReqApi implements Message {
     writeBuffer.pushContext("PnIoCm_IoCrBlockReqApi");
 
     // Const Field (api)
-    writeConstField("api", API, writeUnsignedLong(writeBuffer, 32));
+    writeConstField(
+        "api",
+        API,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (numIoDataObjects) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
     int numIoDataObjects = (int) (COUNT(getIoDataObjects()));
-    writeImplicitField("numIoDataObjects", numIoDataObjects, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "numIoDataObjects",
+        numIoDataObjects,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (ioDataObjects)
-    writeComplexTypeArrayField("ioDataObjects", ioDataObjects, writeBuffer);
+    writeComplexTypeArrayField(
+        "ioDataObjects",
+        ioDataObjects,
+        writeBuffer,
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Implicit Field (numIoCss) (Used for parsing, but its value is not stored as it's implicitly
     // given by the objects content)
     int numIoCss = (int) (COUNT(getIoCss()));
-    writeImplicitField("numIoCss", numIoCss, writeUnsignedInt(writeBuffer, 16));
+    writeImplicitField(
+        "numIoCss",
+        numIoCss,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Array Field (ioCss)
-    writeComplexTypeArrayField("ioCss", ioCss, writeBuffer);
+    writeComplexTypeArrayField(
+        "ioCss", ioCss, writeBuffer, WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_IoCrBlockReqApi");
   }
@@ -144,24 +161,39 @@ public class PnIoCm_IoCrBlockReqApi implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    long api = readConstField("api", readUnsignedLong(readBuffer, 32), PnIoCm_IoCrBlockReqApi.API);
+    long api =
+        readConstField(
+            "api",
+            readUnsignedLong(readBuffer, 32),
+            PnIoCm_IoCrBlockReqApi.API,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    int numIoDataObjects = readImplicitField("numIoDataObjects", readUnsignedInt(readBuffer, 16));
+    int numIoDataObjects =
+        readImplicitField(
+            "numIoDataObjects",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     List<PnIoCm_IoDataObject> ioDataObjects =
         readCountArrayField(
             "ioDataObjects",
             new DataReaderComplexDefault<>(
                 () -> PnIoCm_IoDataObject.staticParse(readBuffer), readBuffer),
-            numIoDataObjects);
+            numIoDataObjects,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    int numIoCss = readImplicitField("numIoCss", readUnsignedInt(readBuffer, 16));
+    int numIoCss =
+        readImplicitField(
+            "numIoCss",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     List<PnIoCm_IoCs> ioCss =
         readCountArrayField(
             "ioCss",
             new DataReaderComplexDefault<>(() -> PnIoCm_IoCs.staticParse(readBuffer), readBuffer),
-            numIoCss);
+            numIoCss,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_IoCrBlockReqApi");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCs.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCs.java
index 04132b7ee1..c90dbf2746 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCs.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoCs.java
@@ -68,13 +68,25 @@ public class PnIoCm_IoCs implements Message {
     writeBuffer.pushContext("PnIoCm_IoCs");
 
     // Simple Field (slotNumber)
-    writeSimpleField("slotNumber", slotNumber, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "slotNumber",
+        slotNumber,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (subSlotNumber)
-    writeSimpleField("subSlotNumber", subSlotNumber, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "subSlotNumber",
+        subSlotNumber,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (ioFrameOffset)
-    writeSimpleField("ioFrameOffset", ioFrameOffset, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "ioFrameOffset",
+        ioFrameOffset,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_IoCs");
   }
@@ -115,11 +127,23 @@ public class PnIoCm_IoCs implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int slotNumber = readSimpleField("slotNumber", readUnsignedInt(readBuffer, 16));
-
-    int subSlotNumber = readSimpleField("subSlotNumber", readUnsignedInt(readBuffer, 16));
-
-    int ioFrameOffset = readSimpleField("ioFrameOffset", readUnsignedInt(readBuffer, 16));
+    int slotNumber =
+        readSimpleField(
+            "slotNumber",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int subSlotNumber =
+        readSimpleField(
+            "subSlotNumber",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int ioFrameOffset =
+        readSimpleField(
+            "ioFrameOffset",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_IoCs");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoDataObject.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoDataObject.java
index 31b3819139..5c5850dc02 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoDataObject.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_IoDataObject.java
@@ -68,14 +68,25 @@ public class PnIoCm_IoDataObject implements Message {
     writeBuffer.pushContext("PnIoCm_IoDataObject");
 
     // Simple Field (slotNumber)
-    writeSimpleField("slotNumber", slotNumber, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "slotNumber",
+        slotNumber,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (subSlotNumber)
-    writeSimpleField("subSlotNumber", subSlotNumber, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "subSlotNumber",
+        subSlotNumber,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (ioDataObjectFrameOffset)
     writeSimpleField(
-        "ioDataObjectFrameOffset", ioDataObjectFrameOffset, writeUnsignedInt(writeBuffer, 16));
+        "ioDataObjectFrameOffset",
+        ioDataObjectFrameOffset,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_IoDataObject");
   }
@@ -116,12 +127,23 @@ public class PnIoCm_IoDataObject implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int slotNumber = readSimpleField("slotNumber", readUnsignedInt(readBuffer, 16));
+    int slotNumber =
+        readSimpleField(
+            "slotNumber",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    int subSlotNumber = readSimpleField("subSlotNumber", readUnsignedInt(readBuffer, 16));
+    int subSlotNumber =
+        readSimpleField(
+            "subSlotNumber",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int ioDataObjectFrameOffset =
-        readSimpleField("ioDataObjectFrameOffset", readUnsignedInt(readBuffer, 16));
+        readSimpleField(
+            "ioDataObjectFrameOffset",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_IoDataObject");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet.java
index 9701b52347..500b2b4811 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet.java
@@ -108,8 +108,14 @@ public abstract class PnIoCm_Packet implements Message {
     PnIoCm_PacketBuilder builder = null;
     if (EvaluationHelper.equals(packetType, DceRpc_PacketType.REQUEST)) {
       builder = PnIoCm_Packet_Req.staticParsePnIoCm_PacketBuilder(readBuffer, packetType);
+    } else if (EvaluationHelper.equals(packetType, DceRpc_PacketType.PING)) {
+      builder = PnIoCm_Packet_Ping.staticParsePnIoCm_PacketBuilder(readBuffer, packetType);
     } else if (EvaluationHelper.equals(packetType, DceRpc_PacketType.RESPONSE)) {
       builder = PnIoCm_Packet_Res.staticParsePnIoCm_PacketBuilder(readBuffer, packetType);
+    } else if (EvaluationHelper.equals(packetType, DceRpc_PacketType.FAULT)) {
+      builder = PnIoCm_Packet_Fault.staticParsePnIoCm_PacketBuilder(readBuffer, packetType);
+    } else if (EvaluationHelper.equals(packetType, DceRpc_PacketType.NO_CALL)) {
+      builder = PnIoCm_Packet_NoCall.staticParsePnIoCm_PacketBuilder(readBuffer, packetType);
     } else if (EvaluationHelper.equals(packetType, DceRpc_PacketType.REJECT)) {
       builder = PnIoCm_Packet_Rej.staticParsePnIoCm_PacketBuilder(readBuffer, packetType);
     }
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Fault.java
similarity index 58%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
copy to plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Fault.java
index 1106118f3d..4a4bf7d24b 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Fault.java
@@ -35,34 +35,37 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class UserData implements Message {
+public class PnIoCm_Packet_Fault extends PnIoCm_Packet implements Message {
 
-  // Properties.
-  protected final byte[] data;
+  // Accessors for discriminator values.
+  public DceRpc_PacketType getPacketType() {
+    return DceRpc_PacketType.FAULT;
+  }
 
-  // Arguments.
-  protected final Long recordDataLength;
+  // Properties.
+  protected final long status;
 
-  public UserData(byte[] data, Long recordDataLength) {
+  public PnIoCm_Packet_Fault(long status) {
     super();
-    this.data = data;
-    this.recordDataLength = recordDataLength;
+    this.status = status;
   }
 
-  public byte[] getData() {
-    return data;
+  public long getStatus() {
+    return status;
   }
 
-  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+  @Override
+  protected void serializePnIoCm_PacketChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("UserData");
+    writeBuffer.pushContext("PnIoCm_Packet_Fault");
 
-    // Array Field (data)
-    writeByteArrayField("data", data, writeByteArray(writeBuffer, 8));
+    // Simple Field (status)
+    writeSimpleField("status", status, writeUnsignedLong(writeBuffer, 32));
 
-    writeBuffer.popContext("UserData");
+    writeBuffer.popContext("PnIoCm_Packet_Fault");
   }
 
   @Override
@@ -72,52 +75,42 @@ public class UserData implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = 0;
-    UserData _value = this;
+    int lengthInBits = super.getLengthInBits();
+    PnIoCm_Packet_Fault _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Array field
-    if (data != null) {
-      lengthInBits += 8 * data.length;
-    }
+    // Simple field (status)
+    lengthInBits += 32;
 
     return lengthInBits;
   }
 
-  public static UserData staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
-    PositionAware positionAware = readBuffer;
-    if ((args == null) || (args.length != 1)) {
-      throw new PlcRuntimeException(
-          "Wrong number of arguments, expected 1, but got " + args.length);
-    }
-    Long recordDataLength;
-    if (args[0] instanceof Long) {
-      recordDataLength = (Long) args[0];
-    } else if (args[0] instanceof String) {
-      recordDataLength = Long.valueOf((String) args[0]);
-    } else {
-      throw new PlcRuntimeException(
-          "Argument 0 expected to be of type Long or a string which is parseable but was "
-              + args[0].getClass().getName());
-    }
-    return staticParse(readBuffer, recordDataLength);
-  }
-
-  public static UserData staticParse(ReadBuffer readBuffer, Long recordDataLength)
-      throws ParseException {
-    readBuffer.pullContext("UserData");
+  public static PnIoCm_PacketBuilder staticParsePnIoCm_PacketBuilder(
+      ReadBuffer readBuffer, DceRpc_PacketType packetType) throws ParseException {
+    readBuffer.pullContext("PnIoCm_Packet_Fault");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    byte[] data = readBuffer.readByteArray("data", Math.toIntExact(recordDataLength));
+    long status = readSimpleField("status", readUnsignedLong(readBuffer, 32));
 
-    readBuffer.closeContext("UserData");
+    readBuffer.closeContext("PnIoCm_Packet_Fault");
     // Create the instance
-    UserData _userData;
-    _userData = new UserData(data, recordDataLength);
-    return _userData;
+    return new PnIoCm_Packet_FaultBuilderImpl(status);
+  }
+
+  public static class PnIoCm_Packet_FaultBuilderImpl implements PnIoCm_Packet.PnIoCm_PacketBuilder {
+    private final long status;
+
+    public PnIoCm_Packet_FaultBuilderImpl(long status) {
+      this.status = status;
+    }
+
+    public PnIoCm_Packet_Fault build() {
+      PnIoCm_Packet_Fault pnIoCm_Packet_Fault = new PnIoCm_Packet_Fault(status);
+      return pnIoCm_Packet_Fault;
+    }
   }
 
   @Override
@@ -125,16 +118,16 @@ public class UserData implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof UserData)) {
+    if (!(o instanceof PnIoCm_Packet_Fault)) {
       return false;
     }
-    UserData that = (UserData) o;
-    return (getData() == that.getData()) && true;
+    PnIoCm_Packet_Fault that = (PnIoCm_Packet_Fault) o;
+    return (getStatus() == that.getStatus()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(getData());
+    return Objects.hash(super.hashCode(), getStatus());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_NoCall.java
similarity index 57%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
copy to plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_NoCall.java
index 1106118f3d..ed225cd0a3 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_NoCall.java
@@ -35,34 +35,26 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class UserData implements Message {
+public class PnIoCm_Packet_NoCall extends PnIoCm_Packet implements Message {
 
-  // Properties.
-  protected final byte[] data;
-
-  // Arguments.
-  protected final Long recordDataLength;
-
-  public UserData(byte[] data, Long recordDataLength) {
-    super();
-    this.data = data;
-    this.recordDataLength = recordDataLength;
+  // Accessors for discriminator values.
+  public DceRpc_PacketType getPacketType() {
+    return DceRpc_PacketType.NO_CALL;
   }
 
-  public byte[] getData() {
-    return data;
+  public PnIoCm_Packet_NoCall() {
+    super();
   }
 
-  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+  @Override
+  protected void serializePnIoCm_PacketChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("UserData");
+    writeBuffer.pushContext("PnIoCm_Packet_NoCall");
 
-    // Array Field (data)
-    writeByteArrayField("data", data, writeByteArray(writeBuffer, 8));
-
-    writeBuffer.popContext("UserData");
+    writeBuffer.popContext("PnIoCm_Packet_NoCall");
   }
 
   @Override
@@ -72,52 +64,35 @@ public class UserData implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = 0;
-    UserData _value = this;
+    int lengthInBits = super.getLengthInBits();
+    PnIoCm_Packet_NoCall _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Array field
-    if (data != null) {
-      lengthInBits += 8 * data.length;
-    }
-
     return lengthInBits;
   }
 
-  public static UserData staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
-    PositionAware positionAware = readBuffer;
-    if ((args == null) || (args.length != 1)) {
-      throw new PlcRuntimeException(
-          "Wrong number of arguments, expected 1, but got " + args.length);
-    }
-    Long recordDataLength;
-    if (args[0] instanceof Long) {
-      recordDataLength = (Long) args[0];
-    } else if (args[0] instanceof String) {
-      recordDataLength = Long.valueOf((String) args[0]);
-    } else {
-      throw new PlcRuntimeException(
-          "Argument 0 expected to be of type Long or a string which is parseable but was "
-              + args[0].getClass().getName());
-    }
-    return staticParse(readBuffer, recordDataLength);
-  }
-
-  public static UserData staticParse(ReadBuffer readBuffer, Long recordDataLength)
-      throws ParseException {
-    readBuffer.pullContext("UserData");
+  public static PnIoCm_PacketBuilder staticParsePnIoCm_PacketBuilder(
+      ReadBuffer readBuffer, DceRpc_PacketType packetType) throws ParseException {
+    readBuffer.pullContext("PnIoCm_Packet_NoCall");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    byte[] data = readBuffer.readByteArray("data", Math.toIntExact(recordDataLength));
-
-    readBuffer.closeContext("UserData");
+    readBuffer.closeContext("PnIoCm_Packet_NoCall");
     // Create the instance
-    UserData _userData;
-    _userData = new UserData(data, recordDataLength);
-    return _userData;
+    return new PnIoCm_Packet_NoCallBuilderImpl();
+  }
+
+  public static class PnIoCm_Packet_NoCallBuilderImpl
+      implements PnIoCm_Packet.PnIoCm_PacketBuilder {
+
+    public PnIoCm_Packet_NoCallBuilderImpl() {}
+
+    public PnIoCm_Packet_NoCall build() {
+      PnIoCm_Packet_NoCall pnIoCm_Packet_NoCall = new PnIoCm_Packet_NoCall();
+      return pnIoCm_Packet_NoCall;
+    }
   }
 
   @Override
@@ -125,16 +100,16 @@ public class UserData implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof UserData)) {
+    if (!(o instanceof PnIoCm_Packet_NoCall)) {
       return false;
     }
-    UserData that = (UserData) o;
-    return (getData() == that.getData()) && true;
+    PnIoCm_Packet_NoCall that = (PnIoCm_Packet_NoCall) o;
+    return super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(getData());
+    return Objects.hash(super.hashCode());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Ping.java
similarity index 57%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
copy to plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Ping.java
index 1106118f3d..4a20c6201c 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet_Ping.java
@@ -35,34 +35,26 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class UserData implements Message {
+public class PnIoCm_Packet_Ping extends PnIoCm_Packet implements Message {
 
-  // Properties.
-  protected final byte[] data;
-
-  // Arguments.
-  protected final Long recordDataLength;
-
-  public UserData(byte[] data, Long recordDataLength) {
-    super();
-    this.data = data;
-    this.recordDataLength = recordDataLength;
+  // Accessors for discriminator values.
+  public DceRpc_PacketType getPacketType() {
+    return DceRpc_PacketType.PING;
   }
 
-  public byte[] getData() {
-    return data;
+  public PnIoCm_Packet_Ping() {
+    super();
   }
 
-  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+  @Override
+  protected void serializePnIoCm_PacketChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("UserData");
+    writeBuffer.pushContext("PnIoCm_Packet_Ping");
 
-    // Array Field (data)
-    writeByteArrayField("data", data, writeByteArray(writeBuffer, 8));
-
-    writeBuffer.popContext("UserData");
+    writeBuffer.popContext("PnIoCm_Packet_Ping");
   }
 
   @Override
@@ -72,52 +64,34 @@ public class UserData implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = 0;
-    UserData _value = this;
+    int lengthInBits = super.getLengthInBits();
+    PnIoCm_Packet_Ping _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Array field
-    if (data != null) {
-      lengthInBits += 8 * data.length;
-    }
-
     return lengthInBits;
   }
 
-  public static UserData staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
-    PositionAware positionAware = readBuffer;
-    if ((args == null) || (args.length != 1)) {
-      throw new PlcRuntimeException(
-          "Wrong number of arguments, expected 1, but got " + args.length);
-    }
-    Long recordDataLength;
-    if (args[0] instanceof Long) {
-      recordDataLength = (Long) args[0];
-    } else if (args[0] instanceof String) {
-      recordDataLength = Long.valueOf((String) args[0]);
-    } else {
-      throw new PlcRuntimeException(
-          "Argument 0 expected to be of type Long or a string which is parseable but was "
-              + args[0].getClass().getName());
-    }
-    return staticParse(readBuffer, recordDataLength);
-  }
-
-  public static UserData staticParse(ReadBuffer readBuffer, Long recordDataLength)
-      throws ParseException {
-    readBuffer.pullContext("UserData");
+  public static PnIoCm_PacketBuilder staticParsePnIoCm_PacketBuilder(
+      ReadBuffer readBuffer, DceRpc_PacketType packetType) throws ParseException {
+    readBuffer.pullContext("PnIoCm_Packet_Ping");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    byte[] data = readBuffer.readByteArray("data", Math.toIntExact(recordDataLength));
-
-    readBuffer.closeContext("UserData");
+    readBuffer.closeContext("PnIoCm_Packet_Ping");
     // Create the instance
-    UserData _userData;
-    _userData = new UserData(data, recordDataLength);
-    return _userData;
+    return new PnIoCm_Packet_PingBuilderImpl();
+  }
+
+  public static class PnIoCm_Packet_PingBuilderImpl implements PnIoCm_Packet.PnIoCm_PacketBuilder {
+
+    public PnIoCm_Packet_PingBuilderImpl() {}
+
+    public PnIoCm_Packet_Ping build() {
+      PnIoCm_Packet_Ping pnIoCm_Packet_Ping = new PnIoCm_Packet_Ping();
+      return pnIoCm_Packet_Ping;
+    }
   }
 
   @Override
@@ -125,16 +99,16 @@ public class UserData implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof UserData)) {
+    if (!(o instanceof PnIoCm_Packet_Ping)) {
       return false;
     }
-    UserData that = (UserData) o;
-    return (getData() == that.getData()) && true;
+    PnIoCm_Packet_Ping that = (PnIoCm_Packet_Ping) o;
+    return super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(getData());
+    return Objects.hash(super.hashCode());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java
index 460229481a..6856dbc069 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule.java
@@ -101,31 +101,53 @@ public abstract class PnIoCm_Submodule implements Message {
     writeBuffer.pushContext("PnIoCm_Submodule");
 
     // Simple Field (slotNumber)
-    writeSimpleField("slotNumber", slotNumber, writeUnsignedInt(writeBuffer, 16));
+    writeSimpleField(
+        "slotNumber",
+        slotNumber,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (submoduleIdentNumber)
     writeSimpleField(
-        "submoduleIdentNumber", submoduleIdentNumber, writeUnsignedLong(writeBuffer, 32));
+        "submoduleIdentNumber",
+        submoduleIdentNumber,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (int) 0x000,
-        writeUnsignedInt(writeBuffer, 10));
+        writeUnsignedInt(writeBuffer, 10),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (discardIoxs)
-    writeSimpleField("discardIoxs", discardIoxs, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "discardIoxs",
+        discardIoxs,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (reduceOutputModuleDataLength)
     writeSimpleField(
-        "reduceOutputModuleDataLength", reduceOutputModuleDataLength, writeBoolean(writeBuffer));
+        "reduceOutputModuleDataLength",
+        reduceOutputModuleDataLength,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (reduceInputModuleDataLength)
     writeSimpleField(
-        "reduceInputModuleDataLength", reduceInputModuleDataLength, writeBoolean(writeBuffer));
+        "reduceInputModuleDataLength",
+        reduceInputModuleDataLength,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (sharedInput)
-    writeSimpleField("sharedInput", sharedInput, writeBoolean(writeBuffer));
+    writeSimpleField(
+        "sharedInput",
+        sharedInput,
+        writeBoolean(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Discriminator Field (submoduleType) (Used as input to a switch field)
     writeDiscriminatorEnumField(
@@ -135,7 +157,8 @@ public abstract class PnIoCm_Submodule implements Message {
         new DataWriterEnumDefault<>(
             PnIoCm_SubmoduleType::getValue,
             PnIoCm_SubmoduleType::name,
-            writeUnsignedByte(writeBuffer, 2)));
+            writeUnsignedByte(writeBuffer, 2)),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Switch field (Serialize the sub-type)
     serializePnIoCm_SubmoduleChild(writeBuffer);
@@ -196,29 +219,51 @@ public abstract class PnIoCm_Submodule implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int slotNumber = readSimpleField("slotNumber", readUnsignedInt(readBuffer, 16));
+    int slotNumber =
+        readSimpleField(
+            "slotNumber",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     long submoduleIdentNumber =
-        readSimpleField("submoduleIdentNumber", readUnsignedLong(readBuffer, 32));
+        readSimpleField(
+            "submoduleIdentNumber",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     Integer reservedField0 =
-        readReservedField("reserved", readUnsignedInt(readBuffer, 10), (int) 0x000);
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 10),
+            (int) 0x000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    boolean discardIoxs = readSimpleField("discardIoxs", readBoolean(readBuffer));
+    boolean discardIoxs =
+        readSimpleField(
+            "discardIoxs", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     boolean reduceOutputModuleDataLength =
-        readSimpleField("reduceOutputModuleDataLength", readBoolean(readBuffer));
+        readSimpleField(
+            "reduceOutputModuleDataLength",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     boolean reduceInputModuleDataLength =
-        readSimpleField("reduceInputModuleDataLength", readBoolean(readBuffer));
+        readSimpleField(
+            "reduceInputModuleDataLength",
+            readBoolean(readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    boolean sharedInput = readSimpleField("sharedInput", readBoolean(readBuffer));
+    boolean sharedInput =
+        readSimpleField(
+            "sharedInput", readBoolean(readBuffer), WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     PnIoCm_SubmoduleType submoduleType =
         readDiscriminatorField(
             "submoduleType",
             new DataReaderEnumDefault<>(
-                PnIoCm_SubmoduleType::enumForValue, readUnsignedByte(readBuffer, 2)));
+                PnIoCm_SubmoduleType::enumForValue, readUnsignedByte(readBuffer, 2)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
     PnIoCm_SubmoduleBuilder builder = null;
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputAndOutputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputAndOutputData.java
index 1f0965386e..aa9b2fa22d 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputAndOutputData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputAndOutputData.java
@@ -124,31 +124,59 @@ public class PnIoCm_Submodule_InputAndOutputData extends PnIoCm_Submodule implem
 
     // Const Field (inputDataDescription)
     writeConstField(
-        "inputDataDescription", INPUTDATADESCRIPTION, writeUnsignedInt(writeBuffer, 16));
+        "inputDataDescription",
+        INPUTDATADESCRIPTION,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputSubmoduleDataLength)
     writeSimpleField(
-        "inputSubmoduleDataLength", inputSubmoduleDataLength, writeUnsignedInt(writeBuffer, 16));
+        "inputSubmoduleDataLength",
+        inputSubmoduleDataLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputLengthIoCs)
-    writeSimpleField("inputLengthIoCs", inputLengthIoCs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "inputLengthIoCs",
+        inputLengthIoCs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputLengthIoPs)
-    writeSimpleField("inputLengthIoPs", inputLengthIoPs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "inputLengthIoPs",
+        inputLengthIoPs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (outputDataDescription)
     writeConstField(
-        "outputDataDescription", OUTPUTDATADESCRIPTION, writeUnsignedInt(writeBuffer, 16));
+        "outputDataDescription",
+        OUTPUTDATADESCRIPTION,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (outputSubmoduleDataLength)
     writeSimpleField(
-        "outputSubmoduleDataLength", outputSubmoduleDataLength, writeUnsignedInt(writeBuffer, 16));
+        "outputSubmoduleDataLength",
+        outputSubmoduleDataLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (outputLengthIoCs)
-    writeSimpleField("outputLengthIoCs", outputLengthIoCs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "outputLengthIoCs",
+        outputLengthIoCs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (outputLengthIoPs)
-    writeSimpleField("outputLengthIoPs", outputLengthIoPs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "outputLengthIoPs",
+        outputLengthIoPs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_Submodule_InputAndOutputData");
   }
@@ -203,27 +231,51 @@ public class PnIoCm_Submodule_InputAndOutputData extends PnIoCm_Submodule implem
         readConstField(
             "inputDataDescription",
             readUnsignedInt(readBuffer, 16),
-            PnIoCm_Submodule_InputAndOutputData.INPUTDATADESCRIPTION);
+            PnIoCm_Submodule_InputAndOutputData.INPUTDATADESCRIPTION,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int inputSubmoduleDataLength =
-        readSimpleField("inputSubmoduleDataLength", readUnsignedInt(readBuffer, 16));
+        readSimpleField(
+            "inputSubmoduleDataLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    short inputLengthIoCs = readSimpleField("inputLengthIoCs", readUnsignedShort(readBuffer, 8));
+    short inputLengthIoCs =
+        readSimpleField(
+            "inputLengthIoCs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
-    short inputLengthIoPs = readSimpleField("inputLengthIoPs", readUnsignedShort(readBuffer, 8));
+    short inputLengthIoPs =
+        readSimpleField(
+            "inputLengthIoPs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int outputDataDescription =
         readConstField(
             "outputDataDescription",
             readUnsignedInt(readBuffer, 16),
-            PnIoCm_Submodule_InputAndOutputData.OUTPUTDATADESCRIPTION);
+            PnIoCm_Submodule_InputAndOutputData.OUTPUTDATADESCRIPTION,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int outputSubmoduleDataLength =
-        readSimpleField("outputSubmoduleDataLength", readUnsignedInt(readBuffer, 16));
-
-    short outputLengthIoCs = readSimpleField("outputLengthIoCs", readUnsignedShort(readBuffer, 8));
-
-    short outputLengthIoPs = readSimpleField("outputLengthIoPs", readUnsignedShort(readBuffer, 8));
+        readSimpleField(
+            "outputSubmoduleDataLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short outputLengthIoCs =
+        readSimpleField(
+            "outputLengthIoCs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short outputLengthIoPs =
+        readSimpleField(
+            "outputLengthIoPs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_Submodule_InputAndOutputData");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java
index 7c9df657e3..65db1b2b4a 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_InputData.java
@@ -98,17 +98,31 @@ public class PnIoCm_Submodule_InputData extends PnIoCm_Submodule implements Mess
 
     // Const Field (inputDataDescription)
     writeConstField(
-        "inputDataDescription", INPUTDATADESCRIPTION, writeUnsignedInt(writeBuffer, 16));
+        "inputDataDescription",
+        INPUTDATADESCRIPTION,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputSubmoduleDataLength)
     writeSimpleField(
-        "inputSubmoduleDataLength", inputSubmoduleDataLength, writeUnsignedInt(writeBuffer, 16));
+        "inputSubmoduleDataLength",
+        inputSubmoduleDataLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputLengthIoCs)
-    writeSimpleField("inputLengthIoCs", inputLengthIoCs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "inputLengthIoCs",
+        inputLengthIoCs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputLengthIoPs)
-    writeSimpleField("inputLengthIoPs", inputLengthIoPs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "inputLengthIoPs",
+        inputLengthIoPs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_Submodule_InputData");
   }
@@ -151,14 +165,26 @@ public class PnIoCm_Submodule_InputData extends PnIoCm_Submodule implements Mess
         readConstField(
             "inputDataDescription",
             readUnsignedInt(readBuffer, 16),
-            PnIoCm_Submodule_InputData.INPUTDATADESCRIPTION);
+            PnIoCm_Submodule_InputData.INPUTDATADESCRIPTION,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int inputSubmoduleDataLength =
-        readSimpleField("inputSubmoduleDataLength", readUnsignedInt(readBuffer, 16));
-
-    short inputLengthIoCs = readSimpleField("inputLengthIoCs", readUnsignedShort(readBuffer, 8));
-
-    short inputLengthIoPs = readSimpleField("inputLengthIoPs", readUnsignedShort(readBuffer, 8));
+        readSimpleField(
+            "inputSubmoduleDataLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short inputLengthIoCs =
+        readSimpleField(
+            "inputLengthIoCs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short inputLengthIoPs =
+        readSimpleField(
+            "inputLengthIoPs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_Submodule_InputData");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_NoInputNoOutputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_NoInputNoOutputData.java
index 2b99da079d..8fbdddfa1d 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_NoInputNoOutputData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_NoInputNoOutputData.java
@@ -89,16 +89,32 @@ public class PnIoCm_Submodule_NoInputNoOutputData extends PnIoCm_Submodule imple
     writeBuffer.pushContext("PnIoCm_Submodule_NoInputNoOutputData");
 
     // Const Field (dataDescription)
-    writeConstField("dataDescription", DATADESCRIPTION, writeUnsignedInt(writeBuffer, 16));
+    writeConstField(
+        "dataDescription",
+        DATADESCRIPTION,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (submoduleDataLength)
-    writeConstField("submoduleDataLength", SUBMODULEDATALENGTH, writeUnsignedInt(writeBuffer, 16));
+    writeConstField(
+        "submoduleDataLength",
+        SUBMODULEDATALENGTH,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (lengthIoCs)
-    writeConstField("lengthIoCs", LENGTHIOCS, writeUnsignedShort(writeBuffer, 8));
+    writeConstField(
+        "lengthIoCs",
+        LENGTHIOCS,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Const Field (lengthIoPs)
-    writeConstField("lengthIoPs", LENGTHIOPS, writeUnsignedShort(writeBuffer, 8));
+    writeConstField(
+        "lengthIoPs",
+        LENGTHIOPS,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_Submodule_NoInputNoOutputData");
   }
@@ -141,25 +157,29 @@ public class PnIoCm_Submodule_NoInputNoOutputData extends PnIoCm_Submodule imple
         readConstField(
             "dataDescription",
             readUnsignedInt(readBuffer, 16),
-            PnIoCm_Submodule_NoInputNoOutputData.DATADESCRIPTION);
+            PnIoCm_Submodule_NoInputNoOutputData.DATADESCRIPTION,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int submoduleDataLength =
         readConstField(
             "submoduleDataLength",
             readUnsignedInt(readBuffer, 16),
-            PnIoCm_Submodule_NoInputNoOutputData.SUBMODULEDATALENGTH);
+            PnIoCm_Submodule_NoInputNoOutputData.SUBMODULEDATALENGTH,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     short lengthIoCs =
         readConstField(
             "lengthIoCs",
             readUnsignedShort(readBuffer, 8),
-            PnIoCm_Submodule_NoInputNoOutputData.LENGTHIOCS);
+            PnIoCm_Submodule_NoInputNoOutputData.LENGTHIOCS,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     short lengthIoPs =
         readConstField(
             "lengthIoPs",
             readUnsignedShort(readBuffer, 8),
-            PnIoCm_Submodule_NoInputNoOutputData.LENGTHIOPS);
+            PnIoCm_Submodule_NoInputNoOutputData.LENGTHIOPS,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_Submodule_NoInputNoOutputData");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java
index add5348121..15f5e762ec 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Submodule_OutputData.java
@@ -98,17 +98,31 @@ public class PnIoCm_Submodule_OutputData extends PnIoCm_Submodule implements Mes
 
     // Const Field (inputDataDescription)
     writeConstField(
-        "inputDataDescription", INPUTDATADESCRIPTION, writeUnsignedInt(writeBuffer, 16));
+        "inputDataDescription",
+        INPUTDATADESCRIPTION,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputSubmoduleDataLength)
     writeSimpleField(
-        "inputSubmoduleDataLength", inputSubmoduleDataLength, writeUnsignedInt(writeBuffer, 16));
+        "inputSubmoduleDataLength",
+        inputSubmoduleDataLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputLengthIoCs)
-    writeSimpleField("inputLengthIoCs", inputLengthIoCs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "inputLengthIoCs",
+        inputLengthIoCs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     // Simple Field (inputLengthIoPs)
-    writeSimpleField("inputLengthIoPs", inputLengthIoPs, writeUnsignedShort(writeBuffer, 8));
+    writeSimpleField(
+        "inputLengthIoPs",
+        inputLengthIoPs,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("PnIoCm_Submodule_OutputData");
   }
@@ -151,14 +165,26 @@ public class PnIoCm_Submodule_OutputData extends PnIoCm_Submodule implements Mes
         readConstField(
             "inputDataDescription",
             readUnsignedInt(readBuffer, 16),
-            PnIoCm_Submodule_OutputData.INPUTDATADESCRIPTION);
+            PnIoCm_Submodule_OutputData.INPUTDATADESCRIPTION,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     int inputSubmoduleDataLength =
-        readSimpleField("inputSubmoduleDataLength", readUnsignedInt(readBuffer, 16));
-
-    short inputLengthIoCs = readSimpleField("inputLengthIoCs", readUnsignedShort(readBuffer, 8));
-
-    short inputLengthIoPs = readSimpleField("inputLengthIoPs", readUnsignedShort(readBuffer, 8));
+        readSimpleField(
+            "inputSubmoduleDataLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short inputLengthIoCs =
+        readSimpleField(
+            "inputLengthIoCs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short inputLengthIoPs =
+        readSimpleField(
+            "inputLengthIoPs",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("PnIoCm_Submodule_OutputData");
     // Create the instance
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
index 1106118f3d..b5504c883a 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
+++ b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/UserData.java
@@ -60,7 +60,11 @@ public class UserData implements Message {
     writeBuffer.pushContext("UserData");
 
     // Array Field (data)
-    writeByteArrayField("data", data, writeByteArray(writeBuffer, 8));
+    writeByteArrayField(
+        "data",
+        data,
+        writeByteArray(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     writeBuffer.popContext("UserData");
   }
@@ -111,7 +115,11 @@ public class UserData implements Message {
     int curPos;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    byte[] data = readBuffer.readByteArray("data", Math.toIntExact(recordDataLength));
+    byte[] data =
+        readBuffer.readByteArray(
+            "data",
+            Math.toIntExact(recordDataLength),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
 
     readBuffer.closeContext("UserData");
     // Create the instance
diff --git a/protocols/profinet/src/main/java/org/apache/plc4x/protocol/profinet/ProfinetProtocol.java b/protocols/profinet/src/main/java/org/apache/plc4x/protocol/profinet/ProfinetProtocol.java
index 0f41c9b266..c65cfbd3f4 100644
--- a/protocols/profinet/src/main/java/org/apache/plc4x/protocol/profinet/ProfinetProtocol.java
+++ b/protocols/profinet/src/main/java/org/apache/plc4x/protocol/profinet/ProfinetProtocol.java
@@ -24,9 +24,13 @@ import org.apache.plc4x.plugins.codegenerator.language.mspec.protocol.Validatabl
 import org.apache.plc4x.plugins.codegenerator.protocol.Protocol;
 import org.apache.plc4x.plugins.codegenerator.protocol.TypeContext;
 import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class ProfinetProtocol implements Protocol, ProtocolHelpers {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(ProfinetProtocol.class);
+
     @Override
     public String getName() {
         return "profinet";
@@ -34,8 +38,27 @@ public class ProfinetProtocol implements Protocol, ProtocolHelpers {
 
     @Override
     public TypeContext getTypeContext() throws GenerationException {
-        ValidatableTypeContext typeContext = new MessageFormatParser().parse(getMspecStream());
+        ValidatableTypeContext typeContext;
+
+
+            LOGGER.info("Parsing: pndcp.mspec");
+            typeContext = new MessageFormatParser().parse(getMspecStream("pndcp"));
+
+            LOGGER.info("Parsing: pnio.mspec");
+            typeContext = new MessageFormatParser().parse(getMspecStream("pnio"), typeContext);
+
+            LOGGER.info("Parsing: dcerpc.mspec");
+            typeContext = new MessageFormatParser().parse(getMspecStream("dcerpc"), typeContext);
+
+            LOGGER.info("Parsing:lldp.mspec");
+            typeContext = new MessageFormatParser().parse(getMspecStream("lldp"), typeContext);
+
+            LOGGER.info("Parsing: ethernet.mspec");
+            typeContext = new MessageFormatParser().parse(getMspecStream("ethernet"), typeContext);
+
+
         typeContext.validate();
+
         return typeContext;
     }
 
diff --git a/protocols/profinet/src/main/resources/protocols/profinet/dcerpc.mspec b/protocols/profinet/src/main/resources/protocols/profinet/dcerpc.mspec
new file mode 100644
index 0000000000..bed0d5c9bb
--- /dev/null
+++ b/protocols/profinet/src/main/resources/protocols/profinet/dcerpc.mspec
@@ -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.
+ */
+
+[type DceRpc_Packet byteOrder='BIG_ENDIAN'
+// RPC Header {
+    // RPCVersion 4.10.3.2.1
+    [const         uint 8                version                        0x04                 ]
+    // RPCPacketType 4.10.3.2.2 (8 bit)
+    [simple        DceRpc_PacketType     packetType                                            ]
+    // PRCFlags 4.10.3.2.3
+    [reserved      bit                                                  'false'                ]
+    [const         bit                   broadcast                      false                ]
+    [simple        bit                   idempotent                                            ]
+    [const         bit                   maybe                          false                ]
+    [simple        bit                   noFragmentAcknowledgeRequested                        ]
+    [const         bit                   fragment                       false                ]
+    [simple        bit                   lastFragment                                          ]
+    [reserved      bit                                                  'false'                ]
+    // PRCFlags2 4.10.3.2.4
+    [reserved      uint 6                                               '0x00'                 ]
+    [const         bit                   cancelWasPending               false                ]
+    [reserved      bit                                                  'false'                ]
+    // RPCDRep 4.10.3.2.5 (4 bit & 4 bit)
+    [simple        IntegerEncoding       integerEncoding                                       ]
+    [simple        CharacterEncoding     characterEncoding                                     ]
+    // RPCDRep2 4.10.3.2.5 (8 bit)
+    [simple        FloatingPointEncoding floatingPointEncoding                                 ]
+    // RPCDRep3 (8 bit shall be 0)
+    [reserved      uint 8                                               '0x00'                 ]
+    // RPCSerialHigh 4.10.3.2.6
+    [const         uint 8                serialHigh                     0x00                 ]
+    [batchSet byteOrder='integerEncoding == IntegerEncoding.BIG_ENDIAN ? BIG_ENDIAN : LITTLE_ENDIAN'
+        // RPCObjectUUID 4.10.3.2.8
+        // RPCObjectUUID 4.10.3.2.8
+        [simple DceRpc_ObjectUuid        objectUuid                                            ]
+        // RPCInterfaceUUID 4.10.3.2.9
+        [simple DceRpc_InterfaceUuid     interfaceUuid                                         ]
+        // RPCActivityUUID 4.10.3.2.10
+        [simple DceRpc_ActivityUuid      activityUuid                                          ]
+        // RPCServerBootTime 4.10.3.2.11
+        [simple uint 32                  serverBootTime                                        ]
+        // RPCInterfaceVersion 4.10.3.2.12
+        [const  uint 32                  interfaceVer                   0x00000001           ]
+        // RPCSequenceNmb 4.10.3.2.13
+        [simple uint 32                  sequenceNumber                                        ]
+        // RPCOperationNmb 4.10.3.2.14
+        [simple DceRpc_Operation         operation                                             ]
+        // RPCInterfaceHint 4.10.3.2.15
+        [const        uint 16            interfaceHint                  0xFFFF               ]
+        // RPCActivityHint 4.10.3.2.16
+        [const        uint 16            activityHint                   0xFFFF               ]
+        // RPCLengthOfBody 4.10.3.2.17
+        [implicit     uint 16            lengthOfBody                   'payload.lengthInBytes']
+        // RPCFragmentNmb 4.10.3.2.18 (Setting this to 0 as we will probably never have anything but 0 here
+        [const        uint 16            fragmentNum                    0x0000               ]
+        // RPCAuthenticationProtocol 4.10.3.2.19
+        [const        uint 8             authProto                      0x00                 ]
+    ]
+    // RPCSerialLow 4.10.3.2.7
+    [const            uint 8             serialLow                      0x00                 ]
+// RPC Header }
+// RPC Payload {
+    [simple PnIoCm_Packet('packetType') payload byteOrder='integerEncoding == IntegerEncoding.BIG_ENDIAN ? BIG_ENDIAN : LITTLE_ENDIAN' ]
+// RPC Payload }
+]
+
+// RPCObjectUUID 4.10.3.2.8
+[type DceRpc_ObjectUuid
+    [const  uint 32 data1      0xDEA00000                       ]
+    [const  uint 16 data2      0x6C97                           ]
+    [const  uint 16 data3      0x11D1                           ]
+    // This part is described as a byte array, so the byte order is always big-endian
+    [const  uint 16 data4      0x8271     byteOrder='BIG_ENDIAN']
+    [simple uint 4  interfaceNumber       byteOrder='BIG_ENDIAN']
+    [simple uint 12 nodeNumber            byteOrder='BIG_ENDIAN']
+    [simple uint 16 deviceId              byteOrder='BIG_ENDIAN']
+    [simple uint 16 vendorId              byteOrder='BIG_ENDIAN']
+]
+
+// RPCInterfaceUUID 4.10.3.2.9
+// NOTE: If we would have been only using Big Endian encoding, we would have
+//       implemented this via an enum. However as the first 8 bytes are
+//       dynamically endianed and the last 8 bytes are set to Big Endian, we
+//       had to do this trick.
+[discriminatedType DceRpc_InterfaceUuid
+    [discriminator  uint 32 interfaceType                               ]
+    [const          uint 16 data1      0x6C97                           ]
+    [const          uint 16 data2      0x11D1                           ]
+    // This part is described as a byte array, so the byte order is always big-endian
+    [const          uint 16 data3      0x8271     byteOrder='BIG_ENDIAN']
+    [const          uint 16 data4      0x00A0     byteOrder='BIG_ENDIAN']
+    [const          uint 16 data5      0x2442     byteOrder='BIG_ENDIAN']
+    [const          uint 16 data6      0xDF7D     byteOrder='BIG_ENDIAN']
+    [typeSwitch interfaceType
+        ['0xDEA00001' DceRpc_InterfaceUuid_DeviceInterface
+        ]
+        ['0xDEA00002' DceRpc_InterfaceUuid_ControllerInterface
+        ]
+        ['0xDEA00003' DceRpc_InterfaceUuid_SupervisorInterface
+        ]
+        ['0xDEA00004' DceRpc_InterfaceUuid_ParameterInterface
+        ]
+    ]
+]
+
+// RPCActivityUUID 4.10.3.2.10
+// NOTE: This value is generally randomly generated by the initiator
+//       and used throughout the entire communication. Unfortunately,
+//       the first parts are effected by endianess, and the last 8
+//       bytes are fixed big-endian. Therefore the complicated notation.
+[type DceRpc_ActivityUuid
+    [simple  uint 32 data1          ]
+    [simple  uint 16 data2          ]
+    [simple  uint 16 data3          ]
+    // This part is described as a byte array, so the byte order is always big-endian
+    [array   byte    data4 count '8']
+]
+
+// 4.10.3.2.2
+[enum uint 8 DceRpc_PacketType
+    ['0x00' REQUEST              ]
+    ['0x01' PING                 ]
+    ['0x02' RESPONSE             ]
+    ['0x03' FAULT                ]
+    ['0x04' WORKING              ]
+    // Response to PING
+    ['0x05' NO_CALL              ]
+    ['0x06' REJECT               ]
+    ['0x07' ACKNOWLEDGE          ]
+    ['0x08' CONNECTIONLESS_CANCEL]
+    ['0x09' FRAGMENT_ACKNOWLEDGE ]
+    ['0x0A' CANCEL_ACKNOWLEDGE   ]
+]
+
+// 4.10.3.2.14
+[enum uint 16 DceRpc_Operation
+    ['0x0000' CONNECT      ]
+    ['0x0001' RELEASE      ]
+    ['0x0002' READ         ]
+    ['0x0003' WRITE        ]
+    ['0x0004' CONTROL      ]
+    ['0x0005' READ_IMPLICIT]
+]
diff --git a/protocols/profinet/src/main/resources/protocols/profinet/ethernet.mspec b/protocols/profinet/src/main/resources/protocols/profinet/ethernet.mspec
new file mode 100644
index 0000000000..9e69be6dd4
--- /dev/null
+++ b/protocols/profinet/src/main/resources/protocols/profinet/ethernet.mspec
@@ -0,0 +1,110 @@
+/*
+ * 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.
+ */
+
+[type Ethernet_Frame byteOrder='BIG_ENDIAN'
+    // When sending to the mac address prefix of 01:0e:cf are multicast packets
+    [simple MacAddress            destination]
+    [simple MacAddress            source     ]
+    [simple Ethernet_FramePayload payload    ]
+]
+
+[discriminatedType Ethernet_FramePayload
+    [discriminator uint 16 packetType]
+    [typeSwitch packetType
+        ['0x0800' Ethernet_FramePayload_IPv4
+            [const    uint 4              version                         0x4                        ]
+            // 5 = 5 x 32bit = 5 x 4byte = 20byte
+            [const    uint 4              headerLength                    0x5                        ]
+            [const    uint 6              differentiatedServicesCodepoint 0x00                       ]
+            [const    uint 2              explicitCongestionNotification  0x0                        ]
+            // Length of the header + payload
+            [implicit uint 16             totalLength                     '28 + payload.lengthInBytes']
+            [simple   uint 16             identification                                             ]
+            [reserved bit                                                 'false'                    ]
+            [simple   bit                 dontFragment                                               ]
+            [simple   bit                 moreFragments                                              ]
+            [const    uint 13             fragmentOffset                  0x00                       ]
+            [simple   uint 8              timeToLive                                                 ]
+            // Protocol: UDP
+            [const    uint 8              protocol                        0x11                       ]
+            // It seems that modern NICs mess this up as they take care of the validation in dedicated hardware.
+            // This results in the wrong values being read. Using a 'checksum' field would fail most incoming packets.
+            [implicit uint 16             headerChecksum                 'STATIC_CALL("calculateIPv4Checksum", totalLength, identification, timeToLive, sourceAddress, destinationAddress)']
+            [simple   IpAddress           sourceAddress                                              ]
+            [simple   IpAddress           destinationAddress                                         ]
+            // Begin of the UDP packet part
+            [simple   uint 16             sourcePort                                                 ]
+            [simple   uint 16             destinationPort                                            ]
+            [implicit uint 16             packetLength    '8 + payload.lengthInBytes'                ]
+            [implicit uint 16             bodyChecksum                    'STATIC_CALL("calculateUdpChecksum", sourceAddress, destinationAddress, sourcePort, destinationPort, packetLength, payload)']
+            [simple   DceRpc_Packet       payload                                                    ]
+        ]
+        ['0x8100' Ethernet_FramePayload_VirtualLan
+            [simple VirtualLanPriority    priority                                                   ]
+            [simple bit                   ineligible                                                 ]
+            [simple uint 12               id                                                         ]
+            [simple Ethernet_FramePayload payload                                                    ]
+        ]
+        ['0x8892' Ethernet_FramePayload_PnDcp
+            [simple PnDcp_Pdu             pdu                                                        ]
+        ]
+        ['0x88cc' Ethernet_FramePayload_LLDP
+            [simple Lldp_Pdu      pdu                                               ]
+        ]
+    ]
+]
+
+// There are some special MAC addresses reserved:
+// 01-0E-CF-00-00-00:      As destination for DCP-Identify-ReqPDU (The FrameID is then required to be set to 0xFEFE)
+// 01-0E-CF-00-00-01:      As destination for DCP-Helo-ReqPDU (The FrameID is then required to be set to 0xFEFC)
+// 01-0E-CF-00-00-02:      Reserved
+// 01-0E-CF-00-01-00:      Reserved for further multicast addresses within the Type 10 context
+// 01-0E-CF-00-01-01:      As multicast destination for RT_CLASS_3
+// 01-0E-CF-00-01-02:      As invalid frame multicast destination for RT_CLASS_3
+// 01-0E-CF-00-01-03 - FF: Reserved for further multicast addresses within the Type 10 context
+[type MacAddress
+    [array byte address count '6']
+]
+
+[type IpAddress
+    [array byte data count '4']
+]
+
+
+// https://de.wikipedia.org/wiki/IEEE_802.1p
+[enum uint 3 VirtualLanPriority   (string 16 acronym)
+    ['0x0' BEST_EFFORT              ['BE'                ]]
+    ['0x1' BACKGROUND               ['BK'                ]]
+    ['0x2' EXCELLENT_EFFORT         ['EE'                ]]
+    ['0x3' CRITICAL_APPLICATIONS    ['CA'                ]]
+    ['0x4' VIDEO                    ['VI'                ]]
+    ['0x5' VOICE                    ['VO'                ]]
+    ['0x6' INTERNETWORK_CONTROL     ['IC'                ]]
+    ['0x7' NETWORK_CONTROL          ['NC'                ]]
+]
+
+[type PascalString
+    [implicit int 8 sLength          'stringValue.length == 0 ? -1 : stringValue.length']
+    [simple vstring 'sLength == -1 ? 0 : sLength * 8' stringValue]
+    [virtual  int 8 stringLength     'stringValue.length == -1 ? 0 : stringValue.length']
+]
+
+[type Uuid
+    [array byte data count '16']
+]
diff --git a/protocols/profinet/src/main/resources/protocols/profinet/lldp.mspec b/protocols/profinet/src/main/resources/protocols/profinet/lldp.mspec
new file mode 100644
index 0000000000..f0bf82087d
--- /dev/null
+++ b/protocols/profinet/src/main/resources/protocols/profinet/lldp.mspec
@@ -0,0 +1,166 @@
+/*
+ * 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.
+ */
+
+[type Lldp_Pdu
+    [manualArray LldpUnit lldpParameters terminated 'STATIC_CALL("isSysexEnd", readBuffer)' 'STATIC_CALL("parseSysexString", readBuffer)' 'STATIC_CALL("serializeSysexString", writeBuffer, _value)' 'STATIC_CALL("lengthSysexString", lldpParameters)']
+]
+
+[discriminatedType LldpUnit
+    [discriminator     TlvType                  tlvId                                ]
+    [simple            uint 9                   tlvIdLength                          ]
+    [typeSwitch tlvId
+        ['END_OF_LLDP'  EndOfLldp
+        ]
+        ['CHASSIS_ID'   TlvChassisId(uint 9 tlvIdLength)
+            [simple     uint 8                        chassisIdSubType              ]
+            [simple     vstring     '(tlvIdLength - 1) * 8' chassisId               ]
+        ]
+        ['PORT_ID'   TlvPortId(uint 9 tlvIdLength)
+            [simple     uint 8          portIdSubType                               ]
+            [simple     vstring     '(tlvIdLength - 1) * 8' portId                  ]
+        ]
+        ['TIME_TO_LIVE'   TlvTimeToLive
+            [simple     uint 16         tlvTimeToLiveUnit                           ]
+        ]
+        ['PORT_DESCRIPTION'   TlvPortDescription(uint 9 tlvIdLength)
+            [simple     vstring     '(tlvIdLength) * 8' chassisId                   ]
+        ]
+        ['SYSTEM_NAME'   TlvSystemName(uint 9 tlvIdLength)
+            [simple     vstring     '(tlvIdLength) * 8' chassisId                   ]
+        ]
+        ['SYSTEM_DESCRIPTION'   TlvSystemDescription(uint 9 tlvIdLength)
+            [simple     vstring     '(tlvIdLength) * 8' chassisId                   ]
+        ]
+        ['SYSTEM_CAPABILITIES'   TlvSystemCapabilities
+            [reserved   uint 8                          '0x00'                      ]
+            [simple     bit             stationOnlyCapable                          ]
+            [simple     bit             docsisCableDeviceCapable                    ]
+            [simple     bit             telephoneCapable                            ]
+            [simple     bit             routerCapable                               ]
+            [simple     bit             wlanAccessPointCapable                      ]
+            [simple     bit             bridgeCapable                               ]
+            [simple     bit             repeaterCapable                             ]
+            [simple     bit             otherCapable                                ]
+            [reserved   uint 8                          '0x00'                      ]
+            [simple     bit             stationOnlyEnabled                          ]
+            [simple     bit             docsisCableDeviceEnabled                    ]
+            [simple     bit             telephoneEnabled                            ]
+            [simple     bit             routerEnabled                               ]
+            [simple     bit             wlanAccessPointEnabled                      ]
+            [simple     bit             bridgeEnabled                               ]
+            [simple     bit             repeaterEnabled                             ]
+            [simple     bit             otherEnabled                                ]
+        ]
+        ['MANAGEMENT_ADDRESS' TlvManagementAddress
+            [implicit   uint 8          addressStringLength    '5' ]
+            [simple     ManagementAddressSubType  addressSubType                   ]
+            [simple     IpAddress       ipAddress                                  ]
+            [simple     uint 8          interfaceSubType                           ]
+            [simple     uint 32         interfaceNumber                            ]
+            [simple     uint 8          oidStringLength                            ]
+        ]
+        ['ORGANIZATION_SPECIFIC' TlvOrganizationSpecific
+            [simple     TlvOrganizationSpecificUnit     organizationSpecificUnit   ]
+        ]
+    ]
+]
+
+[discriminatedType TlvOrganizationSpecificUnit
+    [discriminator      uint 24         uniqueCode]
+    [typeSwitch uniqueCode
+        ['0x000ECF' TlvOrgSpecificProfibus
+            [simple     TlvOrgSpecificProfibusUnit      specificUnit               ]
+        ]
+        ['0x00120F' TlvOrgSpecificIeee8023
+            [simple     TlvOrgSpecificIeee8023Unit      specificUnit               ]
+        ]
+    ]
+]
+
+[discriminatedType TlvOrgSpecificIeee8023Unit
+    [discriminator  TlvIEEESubType  subType]
+    [typeSwitch subType
+        ['MAC_PHY_CONFIG_STATUS'  TlvIeee8023MacPhyConfigStatus
+            [simple     uint 8                          negotiationSupport         ]
+            [simple     uint 16                         negotiationCapability      ]
+            [simple     uint 16                         operationalMauType         ]
+        ]
+        ['MAX_FRAME_SIZE'  TlvIeee8023MaxFrameSize
+            [simple     uint 16                         maxSize                    ]
+        ]
+    ]
+]
+
+[discriminatedType TlvOrgSpecificProfibusUnit
+    [discriminator  TlvProfibusSubType  subType]
+    [typeSwitch subType
+        ['MEASURED_DELAY'  TlvProfibusSubTypeMeasuredDelay
+            [simple     uint 32                         localPortRxDelay]
+            [simple     uint 32                         remotePortRxDelay]
+            [simple     uint 32                         localPortTxDelay]
+            [simple     uint 32                         remotePortTxDelay]
+        ]
+        ['PORT_STATUS'  TlvProfibusSubTypePortStatus
+            [simple     uint 16                         rtClass2PortStatus]
+            [reserved   uint 2                          '0x00'           ]
+            [simple     bit                             preample         ]
+            [simple     bit                             fragmentation    ]
+            [reserved   uint 9                          '0x00'           ]
+            [simple     uint 3                          rtClass3PortStatus]
+        ]
+        ['MRP_PORT_STATUS'  TlvProfibusSubTypeMrpPortStatus
+            [simple     Uuid                      macAddress]
+            [simple     uint 16                   Status]
+        ]
+        ['CHASSIS_MAC'  TlvProfibusSubTypeChassisMac
+            [simple     MacAddress                      macAddress]
+        ]
+    ]
+]
+
+[enum  uint 8 TlvIEEESubType
+    ['0x01' MAC_PHY_CONFIG_STATUS]
+    ['0x04' MAX_FRAME_SIZE]
+]
+
+[enum  uint 8 TlvProfibusSubType
+    ['0x01' MEASURED_DELAY]
+    ['0x02' PORT_STATUS]
+    ['0x04' MRP_PORT_STATUS]
+    ['0x05' CHASSIS_MAC]
+]
+
+//LLDP Specific
+[enum uint 7 TlvType
+    ['0x00' END_OF_LLDP          ]
+    ['0x01' CHASSIS_ID           ]
+    ['0x02' PORT_ID              ]
+    ['0x03' TIME_TO_LIVE         ]
+    ['0x04' PORT_DESCRIPTION     ]
+    ['0x05' SYSTEM_NAME          ]
+    ['0x06' SYSTEM_DESCRIPTION   ]
+    ['0x07' SYSTEM_CAPABILITIES  ]
+    ['0x08' MANAGEMENT_ADDRESS    ]
+    ['0x7F' ORGANIZATION_SPECIFIC]
+]
+
+[enum uint 8 ManagementAddressSubType
+    ['0x00' UNKNOWN              ]
+    ['0x01' IPV4                 ]
+]
diff --git a/protocols/profinet/src/main/resources/protocols/profinet/pndcp.mspec b/protocols/profinet/src/main/resources/protocols/profinet/pndcp.mspec
new file mode 100644
index 0000000000..42a1deb7e6
--- /dev/null
+++ b/protocols/profinet/src/main/resources/protocols/profinet/pndcp.mspec
@@ -0,0 +1,407 @@
+/*
+ * 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.
+ */
+
+/////////////////////////////////////////////////////////////////////////////////////////
+//
+//   PROFINET DCP
+//
+// Discovery and basic configuration
+//
+/////////////////////////////////////////////////////////////////////////////////////////
+
+// Page 90
+[discriminatedType PnDcp_Pdu byteOrder='BIG_ENDIAN'
+    [simple        uint 16           frameIdValue                      ]
+    [virtual       PnDcp_FrameId     frameId       'STATIC_CALL("getFrameId", frameIdValue)']
+    [typeSwitch frameId
+        ['RT_CLASS_1' PnDcp_Pdu_RealTimeCyclic
+            [manual   PnIo_CyclicServiceDataUnit
+                                          dataUnit
+                                                'STATIC_CALL("readDataUnit", readBuffer)'
+                                                'STATIC_CALL("writeDataUnit", writeBuffer, dataUnit)'
+                                                '(dataUnit.lengthInBytes)*8'      ]
+            [simple   uint 16                    cycleCounter             ]
+            // Data Status Start (4.7.2.1.3)
+            [simple   bit                        ignore                   ]
+            [reserved bit                        'false'                  ]
+            [simple   bit                        stationProblemIndicatorOk]
+            [simple   bit                        providerStateRun         ]
+            [reserved bit                        'false'                  ]
+            [simple   bit                        dataValid                ]
+            [simple   bit                        redundancy               ]
+            [simple   bit                        statePrimary             ]
+            // Data Status End
+            // "Transfer-Status" (Set to 0x00 for all RT-Classes except RT-CLASS-3,
+            // which PLC4X will never be able to support
+            [reserved uint 8                     '0x00'                   ] // transferStatus
+        ]
+        ['PTCP_DelayReqPDU' PcDcp_Pdu_DelayReq
+            // Header Start
+            [reserved uint 32 '0x00000000']
+            [reserved uint 32 '0x00000000']
+            [reserved uint 32 '0x00000000']
+            [simple   uint 16 sequenceId  ]
+            [reserved uint 16 '0x0000'    ]
+            // Header End
+            [simple   uint 32 delayInNs   ]
+            // Delay Parameter Start
+            // TODO: This seems to usually be an array of parameters terminated by an End-Parameter which is indicated by type and length being 0
+            [const    uint 7     parameterType   6]
+            [const    uint 9     parameterLength 6]
+            [simple   MacAddress portMacAddress   ]
+            [const    uint 7     endType         0]
+            [const    uint 9     endLength       0]
+            // Delay Parameter End
+        ]
+        ['Alarm_Low' PnDcp_Pdu_AlarmLow
+                    [simple uint 16 alarmDstEndpoint]
+                    [simple uint 16 alarmSrcEndpoint]
+                    [simple uint 4  version]
+                    [simple uint 4  errorType]
+                    [simple uint 4  tAck]
+                    [simple uint 4  windowSize]
+                    [simple uint 16 senSeqNum]
+                    [simple uint 16 ackSeqNum]
+                    [implicit uint 16 varPartLen 'COUNT(varPart)']
+                    [array    byte varPart                        length              'varPartLen']
+                ]
+        ['DCP_Identify_ReqPDU' PnDcp_Pdu_IdentifyReq
+            [const    uint 8      serviceId                    0x05                                ]
+            // ServiceType Start
+            [reserved uint 5      '0x00'                                                           ]
+            [const    bit         notSupported                 false                               ]
+            [reserved uint 1      '0x00'                                                           ]
+            [const    bit         response                     false                               ]
+            // ServiceType End
+            // 4.3.1.3.3 (Page 95)
+            [simple   uint 32     xid                                                              ]
+            // 4.3.1.3.5 (Page 95ff)
+            [simple   uint 16     responseDelay                                                    ]
+            // 4.3.1.3.4 (Page 95)
+            [implicit uint 16     dcpDataLength                'lengthInBytes - 12'                ]
+            [array    PnDcp_Block blocks                        length              'dcpDataLength']
+        ]
+        ////////////////////////////////////////////////////////////////////////////
+        // Multicast (Well theoretically)
+        ////////////////////////////////////////////////////////////////////////////
+        // The Identify request is valid in two options:
+        // 1) One containing only an AllSelectorBlock
+        // 2) One containing optionally either NameOfStationBlock or AliasNameBlock and another optional IdentifyReqBlock
+        // (I assume, that if in case 2 both optionally aren't used, this might not be valid and option 1 should be sent instead)
+        ['DCP_Identify_ResPDU' PnDcp_Pdu_IdentifyRes
+            [const    uint 8      serviceId                    0x05                                ]
+            // ServiceType Start
+            [reserved uint 5      '0x00'                                                           ]
+            [simple   bit         notSupported                                                     ]
+            [reserved uint 1      '0x00'                                                           ]
+            [const    bit         response                     true                                ]
+            // ServiceType End
+            // 4.3.1.3.3 (Page 95)
+            [simple   uint 32     xid                                                              ]
+            // 4.3.1.3.5 (Page 95ff)
+            [reserved uint 16     '0x0000'                                                         ]
+            // 4.3.1.3.4 (Page 95)
+            [implicit uint 16     dcpDataLength                'lengthInBytes - 12'                ]
+            [array    PnDcp_Block blocks                        length              'dcpDataLength']
+        ]
+    ]
+]
+
+[discriminatedType PnDcp_Pdu_IdentifyRes_Payload byteOrder='BIG_ENDIAN'
+    [discriminator PnDcp_ServiceId   serviceId                         ]
+    [simple        PnDcp_ServiceType serviceType                       ]
+    // 4.3.1.3.3 (Page 95)
+    [simple        uint 32           xid                               ]
+    // 4.3.1.3.5 (Page 95ff)
+    [simple        uint 16           responseDelayFactorOrPadding      ]
+    // 4.3.1.3.4 (Page 95)
+    [implicit      uint 16           dcpDataLength 'lengthInBytes - 12']
+    [typeSwitch serviceId,serviceType.response
+
+        // Packet a Profinet station might emit once it is turned on
+//        ['DCP_Hello_ReqPDU','HELLO','false' PnDcp_Pdu_HelloReq
+//            [simple NameOfStationBlockRes    nameOfStationBlockRes   ]
+//            [simple IPParameterBlockRes      iPParameterBlockRes     ]
+//            [simple DeviceIdBlockRes         deviceIdBlockRes        ]
+//            [simple DeviceVendorBlockRes     deviceVendorBlockRes    ]
+//            [simple DeviceOptionsBlockRes    deviceOptionsBlockRes   ]
+//            [simple DeviceRoleBlockRes       deviceRoleBlockRes      ]
+//            [simple DeviceInitiativeBlockRes deviceInitiativeBlockRes]
+//        ]
+
+        ////////////////////////////////////////////////////////////////////////////
+        // Unicast
+        ////////////////////////////////////////////////////////////////////////////
+
+//        ['DCP_GetSet_PDU','GET','false' PnDcp_Pdu_GetReq
+//            [simple GetReqBlock              getReqBlock             ]
+//        ]
+//        ['DCP_GetSet_PDU','GET','true' PnDcp_Pdu_GetRes
+//            [simple GetResBlock              getResBlock             ]
+//            [simple GetNegResBlock           getNegResBlock          ]
+//        ]
+
+//        ['DCP_GetSet_PDU','SET','false' PnDcp_Pdu_SetReq
+//            [simple StartTransactionBlock    startTransactionBlock   ]
+//            [simple BlockQualifier           blockQualifier          ]
+//            [simple SetResetReqBlock         setResetReqBlock        ]
+//            [simple SetReqBlock              setReqBlock             ]
+//            [simple StopTransactionBlock     stopTransactionBlock    ]
+//            [simple BlockQualifier           blockQualifier          ]
+//        ]
+//        ['DCP_GetSet_PDU','SET','true' PnDcp_Pdu_SetRes
+//            [simple SetResBlock              setResBlock             ]
+//            [simple SetNegResBlock           setNegResBlock          ]
+//        ]
+    ]
+]
+
+[discriminatedType PnDcp_Block byteOrder='BIG_ENDIAN'
+    [discriminator PnDcp_BlockOptions option                   ]
+    [discriminator uint 8       suboption                      ]
+    [implicit      uint 16      blockLength 'lengthInBytes - 4']
+    [typeSwitch option,suboption
+
+        ////////////////////////////////////////////////////////////////////////////
+        // IP_OPTION
+        ////////////////////////////////////////////////////////////////////////////
+
+        // 4.3.1.4.1 (Page 97)
+        ['IP_OPTION','1' PnDcp_Block_IpMacAddress
+            [reserved uint 16  '0x0000'                                               ]
+            [simple MacAddress macAddress                                             ]
+        ]
+        ['IP_OPTION','2' PnDcp_Block_IpParameter
+            // 4.3.1.4.12 (Page 105ff)
+            [reserved uint 8 '0x00'                                                   ]
+            [simple   bit    ipConflictDetected                                       ]
+            [reserved uint 5 '0x00'                                                   ]
+            [simple   bit    setViaDhcp                                               ]
+            [simple   bit    setManually                                              ]
+            [array    byte   ipAddress       count '4'                                ]
+            [array    byte   subnetMask      count '4'                                ]
+            [array    byte   standardGateway count '4'                                ]
+        ]
+        ['IP_OPTION','3' PnDcp_Block_FullIpSuite
+            // TODO: Implement this ...
+        ]
+
+        ////////////////////////////////////////////////////////////////////////////
+        // DEVICE_PROPERTIES_OPTION
+        ////////////////////////////////////////////////////////////////////////////
+
+        ['DEVICE_PROPERTIES_OPTION','1' PnDcp_Block_DevicePropertiesDeviceVendor(uint 16 blockLength)
+            [reserved uint 16     '0x0000'                                            ]
+            [array    byte        deviceVendorValue count 'blockLength-2'             ]
+            [padding  uint 8      pad '0x00' 'STATIC_CALL("arrayLength", deviceVendorValue) % 2']
+        ]
+        ['DEVICE_PROPERTIES_OPTION','2' PnDcp_Block_DevicePropertiesNameOfStation(uint 16 blockLength)
+            [reserved uint 16     '0x0000'                                            ]
+            [array    byte        nameOfStation count 'blockLength-2'                 ]
+            [padding  uint 8      pad '0x00' 'STATIC_CALL("arrayLength", nameOfStation) % 2']
+        ]
+        ['DEVICE_PROPERTIES_OPTION','3' PnDcp_Block_DevicePropertiesDeviceId
+            [reserved uint 16 '0x0000'                                                ]
+            [simple   uint 16 vendorId                                                ]
+            [simple   uint 16 deviceId                                                ]
+        ]
+        ['DEVICE_PROPERTIES_OPTION','4' PnDcp_Block_DevicePropertiesDeviceRole
+            [reserved uint 20 '0x000000'                                              ]
+            [simple   bit     pnioSupervisor                                          ]
+            [simple   bit     pnioMultidevive                                         ]
+            [simple   bit     pnioController                                          ]
+            [simple   bit     pnioDevice                                              ]
+            [reserved uint 8  '0x00'                                                  ]
+        ]
+        // Contains a list of option combinations the device supports.
+        ['DEVICE_PROPERTIES_OPTION','5' PnDcp_Block_DevicePropertiesDeviceOptions(uint 16 blockLength)
+            [reserved uint 16               '0x0000'                                  ]
+            [array    PnDcp_SupportedDeviceOption supportedOptions length 'blockLength - 2' ]
+        ]
+        ['DEVICE_PROPERTIES_OPTION','6' PnDcp_Block_DevicePropertiesAliasName(uint 16 blockLength)
+            [reserved uint 16     '0x0000'                                            ]
+            [array    byte        aliasNameValue count 'blockLength-2'                ]
+            [padding  uint 8      pad '0x00' 'STATIC_CALL("arrayLength", aliasNameValue) % 2']
+        ]
+        ['DEVICE_PROPERTIES_OPTION','7' PnDcp_Block_DevicePropertiesDeviceInstance
+            [reserved uint 16 '0x0000'                                                ]
+            [simple   uint 8  deviceInstanceHigh                                      ]
+            [simple   uint 8  deviceInstanceLow                                       ]
+        ]
+        ['DEVICE_PROPERTIES_OPTION','8' PnDcp_Block_DevicePropertiesOemDeviceId
+            // TODO: Implement this ...
+        ]
+        ['DEVICE_PROPERTIES_OPTION','9' PnDcp_Block_DevicePropertiesStandardGateway
+            // TODO: Implement this ...
+        ]
+
+        ////////////////////////////////////////////////////////////////////////////
+        // DHCP_OPTION
+        ////////////////////////////////////////////////////////////////////////////
+        // 4.3.1.4.1 (Page 98 & 100)
+
+        // TODO: Check if these are really all DCP_OPTION
+        ['DCP_OPTION','12' PnDcp_Block_DhcpOptionHostName
+            // TODO: Implement this ...
+        ]
+        ['DCP_OPTION','43' PnDcp_Block_DhcpOptionVendorSpecificInformation
+            // TODO: Implement this ...
+        ]
+        ['DCP_OPTION','54' PnDcp_Block_DhcpOptionServerIdentifier
+            // TODO: Implement this ...
+        ]
+        ['DCP_OPTION','55' PnDcp_Block_DhcpOptionParameterRequestList
+            // TODO: Implement this ...
+        ]
+        ['DCP_OPTION','60' PnDcp_Block_DhcpOptionClassIdentifier
+            // TODO: Implement this ...
+        ]
+        ['DCP_OPTION','61' PnDcp_Block_DhcpOptionDhcpClientIdentifier
+            // TODO: Implement this ...
+        ]
+        ['DCP_OPTION','81' PnDcp_Block_DhcpOptionFullyQualifiedDomainName
+            // TODO: Implement this ...
+        ]
+        ['DCP_OPTION','97' PnDcp_Block_DhcpOptionUuidBasedClient
+            // TODO: Implement this ...
+        ]
+
+        ////////////////////////////////////////////////////////////////////////////
+        // CONTROL_OPTION
+        ////////////////////////////////////////////////////////////////////////////
+        // 4.3.1.4.1 (Page 98)
+
+        ['CONTROL_OPTION','1' PnDcp_Block_ControlOptionStart
+            // TODO: Implement this ...
+        ]
+        ['CONTROL_OPTION','2' PnDcp_Block_ControlOptionStop
+            // TODO: Implement this ...
+        ]
+        ['CONTROL_OPTION','3' PnDcp_Block_ControlOptionSignal
+            // TODO: Implement this ...
+        ]
+        ['CONTROL_OPTION','4' PnDcp_Block_ControlOptionResponse
+            // TODO: Implement this ...
+        ]
+        ['CONTROL_OPTION','5' PnDcp_Block_ControlOptionFactoryReset
+            // TODO: Implement this ...
+        ]
+        ['CONTROL_OPTION','6' PnDcp_Block_ControlOptionResetToFactory
+            // TODO: Implement this ...
+        ]
+
+        ////////////////////////////////////////////////////////////////////////////
+        // DEVICE_INITIATIVE_OPTION
+        ////////////////////////////////////////////////////////////////////////////
+        // 4.3.1.4.1 (Page 98)
+
+        ['DEVICE_INITIATIVE_OPTION','1' PnDcp_Block_DeviceInitiativeOption
+            // TODO: Implement this ...
+        ]
+
+        ////////////////////////////////////////////////////////////////////////////
+        // ALL_SELECTOR_OPTION
+        ////////////////////////////////////////////////////////////////////////////
+        // 4.3.1.4.1 (Page 99)
+
+        ['ALL_SELECTOR_OPTION','0xFF' PnDcp_Block_ALLSelector
+            // This type of block is empty
+        ]
+
+        ////////////////////////////////////////////////////////////////////////////
+        // Device manufacturer specific options 0x00-0xFF
+        ////////////////////////////////////////////////////////////////////////////
+   ]
+]
+
+[type PnDcp_SupportedDeviceOption byteOrder='BIG_ENDIAN'
+    [simple   PnDcp_BlockOptions option]
+    [simple   uint 8       suboption   ]
+]
+
+// 4.3.1.3.2 (Page 94ff)
+// 4.3.1.3.2 (Page 94ff)
+// The spec lists meanings for request and response separately, but
+// they are actually mergeable, which we did in this construct.
+[type PnDcp_ServiceType byteOrder='BIG_ENDIAN'
+    [reserved uint 5 '0x00'      ]
+    [simple   bit    notSupported]
+    [reserved uint 1 '0x00'      ]
+    [simple   bit    response    ]
+]
+
+// Page 86ff: Coding of the field FrameID
+[enum uint 16 PnDcp_FrameId
+    ['0x0000' RESERVED                       ]
+    // Range 1
+    ['0x0020' PTCP_RTSyncPDUWithFollowUp     ]
+    // Range 2
+    ['0x0080' PTCP_RTSyncPDU                 ]
+    // Range 3
+    // 0x0100-0x0FFF RT_CLASS_3
+    ['0x0100' RT_CLASS_3                     ]
+    // Range 4
+    // (Not used)
+    // Range 5
+    // (Not used)
+    // Range 6
+    // 0x8000-BFFF RT_CLASS_1
+    ['0x8000' RT_CLASS_1                     ]
+    // Range 7
+    // 0XC000-FBFF RT_CLASS_UDP
+    ['0xC000' RT_CLASS_UDP                   ]
+    // Range 8
+    ['0xFC01' Alarm_High                     ]
+    ['0xFE01' Alarm_Low                      ]
+    ['0xFEFC' DCP_Hello_ReqPDU               ]
+    ['0xFEFD' DCP_GetSet_PDU                 ]
+    ['0xFEFE' DCP_Identify_ReqPDU            ]
+    ['0xFEFF' DCP_Identify_ResPDU            ]
+    // Range 9
+    ['0xFF00' PTCP_AnnouncePDU               ]
+    ['0xFF20' PTCP_FollowUpPDU               ]
+    ['0xFF40' PTCP_DelayReqPDU               ]
+    ['0xFF41' PTCP_DelayResPDUWithFollowUp   ]
+    ['0xFF42' PTCP_DelayFuResPDUWithFollowUp ]
+    ['0xFF43' PTCP_DelayResPDUWithoutFollowUp]
+    // Range 12
+    // 0xFF80 - 0xFF8F FragmentationFrameId
+    ['0xFF80' FragmentationFrameId           ]
+]
+
+// Page 94
+// All other values are "Reserved"
+[enum uint 8 PnDcp_ServiceId
+    ['0x03' GET     ]
+    ['0x04' SET     ]
+    ['0x05' IDENTIFY]
+    ['0x06' HELLO   ]
+    //[RESERVED]
+]
+
+// 4.3.1.4.1 (Page 97)
+// All other values are "Reserved"
+[enum uint 8 PnDcp_BlockOptions
+    ['0x01' IP_OPTION               ]
+    ['0x02' DEVICE_PROPERTIES_OPTION]
+    ['0x03' DCP_OPTION              ]
+    ['0x05' CONTROL_OPTION          ]
+    ['0x06' DEVICE_INITIATIVE_OPTION]
+    ['0xFF' ALL_SELECTOR_OPTION     ]
+]
diff --git a/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec b/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
new file mode 100644
index 0000000000..991c297130
--- /dev/null
+++ b/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
@@ -0,0 +1,644 @@
+/*
+ * 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.
+ */
+
+/////////////////////////////////////////////////////////////////////////////////////////
+//
+//   PROFINET IO
+//
+// CM: Context Manager
+//
+/////////////////////////////////////////////////////////////////////////////////////////
+
+// TODO: Check if it's really Little Endian
+// 5.1.2
+// 5.5.2.2
+[discriminatedType PnIoCm_Packet(DceRpc_PacketType packetType)
+    [typeSwitch packetType
+        ['REQUEST' PnIoCm_Packet_Req
+            [simple uint 32      argsMaximum                          ]
+            [implicit uint 32    argsLength       'lengthInBytes - 20']
+            [simple uint 32      arrayMaximumCount                    ]
+            [simple uint 32      arrayOffset                          ]
+            [implicit uint 32    arrayActualCount  'lengthInBytes - 20']
+            [array  PnIoCm_Block blocks            length 'argsLength']
+        ]
+        ['PING' PnIoCm_Packet_Ping
+        ]
+        ['RESPONSE' PnIoCm_Packet_Res
+            [simple uint 8       errorCode2                           ]
+            [simple uint 8       errorCode1                           ]
+            [simple uint 8       errorDecode                          ]
+            [simple uint 8       errorCode                            ]
+            [implicit uint 32    argsLength       'lengthInBytes - 1 - 1 - 1 - 1 - 4 - 4 - 4 - 4']
+            [simple uint 32      arrayMaximumCount                    ]
+            [simple uint 32      arrayOffset                          ]
+            [implicit uint 32    arrayActualCount  'lengthInBytes - 1 - 1 - 1 - 1 - 4 - 4 - 4 - 4'    ]
+            [array  PnIoCm_Block blocks            length 'argsLength']
+        ]
+        ['FAULT' PnIoCm_Packet_Fault
+            [simple uint 32      status                               ]
+        ]
+        ['NO_CALL' PnIoCm_Packet_NoCall
+        ]
+        ['REJECT'   PnIoCm_Packet_Rej
+            [simple uint 32      status                               ]
+        ]
+    ]
+]
+
+[type UserData(uint 32 recordDataLength) byteOrder='BIG_ENDIAN'
+    [array              byte      data count         'recordDataLength'       ]
+]
+
+[type PnIo_CyclicServiceDataUnit(int 16 dataUnitLength)
+    [array    byte   data       count 'dataUnitLength'                 ]
+]
+
+// Big Endian
+[discriminatedType PnIoCm_Block byteOrder='BIG_ENDIAN'
+    [discriminator PnIoCm_BlockType blockType                           ]
+    [typeSwitch blockType
+        ['IOD_WRITE_REQUEST_HEADER' IODWriteRequestHeader
+            [implicit      uint 16          blockLength      'index < 0x8000 ? lengthInBytes - 4 - recordDataLength : lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple   uint 16                         sequenceNumber                                         ]
+            [simple   Uuid                            arUuid                                                 ]
+            [simple   uint 32                         api                                                    ]
+            [simple   uint 16                         slotNumber                                             ]
+            [simple   uint 16                         subSlotNumber                                          ]
+            [const    uint 16                         padField                  0x0000                       ]
+            [simple   uint 16                         index                                                  ]
+            [simple   uint 32                         recordDataLength                                       ]
+            [padding  uint 8      pad '0x00'          'index < 0x8000 ? 64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4 : 64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4']
+            [optional UserData('recordDataLength')     userData          'index < 0x8000'                    ]
+        ]
+        ['IOD_WRITE_RESPONSE_HEADER' IODWriteResponseHeader
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple   uint 16                         sequenceNumber                                         ]
+            [simple   Uuid                            arUuid                                                 ]
+            [simple   uint 32                         api                                                    ]
+            [simple   uint 16                         slotNumber                                             ]
+            [simple   uint 16                         subSlotNumber                                          ]
+            [const    uint 16                         padField                  0x0000                       ]
+            [simple   uint 16                         index                                                  ]
+            [simple   uint 32                         recordDataLength                                       ]
+            [padding  uint 8      pad '0x00'          '64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4']
+        ]
+        ['PD_INTERFACE_ADJUST' PDInterfaceAdjust
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [const    uint 16                         padField                  0x0000                       ]
+            [const    uint 16                         multipleInterfaceModeReserved2                  0x0000 ]
+            [const    uint 15                         multipleInterfaceModeReserved1                  0x0000 ]
+            [simple   MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice                    ]
+        ]
+        ['PD_PORT_DATA_CHECK' PDPortDataCheck
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [const    uint 16                         padField                  0x0000                       ]
+            [simple   uint 16                         slotNumber                                             ]
+            [simple   uint 16                         subSlotNumber                                          ]
+            [simple   PnIoCm_Block                    checkPeers                                             ]
+        ]
+        ['CHECK_PEERS'  CheckPeers
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [const    uint 8                          noOfPeers                 0x01                         ]
+            [simple   PascalString                    peerPortId                                             ]
+            [simple   PascalString                    peerChassisId                                          ]
+        ]
+        ['AR_BLOCK_REQ' PnIoCm_Block_ArReq
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple   PnIoCm_ArType                   arType                                                 ]
+            [simple   Uuid                            arUuid                                                 ]
+            [simple   uint 16                         sessionKey                                             ]
+            [simple   MacAddress                      cmInitiatorMacAddr                                     ]
+            [simple   DceRpc_ObjectUuid               cmInitiatorObjectUuid                                  ]
+            // Begin ARProperties
+            [simple   bit                             pullModuleAlarmAllowed                                 ]
+            [simple   bit                             nonLegacyStartupMode                                   ]
+            [simple   bit                             combinedObjectContainerUsed                            ]
+            [reserved uint 17                         '0x00000'                                              ]
+            [simple   bit                             acknowledgeCompanionAr                                 ]
+            [simple   PnIoCm_CompanionArType          companionArType                                        ]
+            [simple   bit                             deviceAccess                                           ]
+            [reserved uint 3                          '0x0'                                                  ]
+            [simple   bit                             cmInitiator                                            ]
+            [simple   bit                             supervisorTakeoverAllowed                              ]
+            [simple   PnIoCm_State                    state                                                  ]
+            // End ARProperties
+            [simple   uint 16                         cmInitiatorActivityTimeoutFactor                       ]
+            [simple   uint 16                         cmInitiatorUdpRtPort                                   ]
+            [implicit uint 16                         stationNameLength     'STR_LEN(cmInitiatorStationName)']
+            [simple   vstring 'stationNameLength * 8' cmInitiatorStationName                                 ]
+        ]
+        ['AR_BLOCK_RES' PnIoCm_Block_ArRes
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple   PnIoCm_ArType          arType                                                          ]
+            [simple   Uuid                   arUuid                                                          ]
+            [simple   uint 16                sessionKey                                                      ]
+            [simple   MacAddress             cmResponderMacAddr                                              ]
+            [simple   uint 16                responderUDPRTPort                                              ]
+        ]
+        ['IOD_CONTROL_REQ' PnIoCm_Control_Request
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   Uuid                            arUuid                                                 ]
+            [simple   uint 16                         sessionKey                                             ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   uint 16                         controlCommand                                         ]
+            [reserved uint 16                         '0x0000'                                               ]
+        ]
+        ['IOX_BLOCK_REQ'    PnIoCM_Block_Request
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   Uuid                            arUuid                                                 ]
+            [simple   uint 16                         sessionKey                                             ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   uint 16                         controlCommand                                         ]
+            [simple   uint 16                         controlBlockProperties                                 ]
+        ]
+        ['IOX_BLOCK_RES'    PnIoCM_Block_Response
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   Uuid                            arUuid                                                 ]
+            [simple   uint 16                         sessionKey                                             ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   uint 16                         controlCommand                                         ]
+            [simple   uint 16                         controlBlockProperties                                 ]
+        ]
+        ['IOD_CONTROL_RES' PnIoCm_Control_Response
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   Uuid                            arUuid                                                 ]
+            [simple   uint 16                         sessionKey                                             ]
+            [reserved uint 16                         '0x0000'                                               ]
+            [simple   uint 16                         controlCommand                                         ]
+            [reserved uint 16                         '0x0000'                                               ]
+        ]
+        ['IO_CR_BLOCK_REQ' PnIoCm_Block_IoCrReq
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple PnIoCm_IoCrType          ioCrType                                               ]
+            [simple uint 16                  ioCrReference                                          ]
+            [simple uint 16                  lt                                                     ]
+            // Begin IOCRProperties
+            [simple   bit                    fullSubFrameStructure                                  ]
+            [simple   bit                    distributedSubFrameWatchDog                            ]
+            [simple   bit                    fastForwardingMacAdr                                   ]
+            [reserved uint 17                '0x0000'                                               ]
+            [simple   bit                    mediaRedundancy                                        ]
+            [reserved uint 7                 '0x00'                                                 ]
+            [simple   PnIoCm_RtClass         rtClass                                                ]
+            // End IOCRProperties
+            [simple   uint 16                dataLength                                             ]
+            [simple   uint 16                frameId                                                ]
+            [simple   uint 16                sendClockFactor                                        ]
+            [simple   uint 16                reductionRatio                                         ]
+            [simple   uint 16                phase                                                  ]
+            [simple   uint 16                sequence                                               ]
+            [simple   uint 32                frameSendOffset                                        ]
+            [simple   uint 16                watchDogFactor                                         ]
+            [simple   uint 16                dataHoldFactor                                         ]
+            [simple   uint 16                ioCrTagHeader                                          ]
+            [simple   MacAddress             ioCrMulticastMacAdr                                    ]
+            [implicit uint 16                numberOfApis        'COUNT(apis)'                      ]
+            [array    PnIoCm_IoCrBlockReqApi apis                count         'numberOfApis'       ]
+        ]
+        ['IO_CR_BLOCK_RES' PnIoCm_Block_IoCrRes
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple PnIoCm_IoCrType          ioCrType                                               ]
+            [simple uint 16                  ioCrReference                                          ]
+            [simple   uint 16                frameId                                                ]
+        ]
+        ['ALARM_CR_BLOCK_REQ' PnIoCm_Block_AlarmCrReq
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple   PnIoCm_AlarmCrType     alarmType                                              ]
+            [simple   uint 16                lt                                                     ]
+            // Begin AlarmCrProperties
+            [reserved uint 30                '0x00000000'                                           ]
+            [simple   bit                    transport                                              ]
+            [simple   bit                    priority                                               ]
+            // End AlarmCrProperties
+            [simple   uint 16                rtaTimeoutFactor                                       ]
+            [simple   uint 16                rtaRetries                                             ]
+            [simple   uint 16                localAlarmReference                                    ]
+            [simple   uint 16                maxAlarmDataLength                                     ]
+            [simple   uint 16                alarmCtrTagHeaderHigh                                  ]
+            [simple   uint 16                alarmCtrTagHeaderLow                                   ]
+        ]
+        ['ALARM_CR_BLOCK_RES' PnIoCm_Block_AlarmCrRes
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple   PnIoCm_AlarmCrType     alarmType                                              ]
+            [simple   uint 16                localAlarmReference                                    ]
+            [simple   uint 16                maxAlarmDataLength                                     ]
+        ]
+        ['EXPECTED_SUBMODULE_BLOCK_REQ' PnIoCm_Block_ExpectedSubmoduleReq
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [implicit uint 16                numberOfApis         'COUNT(apis)'                     ]
+            [array    PnIoCm_ExpectedSubmoduleBlockReqApi apis   count         'numberOfApis'       ]
+        ]
+        ['MODULE_DIFF_BLOCK' PnIoCm_Block_ModuleDiff
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [implicit uint 16                numberOfApis         'COUNT(apis)'                     ]
+            [array    PnIoCm_ModuleDiffBlockApi apis              count         'numberOfApis'      ]
+        ]
+        ['AR_SERVER_BLOCK' PnIoCm_Block_ArServer
+            [implicit      uint 16          blockLength      'lengthInBytes - 4']
+            [simple        uint 8           blockVersionHigh                    ]
+            [simple        uint 8           blockVersionLow                     ]
+            [simple   PascalString                    stationName                                   ]
+            [padding  uint 8      pad '0x00'          '20 - 6 - (stationName.stringLength)'              ]
+        ]
+    ]
+]
+
+[type PnIoCm_IoCrBlockReqApi byteOrder='BIG_ENDIAN'
+    [const    uint 32             api              0x00000000             ]
+    [implicit uint 16             numIoDataObjects 'COUNT(ioDataObjects)'   ]
+    [array    PnIoCm_IoDataObject ioDataObjects    count 'numIoDataObjects' ]
+    [implicit uint 16             numIoCss         'COUNT(ioCss)'           ]
+    [array    PnIoCm_IoCs         ioCss            count 'numIoCss'         ]
+]
+
+[type PnIoCm_IoDataObject byteOrder='BIG_ENDIAN'
+    [simple   uint 16 slotNumber             ]
+    [simple   uint 16 subSlotNumber          ]
+    [simple   uint 16 ioDataObjectFrameOffset]
+]
+
+[type PnIoCm_IoCs byteOrder='BIG_ENDIAN'
+    [simple   uint 16 slotNumber   ]
+    [simple   uint 16 subSlotNumber]
+    [simple   uint 16 ioFrameOffset]
+]
+
+[type PnIoCm_DataUnitIoCs byteOrder='BIG_ENDIAN'
+    [simple   bit               dataState]
+    [simple   uint 2            instance ]
+    [reserved uint 4            '0x00'   ]
+    [simple   bit               extension]
+]
+
+[type PnIoCm_DataUnitDataObject(uint 16 dataObjectLength) byteOrder='BIG_ENDIAN'
+    [array    byte              dataState   count  'dataObjectLength']
+    [simple   PnIoCm_DataUnitIoCs iops   ]
+]
+
+[type PnIoCm_ExpectedSubmoduleBlockReqApi byteOrder='BIG_ENDIAN'
+    [const    uint 32          api               0x00000000                       ]
+    [simple   uint 16          slotNumber                                           ]
+    [simple   uint 32          moduleIdentNumber                                    ]
+    [simple   uint 16          moduleProperties                                     ]
+    [implicit uint 16          numSubmodules     'COUNT(submodules)'                ]
+    [array    PnIoCm_Submodule submodules        count               'numSubmodules']
+]
+
+[type PnIoCm_ModuleDiffBlockApi byteOrder='BIG_ENDIAN'
+    [const    uint 32                          api        0x00000000                    ]
+    [implicit uint 16                          numModules 'COUNT(modules)'                ]
+    [array    PnIoCm_ModuleDiffBlockApi_Module modules    count               'numModules']
+]
+
+[type PnIoCm_ModuleDiffBlockApi_Module byteOrder='BIG_ENDIAN'
+    [simple   uint 16                             slotNumber                                           ]
+    [simple   uint 32                             moduleIdentNumber                                    ]
+    [simple   PnIoCm_ModuleState                  moduleState                                          ]
+    [implicit uint 16                             numSubmodules     'COUNT(submodules)'                ]
+    [array    PnIoCm_ModuleDiffBlockApi_Submodule submodules        count               'numSubmodules']
+]
+
+[type PnIoCm_ModuleDiffBlockApi_Submodule byteOrder='BIG_ENDIAN'
+    [simple uint 16          subslotNumber       ]
+    [simple uint 32          submoduleIdentNumber]
+    [simple bit              codingUsesIdentInfo ]
+    [simple PnIoCm_IdentInfo identInfo           ]
+    [simple PnIoCm_ArInfo    arInfo              ]
+    [simple bit              diagInfoAvailable   ]
+    [simple bit              maintenanceDemanded ]
+    [simple bit              maintenanceRequired ]
+    [simple bit              qualifiedInfo       ]
+    [simple PnIoCm_AddInfo   addInfo             ]
+]
+
+[discriminatedType PnIoCm_Submodule byteOrder='BIG_ENDIAN'
+    [simple        uint 16                slotNumber                    ]
+    [simple        uint 32                submoduleIdentNumber          ]
+    // Begin SubmoduleProperties
+    [reserved      uint 10                '0x000'                       ]
+    [simple        bit                    discardIoxs                   ]
+    [simple        bit                    reduceOutputModuleDataLength  ]
+    [simple        bit                    reduceInputModuleDataLength   ]
+    [simple        bit                    sharedInput                   ]
+    [discriminator PnIoCm_SubmoduleType   submoduleType                 ]
+    // End SubmoduleProperties
+    [typeSwitch submoduleType
+        ['NO_INPUT_NO_OUTPUT_DATA' PnIoCm_Submodule_NoInputNoOutputData
+            [const    uint 16             dataDescription       0x0001]
+            [const    uint 16             submoduleDataLength   0x0000]
+            [const    uint 8              lengthIoCs            0x01  ]
+            [const    uint 8              lengthIoPs            0x01  ]
+        ]
+        ['INPUT_DATA' PnIoCm_Submodule_InputData
+            [const    uint 16             inputDataDescription  0x0001]
+            [simple   uint 16             inputSubmoduleDataLength      ]
+            [simple   uint 8              inputLengthIoCs               ]
+            [simple   uint 8              inputLengthIoPs               ]
+        ]
+        ['OUTPUT_DATA' PnIoCm_Submodule_OutputData
+            [const    uint 16             inputDataDescription  0x0002]
+            [simple   uint 16             inputSubmoduleDataLength      ]
+            [simple   uint 8              inputLengthIoCs               ]
+            [simple   uint 8              inputLengthIoPs               ]
+        ]
+        ['INPUT_AND_OUTPUT_DATA' PnIoCm_Submodule_InputAndOutputData
+            [const    uint 16             inputDataDescription  0x0001]
+            [simple   uint 16             inputSubmoduleDataLength      ]
+            [simple   uint 8              inputLengthIoCs               ]
+            [simple   uint 8              inputLengthIoPs               ]
+            [const    uint 16             outputDataDescription 0x0002]
+            [simple   uint 16             outputSubmoduleDataLength     ]
+            [simple   uint 8              outputLengthIoCs              ]
+            [simple   uint 8              outputLengthIoPs              ]
+        ]
+    ]
+]
+
+[enum uint 16 PnIoCm_BlockType
+    ['0x0008' IOD_WRITE_REQUEST_HEADER    ]
+    ['0x0101' AR_BLOCK_REQ                ]
+    ['0x0102' IO_CR_BLOCK_REQ             ]
+    ['0x0103' ALARM_CR_BLOCK_REQ          ]
+    ['0x0104' EXPECTED_SUBMODULE_BLOCK_REQ]
+    ['0x0110' IOD_CONTROL_REQ             ]
+    ['0x0112' IOX_BLOCK_REQ               ]
+    ['0x0200' PD_PORT_DATA_CHECK          ]
+    ['0x020a' CHECK_PEERS                 ]
+    ['0x0250' PD_INTERFACE_ADJUST         ]
+    ['0x8008' IOD_WRITE_RESPONSE_HEADER    ]
+    ['0x8101' AR_BLOCK_RES                ]
+    ['0x8102' IO_CR_BLOCK_RES             ]
+    ['0x8103' ALARM_CR_BLOCK_RES          ]
+    ['0x8104' MODULE_DIFF_BLOCK           ]
+    ['0x8106' AR_SERVER_BLOCK             ]
+    ['0x8110' IOD_CONTROL_RES             ]
+    ['0x8112' IOX_BLOCK_RES               ]
+]
+
+[enum uint 8 ProfinetDeviceState
+    ['0x00'     IDLE]
+    ['0x01'     STARTUP]
+    ['0x02'     PREMED]
+    ['0x03'     WAITAPPLRDY]
+    ['0x04'     APPLRDY]
+    ['0x05'     CYCLICDATA]
+    ['0xFF'     ABORT]
+]
+
+[enum uint 16 PnIoCm_ArType
+    ['0x0001' IO_CONTROLLER]
+]
+
+[enum uint 2 PnIoCm_CompanionArType
+    ['0x0' SINGLE_AR]
+]
+
+[enum uint 3 PnIoCm_State
+    ['0x1' ACTIVE]
+]
+
+[enum uint 16 PnIoCm_IoCrType
+    ['0x0001' INPUT_CR]
+    ['0x0002' OUTPUT_CR]
+]
+
+[enum uint 4 PnIoCm_RtClass
+    ['0x2' RT_CLASS_2]
+]
+
+[enum uint 16 PnIoCm_AlarmCrType
+    ['0x0001' ALARM_CR]
+]
+
+[enum uint 16 PnIoCm_ModuleState
+    ['0x0002' PROPER_MODULE]
+]
+
+[enum uint 2 PnIoCm_SubmoduleType
+    ['0x0' NO_INPUT_NO_OUTPUT_DATA]
+    ['0x1' INPUT_DATA]
+    ['0x2' OUTPUT_DATA]
+    ['0x3' INPUT_AND_OUTPUT_DATA]
+]
+
+[enum bit MultipleInterfaceModeNameOfDevice
+    ['false' PORT_PROVIDED_BY_LLDP]
+    ['true'  NAME_PROVIDED_BY_LLDP]
+]
+
+[enum uint 16 PnIoCm_DescriptionType
+    ['0x0001' INPUT]
+]
+
+[enum uint 4 PnIoCm_IdentInfo
+    ['0x0' OK]
+]
+
+[enum uint 4 PnIoCm_ArInfo
+    ['0x0' OWN]
+]
+
+[enum uint 3 PnIoCm_AddInfo
+    ['0x0' NONE]
+]
+
+[enum uint 4 IntegerEncoding
+    ['0x0' BIG_ENDIAN]
+    ['0x1' LITTLE_ENDIAN]
+]
+
+[enum uint 4 CharacterEncoding
+    ['0x0' ASCII]
+    ['0x1' EBCDIC]
+]
+
+[enum uint 8 FloatingPointEncoding
+    ['0x00' IEEE]
+    ['0x01' VAX ]
+    ['0x02' CRAY]
+    ['0x03' IBM ]
+]
+
+
+[dataIo DataItem(ProfinetDataType dataType, uint 16 numberOfValues)
+    [typeSwitch dataType,numberOfValues
+        ['BOOL','1'  BOOL
+            [simple   bit     value                            ]
+        ]
+        ['BOOL'      List
+            [array    bit     value count 'numberOfValues'     ]
+        ]
+        ['BYTE','1'  BYTE
+            [simple uint 8 value]
+        ]
+        ['BYTE' List
+            [array    bit     value count 'numberOfValues * 8' ]
+        ]
+        ['WORD'      WORD
+            [simple   uint 16 value]
+        ]
+        ['DWORD'     DWORD
+            [simple   uint 32 value]
+        ]
+        ['LWORD'     LWORD
+            [simple   uint 64 value]
+        ]
+        ['SINT','1' SINT
+            [simple   int 8   value ]
+        ]
+        ['SINT' List
+            [array int 8 value count 'numberOfValues']
+        ]
+        ['INT','1' INT
+            [simple int 16 value]
+        ]
+        ['INT' List
+            [array int 16 value count 'numberOfValues']
+        ]
+        ['DINT','1' DINT
+            [simple int 32 value]
+        ]
+        ['DINT' List
+            [array int 32 value count 'numberOfValues']
+        ]
+        ['LINT','1' LINT
+            [simple int 64 value]
+        ]
+        ['LINT' List
+            [array int 64 value count 'numberOfValues']
+        ]
+        ['USINT','1' USINT
+            [simple   uint 8 value ]
+        ]
+        ['USINT' List
+            [array uint 8 value count 'numberOfValues']
+        ]
+        ['UINT','1' UINT
+            [simple uint 16 value]
+        ]
+        ['UINT' List
+            [array uint 16 value count 'numberOfValues']
+        ]
+        ['UDINT','1' UDINT
+            [simple uint 32 value]
+        ]
+        ['UDINT' List
+            [array uint 32 value count 'numberOfValues']
+        ]
+        ['ULINT','1' ULINT
+            [simple uint 64 value]
+        ]
+        ['ULINT' List
+            [array uint 64 value count 'numberOfValues']
+        ]
+        ['REAL','1' REAL
+            [simple float 32  value]
+        ]
+        ['REAL' List
+            [array float 32 value count 'numberOfValues']
+        ]
+        ['LREAL','1' LREAL
+            [simple float 64  value]
+        ]
+        ['LREAL' List
+            [array float 64 value count 'numberOfValues']
+        ]
+        ['CHAR','1' CHAR
+            [simple string 8 value encoding='"UTF-8"']
+        ]
+        ['CHAR' List
+            [array string 8 value count 'numberOfValues' encoding='"UTF-8"']
+        ]
+        ['WCHAR','1' WCHAR
+            [simple string 16 value encoding='"UTF-16"']
+        ]
+        ['WCHAR' List
+            [array string 16 value count 'numberOfValues' encoding='"UTF-16"']
+        ]
+    ]
+]
+
+[enum uint 8 ProfinetDataType(uint 8 dataTypeSize, string 16 conversion)
+    ['1' BOOL ['1','BOOLEAN']]
+    ['2' BYTE ['1','BYTE']]
+    ['3' WORD ['2','WORD']]
+    ['4' DWORD ['4','DWORD']]
+    ['5' LWORD ['8','LWORD']]
+    ['6' SINT ['1','SIGNED8']]
+    ['7' INT ['2','SIGNED16']]
+    ['8' DINT ['4','SIGNED32']]
+    ['9' LINT ['8','SIGNED64']]
+    ['10' USINT ['1','UNSIGNED8']]
+    ['11' UINT ['2','UNSIGNED16']]
+    ['12' UDINT ['4','UNSIGNED32']]
+    ['13' ULINT ['8','UNSIGNED64']]
+    ['14' REAL ['4','FLOAT32']]
+    ['15' LREAL ['8','FLOAT64']]
+    ['16' TIME ['8','TIME']]
+    ['17' LTIME ['8','LTIME']]
+    ['18' DATE ['8','DATE']]
+    ['19' LDATE ['8','LDATE']]
+    ['20' TIME_OF_DAY ['8','TIME_OF_DAY']]
+    ['21' LTIME_OF_DAY ['8','LTIME_OF_DAY']]
+    ['22' DATE_AND_TIME ['8','DATE_AND_TIME']]
+    ['23' LDATE_AND_TIME ['8','LDATE_AND_TIME']]
+    ['24' CHAR ['1','CHAR']]
+    ['25' WCHAR ['2','WCHAR']]
+    ['26' STRING ['1','STRING']]
+    ['27' WSTRING ['2','WSTRING']]
+]
diff --git a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec b/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
deleted file mode 100644
index a2775061ed..0000000000
--- a/protocols/profinet/src/main/resources/protocols/profinet/profinet.mspec
+++ /dev/null
@@ -1,1431 +0,0 @@
-/*
- * 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.
- */
-
- /*
- Overview of the Protocols involved in this driver:
-
- Ethernet
- Udp                                                        (Based on Ethernet)
- DceRpc                                                     (Based on Udp and Ethernet)
-
- ARP		Address Resolution Protocol                     (Based on Ethernet)
- LLDP		Link Layer Discovery Protocol                   (Based on Ethernet)
-
- PnDcp		PROFINET Discovery and Configuration Protocol   (Based on Ethernet)
- PnIoCm 	PROFINET IO Context Manager                     (Based on DCP/RPC, UDP and Ethernet)
- PnIo		PROFINET IO                                     (Based on Ethernet)
- PnIoPs 	PROFIsafe protocol                              (Based on Ethernet)
- PnIoAl 	PROFINET Alarm Events                           (Based on Ethernet)
-
- // Not really handled in this driver (Just listed for the sake of completeness)
- PnPtcp     PROFINET Precision Transparent Clock Protocol
-*/
-
-[type Ethernet_Frame byteOrder='BIG_ENDIAN'
-    // When sending to the mac address prefix of 01:0e:cf are multicast packets
-    [simple MacAddress            destination]
-    [simple MacAddress            source     ]
-    [simple Ethernet_FramePayload payload    ]
-]
-
-[discriminatedType Ethernet_FramePayload
-    [discriminator uint 16 packetType]
-    [typeSwitch packetType
-        ['0x0800' Ethernet_FramePayload_IPv4
-            [const    uint 4              version                         0x4                        ]
-            // 5 = 5 x 32bit = 5 x 4byte = 20byte
-            [const    uint 4              headerLength                    0x5                        ]
-            [const    uint 6              differentiatedServicesCodepoint 0x00                       ]
-            [const    uint 2              explicitCongestionNotification  0x0                        ]
-            // Length of the header + payload
-            [implicit uint 16             totalLength                     '28 + payload.lengthInBytes']
-            [simple   uint 16             identification                                             ]
-            [reserved bit                                                 'false'                    ]
-            [simple   bit                 dontFragment                                               ]
-            [simple   bit                 moreFragments                                              ]
-            [const    uint 13             fragmentOffset                  0x00                       ]
-            [simple   uint 8              timeToLive                                                 ]
-            // Protocol: UDP
-            [const    uint 8              protocol                        0x11                       ]
-            // It seems that modern NICs mess this up as they take care of the validation in dedicated hardware.
-            // This results in the wrong values being read. Using a 'checksum' field would fail most incoming packets.
-            [implicit uint 16             headerChecksum                 'STATIC_CALL("calculateIPv4Checksum", totalLength, identification, timeToLive, sourceAddress, destinationAddress)']
-            [simple   IpAddress           sourceAddress                                              ]
-            [simple   IpAddress           destinationAddress                                         ]
-            // Begin of the UDP packet part
-            [simple   uint 16             sourcePort                                                 ]
-            [simple   uint 16             destinationPort                                            ]
-            [implicit uint 16             packetLength    '8 + payload.lengthInBytes'                ]
-            [implicit uint 16             bodyChecksum                    'STATIC_CALL("calculateUdpChecksum", sourceAddress, destinationAddress, sourcePort, destinationPort, packetLength, payload)']
-            [simple   DceRpc_Packet       payload                                                    ]
-        ]
-        ['0x8100' Ethernet_FramePayload_VirtualLan
-            [simple VirtualLanPriority    priority                                                   ]
-            [simple bit                   ineligible                                                 ]
-            [simple uint 12               id                                                         ]
-            [simple Ethernet_FramePayload payload                                                    ]
-        ]
-        ['0x8892' Ethernet_FramePayload_PnDcp
-            [simple PnDcp_Pdu             pdu                                                        ]
-        ]
-        ['0x88cc' Ethernet_FramePayload_LLDP
-            [simple Lldp_Pdu      pdu                                               ]
-        ]
-    ]
-]
-
-[type Lldp_Pdu
-    [manualArray LldpUnit lldpParameters terminated 'STATIC_CALL("isSysexEnd", readBuffer)' 'STATIC_CALL("parseSysexString", readBuffer)' 'STATIC_CALL("serializeSysexString", writeBuffer, _value)' 'STATIC_CALL("lengthSysexString", lldpParameters)']
-]
-
-[discriminatedType LldpUnit
-    [discriminator     TlvType                  tlvId                                ]
-    [simple            uint 9                   tlvIdLength                          ]
-    [typeSwitch tlvId
-        ['END_OF_LLDP'  EndOfLldp
-        ]
-        ['CHASSIS_ID'   TlvChassisId(uint 9 tlvIdLength)
-            [simple     uint 8                        chassisIdSubType              ]
-            [simple     vstring     '(tlvIdLength - 1) * 8' chassisId               ]
-        ]
-        ['PORT_ID'   TlvPortId(uint 9 tlvIdLength)
-            [simple     uint 8          portIdSubType                               ]
-            [simple     vstring     '(tlvIdLength - 1) * 8' portId                  ]
-        ]
-        ['TIME_TO_LIVE'   TlvTimeToLive
-            [simple     uint 16         tlvTimeToLiveUnit                           ]
-        ]
-        ['PORT_DESCRIPTION'   TlvPortDescription(uint 9 tlvIdLength)
-            [simple     vstring     '(tlvIdLength) * 8' chassisId                   ]
-        ]
-        ['SYSTEM_NAME'   TlvSystemName(uint 9 tlvIdLength)
-            [simple     vstring     '(tlvIdLength) * 8' chassisId                   ]
-        ]
-        ['SYSTEM_DESCRIPTION'   TlvSystemDescription(uint 9 tlvIdLength)
-            [simple     vstring     '(tlvIdLength) * 8' chassisId                   ]
-        ]
-        ['SYSTEM_CAPABILITIES'   TlvSystemCapabilities
-            [reserved   uint 8                          '0x00'                      ]
-            [simple     bit             stationOnlyCapable                          ]
-            [simple     bit             docsisCableDeviceCapable                    ]
-            [simple     bit             telephoneCapable                            ]
-            [simple     bit             routerCapable                               ]
-            [simple     bit             wlanAccessPointCapable                      ]
-            [simple     bit             bridgeCapable                               ]
-            [simple     bit             repeaterCapable                             ]
-            [simple     bit             otherCapable                                ]
-            [reserved   uint 8                          '0x00'                      ]
-            [simple     bit             stationOnlyEnabled                          ]
-            [simple     bit             docsisCableDeviceEnabled                    ]
-            [simple     bit             telephoneEnabled                            ]
-            [simple     bit             routerEnabled                               ]
-            [simple     bit             wlanAccessPointEnabled                      ]
-            [simple     bit             bridgeEnabled                               ]
-            [simple     bit             repeaterEnabled                             ]
-            [simple     bit             otherEnabled                                ]
-        ]
-        ['MANAGEMENT_ADDRESS' TlvManagementAddress
-            [implicit   uint 8          addressStringLength    '5' ]
-            [simple     ManagementAddressSubType  addressSubType                   ]
-            [simple     IpAddress       ipAddress                                  ]
-            [simple     uint 8          interfaceSubType                           ]
-            [simple     uint 32         interfaceNumber                            ]
-            [simple     uint 8          oidStringLength                            ]
-        ]
-        ['ORGANIZATION_SPECIFIC' TlvOrganizationSpecific
-            [simple     TlvOrganizationSpecificUnit     organizationSpecificUnit   ]
-        ]
-    ]
-]
-
-[discriminatedType TlvOrganizationSpecificUnit
-    [discriminator      uint 24         uniqueCode]
-    [typeSwitch uniqueCode
-        ['0x000ECF' TlvOrgSpecificProfibus
-            [simple     TlvOrgSpecificProfibusUnit      specificUnit               ]
-        ]
-        ['0x00120F' TlvOrgSpecificIeee8023
-            [simple     TlvOrgSpecificIeee8023Unit      specificUnit               ]
-        ]
-    ]
-]
-
-[discriminatedType TlvOrgSpecificIeee8023Unit
-    [discriminator  TlvIEEESubType  subType]
-    [typeSwitch subType
-        ['MAC_PHY_CONFIG_STATUS'  TlvIeee8023MacPhyConfigStatus
-            [simple     uint 8                          negotiationSupport         ]
-            [simple     uint 16                         negotiationCapability      ]
-            [simple     uint 16                         operationalMauType         ]
-        ]
-        ['MAX_FRAME_SIZE'  TlvIeee8023MaxFrameSize
-            [simple     uint 16                         maxSize                    ]
-        ]
-    ]
-]
-
-[discriminatedType TlvOrgSpecificProfibusUnit
-    [discriminator  TlvProfibusSubType  subType]
-    [typeSwitch subType
-        ['MEASURED_DELAY'  TlvProfibusSubTypeMeasuredDelay
-            [simple     uint 32                         localPortRxDelay]
-            [simple     uint 32                         remotePortRxDelay]
-            [simple     uint 32                         localPortTxDelay]
-            [simple     uint 32                         remotePortTxDelay]
-        ]
-        ['PORT_STATUS'  TlvProfibusSubTypePortStatus
-            [simple     uint 16                         rtClass2PortStatus]
-            [reserved   uint 2                          '0x00'           ]
-            [simple     bit                             preample         ]
-            [simple     bit                             fragmentation    ]
-            [reserved   uint 9                          '0x00'           ]
-            [simple     uint 3                          rtClass3PortStatus]
-        ]
-        ['MRP_PORT_STATUS'  TlvProfibusSubTypeMrpPortStatus
-            [simple     Uuid                      macAddress]
-            [simple     uint 16                   Status]
-        ]
-        ['CHASSIS_MAC'  TlvProfibusSubTypeChassisMac
-            [simple     MacAddress                      macAddress]
-        ]
-    ]
-]
-
-[enum  uint 8 TlvIEEESubType
-    ['0x01' MAC_PHY_CONFIG_STATUS]
-    ['0x04' MAX_FRAME_SIZE]
-]
-
-[enum  uint 8 TlvProfibusSubType
-    ['0x01' MEASURED_DELAY]
-    ['0x02' PORT_STATUS]
-    ['0x04' MRP_PORT_STATUS]
-    ['0x05' CHASSIS_MAC]
-]
-
-// 4.10.3.2
-// A lot of the fields are set to constant values, which would
-// usually be dynamic. However are we trying to limit the number of
-// arguments needed to construct the messages and Profinet only seems
-// be using a very limited subset of all possible DCE/RPC packets.
-[type DceRpc_Packet byteOrder='BIG_ENDIAN'
-// RPC Header {
-    // RPCVersion 4.10.3.2.1
-    [const         uint 8                version                        0x04                 ]
-    // RPCPacketType 4.10.3.2.2 (8 bit)
-    [simple        DceRpc_PacketType     packetType                                            ]
-    // PRCFlags 4.10.3.2.3
-    [reserved      bit                                                  'false'                ]
-    [const         bit                   broadcast                      false                ]
-    [simple        bit                   idempotent                                            ]
-    [const         bit                   maybe                          false                ]
-    [simple        bit                   noFragmentAcknowledgeRequested                        ]
-    [const         bit                   fragment                       false                ]
-    [simple        bit                   lastFragment                                          ]
-    [reserved      bit                                                  'false'                ]
-    // PRCFlags2 4.10.3.2.4
-    [reserved      uint 6                                               '0x00'                 ]
-    [const         bit                   cancelWasPending               false                ]
-    [reserved      bit                                                  'false'                ]
-    // RPCDRep 4.10.3.2.5 (4 bit & 4 bit)
-    [simple        IntegerEncoding       integerEncoding                                       ]
-    [simple        CharacterEncoding     characterEncoding                                     ]
-    // RPCDRep2 4.10.3.2.5 (8 bit)
-    [simple        FloatingPointEncoding floatingPointEncoding                                 ]
-    // RPCDRep3 (8 bit shall be 0)
-    [reserved      uint 8                                               '0x00'                 ]
-    // RPCSerialHigh 4.10.3.2.6
-    [const         uint 8                serialHigh                     0x00                 ]
-    [batchSet byteOrder='integerEncoding == IntegerEncoding.BIG_ENDIAN ? BIG_ENDIAN : LITTLE_ENDIAN'
-        // RPCObjectUUID 4.10.3.2.8
-        // RPCObjectUUID 4.10.3.2.8
-        [simple DceRpc_ObjectUuid        objectUuid                                            ]
-        // RPCInterfaceUUID 4.10.3.2.9
-        [simple DceRpc_InterfaceUuid     interfaceUuid                                         ]
-        // RPCActivityUUID 4.10.3.2.10
-        [simple DceRpc_ActivityUuid      activityUuid                                          ]
-        // RPCServerBootTime 4.10.3.2.11
-        [simple uint 32                  serverBootTime                                        ]
-        // RPCInterfaceVersion 4.10.3.2.12
-        [const  uint 32                  interfaceVer                   0x00000001           ]
-        // RPCSequenceNmb 4.10.3.2.13
-        [simple uint 32                  sequenceNumber                                        ]
-        // RPCOperationNmb 4.10.3.2.14
-        [simple DceRpc_Operation         operation                                             ]
-        // RPCInterfaceHint 4.10.3.2.15
-        [const        uint 16            interfaceHint                  0xFFFF               ]
-        // RPCActivityHint 4.10.3.2.16
-        [const        uint 16            activityHint                   0xFFFF               ]
-        // RPCLengthOfBody 4.10.3.2.17
-        [implicit     uint 16            lengthOfBody                   'payload.lengthInBytes']
-        // RPCFragmentNmb 4.10.3.2.18 (Setting this to 0 as we will probably never have anything but 0 here
-        [const        uint 16            fragmentNum                    0x0000               ]
-        // RPCAuthenticationProtocol 4.10.3.2.19
-        [const        uint 8             authProto                      0x00                 ]
-    ]
-    // RPCSerialLow 4.10.3.2.7
-    [const            uint 8             serialLow                      0x00                 ]
-// RPC Header }
-// RPC Payload {
-    [simple PnIoCm_Packet('packetType') payload byteOrder='integerEncoding == IntegerEncoding.BIG_ENDIAN ? BIG_ENDIAN : LITTLE_ENDIAN' ]
-// RPC Payload }
-]
-
-// RPCObjectUUID 4.10.3.2.8
-[type DceRpc_ObjectUuid
-    [const  uint 32 data1      0xDEA00000                       ]
-    [const  uint 16 data2      0x6C97                           ]
-    [const  uint 16 data3      0x11D1                           ]
-    // This part is described as a byte array, so the byte order is always big-endian
-    [const  uint 16 data4      0x8271     byteOrder='BIG_ENDIAN']
-    [simple uint 4  interfaceNumber       byteOrder='BIG_ENDIAN']
-    [simple uint 12 nodeNumber            byteOrder='BIG_ENDIAN']
-    [simple uint 16 deviceId              byteOrder='BIG_ENDIAN']
-    [simple uint 16 vendorId              byteOrder='BIG_ENDIAN']
-]
-
-// RPCInterfaceUUID 4.10.3.2.9
-// NOTE: If we would have been only using Big Endian encoding, we would have
-//       implemented this via an enum. However as the first 8 bytes are
-//       dynamically endianed and the last 8 bytes are set to Big Endian, we
-//       had to do this trick.
-[discriminatedType DceRpc_InterfaceUuid
-    [discriminator  uint 32 interfaceType                               ]
-    [const          uint 16 data1      0x6C97                           ]
-    [const          uint 16 data2      0x11D1                           ]
-    // This part is described as a byte array, so the byte order is always big-endian
-    [const          uint 16 data3      0x8271     byteOrder='BIG_ENDIAN']
-    [const          uint 16 data4      0x00A0     byteOrder='BIG_ENDIAN']
-    [const          uint 16 data5      0x2442     byteOrder='BIG_ENDIAN']
-    [const          uint 16 data6      0xDF7D     byteOrder='BIG_ENDIAN']
-    [typeSwitch interfaceType
-        ['0xDEA00001' DceRpc_InterfaceUuid_DeviceInterface
-        ]
-        ['0xDEA00002' DceRpc_InterfaceUuid_ControllerInterface
-        ]
-        ['0xDEA00003' DceRpc_InterfaceUuid_SupervisorInterface
-        ]
-        ['0xDEA00004' DceRpc_InterfaceUuid_ParameterInterface
-        ]
-    ]
-]
-
-// RPCActivityUUID 4.10.3.2.10
-// NOTE: This value is generally randomly generated by the initiator
-//       and used throughout the entire communication. Unfortunately,
-//       the first parts are effected by endianess, and the last 8
-//       bytes are fixed big-endian. Therefore the complicated notation.
-[type DceRpc_ActivityUuid
-    [simple  uint 32 data1          ]
-    [simple  uint 16 data2          ]
-    [simple  uint 16 data3          ]
-    // This part is described as a byte array, so the byte order is always big-endian
-    [array   byte    data4 count '8']
-]
-
-// There are some special MAC addresses reserved:
-// 01-0E-CF-00-00-00:      As destination for DCP-Identify-ReqPDU (The FrameID is then required to be set to 0xFEFE)
-// 01-0E-CF-00-00-01:      As destination for DCP-Helo-ReqPDU (The FrameID is then required to be set to 0xFEFC)
-// 01-0E-CF-00-00-02:      Reserved
-// 01-0E-CF-00-01-00:      Reserved for further multicast addresses within the Type 10 context
-// 01-0E-CF-00-01-01:      As multicast destination for RT_CLASS_3
-// 01-0E-CF-00-01-02:      As invalid frame multicast destination for RT_CLASS_3
-// 01-0E-CF-00-01-03 - FF: Reserved for further multicast addresses within the Type 10 context
-[type MacAddress
-    [array byte address count '6']
-]
-
-[type IpAddress
-    [array byte data count '4']
-]
-
-// 4.10.3.2.2
-[enum uint 8 DceRpc_PacketType
-    ['0x00' REQUEST              ]
-    ['0x01' PING                 ]
-    ['0x02' RESPONSE             ]
-    ['0x03' FAULT                ]
-    ['0x04' WORKING              ]
-    // Response to PING
-    ['0x05' NO_CALL              ]
-    ['0x06' REJECT               ]
-    ['0x07' ACKNOWLEDGE          ]
-    ['0x08' CONNECTIONLESS_CANCEL]
-    ['0x09' FRAGMENT_ACKNOWLEDGE ]
-    ['0x0A' CANCEL_ACKNOWLEDGE   ]
-]
-
-//LLDP Specific
-[enum uint 7 TlvType
-    ['0x00' END_OF_LLDP          ]
-    ['0x01' CHASSIS_ID           ]
-    ['0x02' PORT_ID              ]
-    ['0x03' TIME_TO_LIVE         ]
-    ['0x04' PORT_DESCRIPTION     ]
-    ['0x05' SYSTEM_NAME          ]
-    ['0x06' SYSTEM_DESCRIPTION   ]
-    ['0x07' SYSTEM_CAPABILITIES  ]
-    ['0x08' MANAGEMENT_ADDRESS    ]
-    ['0x7F' ORGANIZATION_SPECIFIC]
-]
-
-[enum uint 8 ManagementAddressSubType
-    ['0x00' UNKNOWN              ]
-    ['0x01' IPV4                 ]
-]
-
-// 4.10.3.2.14
-[enum uint 16 DceRpc_Operation
-    ['0x0000' CONNECT      ]
-    ['0x0001' RELEASE      ]
-    ['0x0002' READ         ]
-    ['0x0003' WRITE        ]
-    ['0x0004' CONTROL      ]
-    ['0x0005' READ_IMPLICIT]
-]
-
-// https://de.wikipedia.org/wiki/IEEE_802.1p
-[enum uint 3 VirtualLanPriority   (string 16 acronym)
-    ['0x0' BEST_EFFORT              ['BE'                ]]
-    ['0x1' BACKGROUND               ['BK'                ]]
-    ['0x2' EXCELLENT_EFFORT         ['EE'                ]]
-    ['0x3' CRITICAL_APPLICATIONS    ['CA'                ]]
-    ['0x4' VIDEO                    ['VI'                ]]
-    ['0x5' VOICE                    ['VO'                ]]
-    ['0x6' INTERNETWORK_CONTROL     ['IC'                ]]
-    ['0x7' NETWORK_CONTROL          ['NC'                ]]
-]
-
-/////////////////////////////////////////////////////////////////////////////////////////
-//
-//   PROFINET DCP
-//
-// Discovery and basic configuration
-//
-/////////////////////////////////////////////////////////////////////////////////////////
-
-// Page 90
-[discriminatedType PnDcp_Pdu
-    [simple        uint 16           frameIdValue                      ]
-    [virtual       PnDcp_FrameId     frameId       'STATIC_CALL("getFrameId", frameIdValue)']
-    [typeSwitch frameId
-        ['RT_CLASS_1' PnDcp_Pdu_RealTimeCyclic
-            [manual   PnIo_CyclicServiceDataUnit
-                                          dataUnit
-                                                'STATIC_CALL("readDataUnit", readBuffer)'
-                                                'STATIC_CALL("writeDataUnit", writeBuffer, dataUnit)'
-                                                '(dataUnit.lengthInBytes)*8'      ]
-            [simple   uint 16                    cycleCounter             ]
-            // Data Status Start (4.7.2.1.3)
-            [simple   bit                        ignore                   ]
-            [reserved bit                        'false'                  ]
-            [simple   bit                        stationProblemIndicatorOk]
-            [simple   bit                        providerStateRun         ]
-            [reserved bit                        'false'                  ]
-            [simple   bit                        dataValid                ]
-            [simple   bit                        redundancy               ]
-            [simple   bit                        statePrimary             ]
-            // Data Status End
-            // "Transfer-Status" (Set to 0x00 for all RT-Classes except RT-CLASS-3,
-            // which PLC4X will never be able to support
-            [reserved uint 8                     '0x00'                   ] // transferStatus
-        ]
-        ['PTCP_DelayReqPDU' PcDcp_Pdu_DelayReq
-            // Header Start
-            [reserved uint 32 '0x00000000']
-            [reserved uint 32 '0x00000000']
-            [reserved uint 32 '0x00000000']
-            [simple   uint 16 sequenceId  ]
-            [reserved uint 16 '0x0000'    ]
-            // Header End
-            [simple   uint 32 delayInNs   ]
-            // Delay Parameter Start
-            // TODO: This seems to usually be an array of parameters terminated by an End-Parameter which is indicated by type and length being 0
-            [const    uint 7     parameterType   6]
-            [const    uint 9     parameterLength 6]
-            [simple   MacAddress portMacAddress   ]
-            [const    uint 7     endType         0]
-            [const    uint 9     endLength       0]
-            // Delay Parameter End
-        ]
-        ['Alarm_Low' PnDcp_Pdu_AlarmLow
-                    [simple uint 16 alarmDstEndpoint]
-                    [simple uint 16 alarmSrcEndpoint]
-                    [simple uint 4  version]
-                    [simple uint 4  errorType]
-                    [simple uint 4  tAck]
-                    [simple uint 4  windowSize]
-                    [simple uint 16 senSeqNum]
-                    [simple uint 16 ackSeqNum]
-                    [implicit uint 16 varPartLen 'COUNT(varPart)']
-                    [array    byte varPart                        length              'varPartLen']
-                ]
-        ['DCP_Identify_ReqPDU' PnDcp_Pdu_IdentifyReq
-            [const    uint 8      serviceId                    0x05                                ]
-            // ServiceType Start
-            [reserved uint 5      '0x00'                                                           ]
-            [const    bit         notSupported                 false                               ]
-            [reserved uint 1      '0x00'                                                           ]
-            [const    bit         response                     false                               ]
-            // ServiceType End
-            // 4.3.1.3.3 (Page 95)
-            [simple   uint 32     xid                                                              ]
-            // 4.3.1.3.5 (Page 95ff)
-            [simple   uint 16     responseDelay                                                    ]
-            // 4.3.1.3.4 (Page 95)
-            [implicit uint 16     dcpDataLength                'lengthInBytes - 12'                ]
-            [array    PnDcp_Block blocks                        length              'dcpDataLength']
-        ]
-        ////////////////////////////////////////////////////////////////////////////
-        // Multicast (Well theoretically)
-        ////////////////////////////////////////////////////////////////////////////
-        // The Identify request is valid in two options:
-        // 1) One containing only an AllSelectorBlock
-        // 2) One containing optionally either NameOfStationBlock or AliasNameBlock and another optional IdentifyReqBlock
-        // (I assume, that if in case 2 both optionally aren't used, this might not be valid and option 1 should be sent instead)
-        ['DCP_Identify_ResPDU' PnDcp_Pdu_IdentifyRes
-            [const    uint 8      serviceId                    0x05                                ]
-            // ServiceType Start
-            [reserved uint 5      '0x00'                                                           ]
-            [simple   bit         notSupported                                                     ]
-            [reserved uint 1      '0x00'                                                           ]
-            [const    bit         response                     true                                ]
-            // ServiceType End
-            // 4.3.1.3.3 (Page 95)
-            [simple   uint 32     xid                                                              ]
-            // 4.3.1.3.5 (Page 95ff)
-            [reserved uint 16     '0x0000'                                                         ]
-            // 4.3.1.3.4 (Page 95)
-            [implicit uint 16     dcpDataLength                'lengthInBytes - 12'                ]
-            [array    PnDcp_Block blocks                        length              'dcpDataLength']
-        ]
-    ]
-]
-
-[discriminatedType PnDcp_Pdu_IdentifyRes_Payload
-    [discriminator PnDcp_ServiceId   serviceId                         ]
-    [simple        PnDcp_ServiceType serviceType                       ]
-    // 4.3.1.3.3 (Page 95)
-    [simple        uint 32           xid                               ]
-    // 4.3.1.3.5 (Page 95ff)
-    [simple        uint 16           responseDelayFactorOrPadding      ]
-    // 4.3.1.3.4 (Page 95)
-    [implicit      uint 16           dcpDataLength 'lengthInBytes - 12']
-    [typeSwitch serviceId,serviceType.response
-
-        // Packet a Profinet station might emit once it is turned on
-//        ['DCP_Hello_ReqPDU','HELLO','false' PnDcp_Pdu_HelloReq
-//            [simple NameOfStationBlockRes    nameOfStationBlockRes   ]
-//            [simple IPParameterBlockRes      iPParameterBlockRes     ]
-//            [simple DeviceIdBlockRes         deviceIdBlockRes        ]
-//            [simple DeviceVendorBlockRes     deviceVendorBlockRes    ]
-//            [simple DeviceOptionsBlockRes    deviceOptionsBlockRes   ]
-//            [simple DeviceRoleBlockRes       deviceRoleBlockRes      ]
-//            [simple DeviceInitiativeBlockRes deviceInitiativeBlockRes]
-//        ]
-
-        ////////////////////////////////////////////////////////////////////////////
-        // Unicast
-        ////////////////////////////////////////////////////////////////////////////
-
-//        ['DCP_GetSet_PDU','GET','false' PnDcp_Pdu_GetReq
-//            [simple GetReqBlock              getReqBlock             ]
-//        ]
-//        ['DCP_GetSet_PDU','GET','true' PnDcp_Pdu_GetRes
-//            [simple GetResBlock              getResBlock             ]
-//            [simple GetNegResBlock           getNegResBlock          ]
-//        ]
-
-//        ['DCP_GetSet_PDU','SET','false' PnDcp_Pdu_SetReq
-//            [simple StartTransactionBlock    startTransactionBlock   ]
-//            [simple BlockQualifier           blockQualifier          ]
-//            [simple SetResetReqBlock         setResetReqBlock        ]
-//            [simple SetReqBlock              setReqBlock             ]
-//            [simple StopTransactionBlock     stopTransactionBlock    ]
-//            [simple BlockQualifier           blockQualifier          ]
-//        ]
-//        ['DCP_GetSet_PDU','SET','true' PnDcp_Pdu_SetRes
-//            [simple SetResBlock              setResBlock             ]
-//            [simple SetNegResBlock           setNegResBlock          ]
-//        ]
-    ]
-]
-
-[type PnIo_CyclicServiceDataUnit(int 16 dataUnitLength)
-    [array    byte   data       count 'dataUnitLength'                 ]
-]
-
-[discriminatedType PnDcp_Block
-    [discriminator PnDcp_BlockOptions option                   ]
-    [discriminator uint 8       suboption                      ]
-    [implicit      uint 16      blockLength 'lengthInBytes - 4']
-    [typeSwitch option,suboption
-
-        ////////////////////////////////////////////////////////////////////////////
-        // IP_OPTION
-        ////////////////////////////////////////////////////////////////////////////
-
-        // 4.3.1.4.1 (Page 97)
-        ['IP_OPTION','1' PnDcp_Block_IpMacAddress
-            [reserved uint 16  '0x0000'                                               ]
-            [simple MacAddress macAddress                                             ]
-        ]
-        ['IP_OPTION','2' PnDcp_Block_IpParameter
-            // 4.3.1.4.12 (Page 105ff)
-            [reserved uint 8 '0x00'                                                   ]
-            [simple   bit    ipConflictDetected                                       ]
-            [reserved uint 5 '0x00'                                                   ]
-            [simple   bit    setViaDhcp                                               ]
-            [simple   bit    setManually                                              ]
-            [array    byte   ipAddress       count '4'                                ]
-            [array    byte   subnetMask      count '4'                                ]
-            [array    byte   standardGateway count '4'                                ]
-        ]
-        ['IP_OPTION','3' PnDcp_Block_FullIpSuite
-            // TODO: Implement this ...
-        ]
-
-        ////////////////////////////////////////////////////////////////////////////
-        // DEVICE_PROPERTIES_OPTION
-        ////////////////////////////////////////////////////////////////////////////
-
-        ['DEVICE_PROPERTIES_OPTION','1' PnDcp_Block_DevicePropertiesDeviceVendor(uint 16 blockLength)
-            [reserved uint 16     '0x0000'                                            ]
-            [array    byte        deviceVendorValue count 'blockLength-2'             ]
-            [padding  uint 8      pad '0x00' 'STATIC_CALL("arrayLength", deviceVendorValue) % 2']
-        ]
-        ['DEVICE_PROPERTIES_OPTION','2' PnDcp_Block_DevicePropertiesNameOfStation(uint 16 blockLength)
-            [reserved uint 16     '0x0000'                                            ]
-            [array    byte        nameOfStation count 'blockLength-2'                 ]
-            [padding  uint 8      pad '0x00' 'STATIC_CALL("arrayLength", nameOfStation) % 2']
-        ]
-        ['DEVICE_PROPERTIES_OPTION','3' PnDcp_Block_DevicePropertiesDeviceId
-            [reserved uint 16 '0x0000'                                                ]
-            [simple   uint 16 vendorId                                                ]
-            [simple   uint 16 deviceId                                                ]
-        ]
-        ['DEVICE_PROPERTIES_OPTION','4' PnDcp_Block_DevicePropertiesDeviceRole
-            [reserved uint 20 '0x000000'                                              ]
-            [simple   bit     pnioSupervisor                                          ]
-            [simple   bit     pnioMultidevive                                         ]
-            [simple   bit     pnioController                                          ]
-            [simple   bit     pnioDevice                                              ]
-            [reserved uint 8  '0x00'                                                  ]
-        ]
-        // Contains a list of option combinations the device supports.
-        ['DEVICE_PROPERTIES_OPTION','5' PnDcp_Block_DevicePropertiesDeviceOptions(uint 16 blockLength)
-            [reserved uint 16               '0x0000'                                  ]
-            [array    PnDcp_SupportedDeviceOption supportedOptions length 'blockLength - 2' ]
-        ]
-        ['DEVICE_PROPERTIES_OPTION','6' PnDcp_Block_DevicePropertiesAliasName(uint 16 blockLength)
-            [reserved uint 16     '0x0000'                                            ]
-            [array    byte        aliasNameValue count 'blockLength-2'                ]
-            [padding  uint 8      pad '0x00' 'STATIC_CALL("arrayLength", aliasNameValue) % 2']
-        ]
-        ['DEVICE_PROPERTIES_OPTION','7' PnDcp_Block_DevicePropertiesDeviceInstance
-            [reserved uint 16 '0x0000'                                                ]
-            [simple   uint 8  deviceInstanceHigh                                      ]
-            [simple   uint 8  deviceInstanceLow                                       ]
-        ]
-        ['DEVICE_PROPERTIES_OPTION','8' PnDcp_Block_DevicePropertiesOemDeviceId
-            // TODO: Implement this ...
-        ]
-        ['DEVICE_PROPERTIES_OPTION','9' PnDcp_Block_DevicePropertiesStandardGateway
-            // TODO: Implement this ...
-        ]
-
-        ////////////////////////////////////////////////////////////////////////////
-        // DHCP_OPTION
-        ////////////////////////////////////////////////////////////////////////////
-        // 4.3.1.4.1 (Page 98 & 100)
-
-        // TODO: Check if these are really all DCP_OPTION
-        ['DCP_OPTION','12' PnDcp_Block_DhcpOptionHostName
-            // TODO: Implement this ...
-        ]
-        ['DCP_OPTION','43' PnDcp_Block_DhcpOptionVendorSpecificInformation
-            // TODO: Implement this ...
-        ]
-        ['DCP_OPTION','54' PnDcp_Block_DhcpOptionServerIdentifier
-            // TODO: Implement this ...
-        ]
-        ['DCP_OPTION','55' PnDcp_Block_DhcpOptionParameterRequestList
-            // TODO: Implement this ...
-        ]
-        ['DCP_OPTION','60' PnDcp_Block_DhcpOptionClassIdentifier
-            // TODO: Implement this ...
-        ]
-        ['DCP_OPTION','61' PnDcp_Block_DhcpOptionDhcpClientIdentifier
-            // TODO: Implement this ...
-        ]
-        ['DCP_OPTION','81' PnDcp_Block_DhcpOptionFullyQualifiedDomainName
-            // TODO: Implement this ...
-        ]
-        ['DCP_OPTION','97' PnDcp_Block_DhcpOptionUuidBasedClient
-            // TODO: Implement this ...
-        ]
-
-        ////////////////////////////////////////////////////////////////////////////
-        // CONTROL_OPTION
-        ////////////////////////////////////////////////////////////////////////////
-        // 4.3.1.4.1 (Page 98)
-
-        ['CONTROL_OPTION','1' PnDcp_Block_ControlOptionStart
-            // TODO: Implement this ...
-        ]
-        ['CONTROL_OPTION','2' PnDcp_Block_ControlOptionStop
-            // TODO: Implement this ...
-        ]
-        ['CONTROL_OPTION','3' PnDcp_Block_ControlOptionSignal
-            // TODO: Implement this ...
-        ]
-        ['CONTROL_OPTION','4' PnDcp_Block_ControlOptionResponse
-            // TODO: Implement this ...
-        ]
-        ['CONTROL_OPTION','5' PnDcp_Block_ControlOptionFactoryReset
-            // TODO: Implement this ...
-        ]
-        ['CONTROL_OPTION','6' PnDcp_Block_ControlOptionResetToFactory
-            // TODO: Implement this ...
-        ]
-
-        ////////////////////////////////////////////////////////////////////////////
-        // DEVICE_INITIATIVE_OPTION
-        ////////////////////////////////////////////////////////////////////////////
-        // 4.3.1.4.1 (Page 98)
-
-        ['DEVICE_INITIATIVE_OPTION','1' PnDcp_Block_DeviceInitiativeOption
-            // TODO: Implement this ...
-        ]
-
-        ////////////////////////////////////////////////////////////////////////////
-        // ALL_SELECTOR_OPTION
-        ////////////////////////////////////////////////////////////////////////////
-        // 4.3.1.4.1 (Page 99)
-
-        ['ALL_SELECTOR_OPTION','0xFF' PnDcp_Block_ALLSelector
-            // This type of block is empty
-        ]
-
-        ////////////////////////////////////////////////////////////////////////////
-        // Device manufacturer specific options 0x00-0xFF
-        ////////////////////////////////////////////////////////////////////////////
-   ]
-]
-
-[type PnDcp_SupportedDeviceOption
-    [simple   PnDcp_BlockOptions option]
-    [simple   uint 8       suboption   ]
-]
-
-// 4.3.1.3.2 (Page 94ff)
-// 4.3.1.3.2 (Page 94ff)
-// The spec lists meanings for request and response separately, but
-// they are actually mergeable, which we did in this construct.
-[type PnDcp_ServiceType
-    [reserved uint 5 '0x00'      ]
-    [simple   bit    notSupported]
-    [reserved uint 1 '0x00'      ]
-    [simple   bit    response    ]
-]
-
-// Page 86ff: Coding of the field FrameID
-[enum uint 16 PnDcp_FrameId
-    ['0x0000' RESERVED                       ]
-    // Range 1
-    ['0x0020' PTCP_RTSyncPDUWithFollowUp     ]
-    // Range 2
-    ['0x0080' PTCP_RTSyncPDU                 ]
-    // Range 3
-    // 0x0100-0x0FFF RT_CLASS_3
-    ['0x0100' RT_CLASS_3                     ]
-    // Range 4
-    // (Not used)
-    // Range 5
-    // (Not used)
-    // Range 6
-    // 0x8000-BFFF RT_CLASS_1
-    ['0x8000' RT_CLASS_1                     ]
-    // Range 7
-    // 0XC000-FBFF RT_CLASS_UDP
-    ['0xC000' RT_CLASS_UDP                   ]
-    // Range 8
-    ['0xFC01' Alarm_High                     ]
-    ['0xFE01' Alarm_Low                      ]
-    ['0xFEFC' DCP_Hello_ReqPDU               ]
-    ['0xFEFD' DCP_GetSet_PDU                 ]
-    ['0xFEFE' DCP_Identify_ReqPDU            ]
-    ['0xFEFF' DCP_Identify_ResPDU            ]
-    // Range 9
-    ['0xFF00' PTCP_AnnouncePDU               ]
-    ['0xFF20' PTCP_FollowUpPDU               ]
-    ['0xFF40' PTCP_DelayReqPDU               ]
-    ['0xFF41' PTCP_DelayResPDUWithFollowUp   ]
-    ['0xFF42' PTCP_DelayFuResPDUWithFollowUp ]
-    ['0xFF43' PTCP_DelayResPDUWithoutFollowUp]
-    // Range 12
-    // 0xFF80 - 0xFF8F FragmentationFrameId
-    ['0xFF80' FragmentationFrameId           ]
-]
-
-// Page 94
-// All other values are "Reserved"
-[enum uint 8 PnDcp_ServiceId
-    ['0x03' GET     ]
-    ['0x04' SET     ]
-    ['0x05' IDENTIFY]
-    ['0x06' HELLO   ]
-    //[RESERVED]
-]
-
-// 4.3.1.4.1 (Page 97)
-// All other values are "Reserved"
-[enum uint 8 PnDcp_BlockOptions
-    ['0x01' IP_OPTION               ]
-    ['0x02' DEVICE_PROPERTIES_OPTION]
-    ['0x03' DCP_OPTION              ]
-    ['0x05' CONTROL_OPTION          ]
-    ['0x06' DEVICE_INITIATIVE_OPTION]
-    ['0xFF' ALL_SELECTOR_OPTION     ]
-]
-
-/////////////////////////////////////////////////////////////////////////////////////////
-//
-//   PROFINET IO
-//
-// CM: Context Manager
-//
-/////////////////////////////////////////////////////////////////////////////////////////
-
-// TODO: Check if it's really Little Endian
-// 5.1.2
-// 5.5.2.2
-[discriminatedType PnIoCm_Packet(DceRpc_PacketType packetType)
-    [typeSwitch packetType
-        ['REQUEST' PnIoCm_Packet_Req
-            [simple uint 32      argsMaximum                          ]
-            [implicit uint 32    argsLength       'lengthInBytes - 20']
-            [simple uint 32      arrayMaximumCount                    ]
-            [simple uint 32      arrayOffset                          ]
-            [implicit uint 32    arrayActualCount  'lengthInBytes - 20']
-            [array  PnIoCm_Block blocks            length 'argsLength']
-        ]
-        ['RESPONSE' PnIoCm_Packet_Res
-            [simple uint 8       errorCode2                           ]
-            [simple uint 8       errorCode1                           ]
-            [simple uint 8       errorDecode                          ]
-            [simple uint 8       errorCode                            ]
-            [implicit uint 32    argsLength       'lengthInBytes - 1 - 1 - 1 - 1 - 4 - 4 - 4 - 4']
-            [simple uint 32      arrayMaximumCount                    ]
-            [simple uint 32      arrayOffset                          ]
-            [implicit uint 32    arrayActualCount  'lengthInBytes - 1 - 1 - 1 - 1 - 4 - 4 - 4 - 4'    ]
-            [array  PnIoCm_Block blocks            length 'argsLength']
-        ]
-        ['REJECT'   PnIoCm_Packet_Rej
-            [simple uint 32      status                               ]
-        ]
-    ]
-]
-
-[type UserData(uint 32 recordDataLength)
-    [array              byte      data count         'recordDataLength'       ]
-]
-
-// Big Endian
-[discriminatedType PnIoCm_Block byteOrder='BIG_ENDIAN'
-    [discriminator PnIoCm_BlockType blockType                           ]
-    [typeSwitch blockType
-        ['IOD_WRITE_REQUEST_HEADER' IODWriteRequestHeader
-            [implicit      uint 16          blockLength      'index < 0x8000 ? lengthInBytes - 4 - recordDataLength : lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple   uint 16                         sequenceNumber                                         ]
-            [simple   Uuid                            arUuid                                                 ]
-            [simple   uint 32                         api                                                    ]
-            [simple   uint 16                         slotNumber                                             ]
-            [simple   uint 16                         subSlotNumber                                          ]
-            [const    uint 16                         padField                  0x0000                       ]
-            [simple   uint 16                         index                                                  ]
-            [simple   uint 32                         recordDataLength                                       ]
-            [padding  uint 8      pad '0x00'          'index < 0x8000 ? 64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4 : 64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4']
-            [optional UserData('recordDataLength')     userData          'index < 0x8000'                    ]
-        ]
-        ['IOD_WRITE_RESPONSE_HEADER' IODWriteResponseHeader
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple   uint 16                         sequenceNumber                                         ]
-            [simple   Uuid                            arUuid                                                 ]
-            [simple   uint 32                         api                                                    ]
-            [simple   uint 16                         slotNumber                                             ]
-            [simple   uint 16                         subSlotNumber                                          ]
-            [const    uint 16                         padField                  0x0000                       ]
-            [simple   uint 16                         index                                                  ]
-            [simple   uint 32                         recordDataLength                                       ]
-            [padding  uint 8      pad '0x00'          '64 - 6 - 2 - 16 - 4 - 2 - 2 - 2 - 2 - 4']
-        ]
-        ['PD_INTERFACE_ADJUST' PDInterfaceAdjust
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [const    uint 16                         padField                  0x0000                       ]
-            [const    uint 16                         multipleInterfaceModeReserved2                  0x0000 ]
-            [const    uint 15                         multipleInterfaceModeReserved1                  0x0000 ]
-            [simple   MultipleInterfaceModeNameOfDevice multipleInterfaceModeNameOfDevice                    ]
-        ]
-        ['PD_PORT_DATA_CHECK' PDPortDataCheck
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [const    uint 16                         padField                  0x0000                       ]
-            [simple   uint 16                         slotNumber                                             ]
-            [simple   uint 16                         subSlotNumber                                          ]
-            [simple   PnIoCm_Block                    checkPeers                                             ]
-        ]
-        ['CHECK_PEERS'  CheckPeers
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [const    uint 8                          noOfPeers                 0x01                         ]
-            [simple   PascalString                    peerPortId                                             ]
-            [simple   PascalString                    peerChassisId                                          ]
-        ]
-        ['AR_BLOCK_REQ' PnIoCm_Block_ArReq
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple   PnIoCm_ArType                   arType                                                 ]
-            [simple   Uuid                            arUuid                                                 ]
-            [simple   uint 16                         sessionKey                                             ]
-            [simple   MacAddress                      cmInitiatorMacAddr                                     ]
-            [simple   DceRpc_ObjectUuid               cmInitiatorObjectUuid                                  ]
-            // Begin ARProperties
-            [simple   bit                             pullModuleAlarmAllowed                                 ]
-            [simple   bit                             nonLegacyStartupMode                                   ]
-            [simple   bit                             combinedObjectContainerUsed                            ]
-            [reserved uint 17                         '0x00000'                                              ]
-            [simple   bit                             acknowledgeCompanionAr                                 ]
-            [simple   PnIoCm_CompanionArType          companionArType                                        ]
-            [simple   bit                             deviceAccess                                           ]
-            [reserved uint 3                          '0x0'                                                  ]
-            [simple   bit                             cmInitiator                                            ]
-            [simple   bit                             supervisorTakeoverAllowed                              ]
-            [simple   PnIoCm_State                    state                                                  ]
-            // End ARProperties
-            [simple   uint 16                         cmInitiatorActivityTimeoutFactor                       ]
-            [simple   uint 16                         cmInitiatorUdpRtPort                                   ]
-            [implicit uint 16                         stationNameLength     'STR_LEN(cmInitiatorStationName)']
-            [simple   vstring 'stationNameLength * 8' cmInitiatorStationName                                 ]
-        ]
-        ['AR_BLOCK_RES' PnIoCm_Block_ArRes
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple   PnIoCm_ArType          arType                                                          ]
-            [simple   Uuid                   arUuid                                                          ]
-            [simple   uint 16                sessionKey                                                      ]
-            [simple   MacAddress             cmResponderMacAddr                                              ]
-            [simple   uint 16                responderUDPRTPort                                              ]
-        ]
-        ['IOD_CONTROL_REQ' PnIoCm_Control_Request
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   Uuid                            arUuid                                                 ]
-            [simple   uint 16                         sessionKey                                             ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   uint 16                         controlCommand                                         ]
-            [reserved uint 16                         '0x0000'                                               ]
-        ]
-        ['IOX_BLOCK_REQ'    PnIoCM_Block_Request
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   Uuid                            arUuid                                                 ]
-            [simple   uint 16                         sessionKey                                             ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   uint 16                         controlCommand                                         ]
-            [simple   uint 16                         controlBlockProperties                                 ]
-        ]
-        ['IOX_BLOCK_RES'    PnIoCM_Block_Response
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   Uuid                            arUuid                                                 ]
-            [simple   uint 16                         sessionKey                                             ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   uint 16                         controlCommand                                         ]
-            [simple   uint 16                         controlBlockProperties                                 ]
-        ]
-        ['IOD_CONTROL_RES' PnIoCm_Control_Response
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   Uuid                            arUuid                                                 ]
-            [simple   uint 16                         sessionKey                                             ]
-            [reserved uint 16                         '0x0000'                                               ]
-            [simple   uint 16                         controlCommand                                         ]
-            [reserved uint 16                         '0x0000'                                               ]
-        ]
-        ['IO_CR_BLOCK_REQ' PnIoCm_Block_IoCrReq
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple PnIoCm_IoCrType          ioCrType                                               ]
-            [simple uint 16                  ioCrReference                                          ]
-            [simple uint 16                  lt                                                     ]
-            // Begin IOCRProperties
-            [simple   bit                    fullSubFrameStructure                                  ]
-            [simple   bit                    distributedSubFrameWatchDog                            ]
-            [simple   bit                    fastForwardingMacAdr                                   ]
-            [reserved uint 17                '0x0000'                                               ]
-            [simple   bit                    mediaRedundancy                                        ]
-            [reserved uint 7                 '0x00'                                                 ]
-            [simple   PnIoCm_RtClass         rtClass                                                ]
-            // End IOCRProperties
-            [simple   uint 16                dataLength                                             ]
-            [simple   uint 16                frameId                                                ]
-            [simple   uint 16                sendClockFactor                                        ]
-            [simple   uint 16                reductionRatio                                         ]
-            [simple   uint 16                phase                                                  ]
-            [simple   uint 16                sequence                                               ]
-            [simple   uint 32                frameSendOffset                                        ]
-            [simple   uint 16                watchDogFactor                                         ]
-            [simple   uint 16                dataHoldFactor                                         ]
-            [simple   uint 16                ioCrTagHeader                                          ]
-            [simple   MacAddress             ioCrMulticastMacAdr                                    ]
-            [implicit uint 16                numberOfApis        'COUNT(apis)'                      ]
-            [array    PnIoCm_IoCrBlockReqApi apis                count         'numberOfApis'       ]
-        ]
-        ['IO_CR_BLOCK_RES' PnIoCm_Block_IoCrRes
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple PnIoCm_IoCrType          ioCrType                                               ]
-            [simple uint 16                  ioCrReference                                          ]
-            [simple   uint 16                frameId                                                ]
-        ]
-        ['ALARM_CR_BLOCK_REQ' PnIoCm_Block_AlarmCrReq
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple   PnIoCm_AlarmCrType     alarmType                                              ]
-            [simple   uint 16                lt                                                     ]
-            // Begin AlarmCrProperties
-            [reserved uint 30                '0x00000000'                                           ]
-            [simple   bit                    transport                                              ]
-            [simple   bit                    priority                                               ]
-            // End AlarmCrProperties
-            [simple   uint 16                rtaTimeoutFactor                                       ]
-            [simple   uint 16                rtaRetries                                             ]
-            [simple   uint 16                localAlarmReference                                    ]
-            [simple   uint 16                maxAlarmDataLength                                     ]
-            [simple   uint 16                alarmCtrTagHeaderHigh                                  ]
-            [simple   uint 16                alarmCtrTagHeaderLow                                   ]
-        ]
-        ['ALARM_CR_BLOCK_RES' PnIoCm_Block_AlarmCrRes
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple   PnIoCm_AlarmCrType     alarmType                                              ]
-            [simple   uint 16                localAlarmReference                                    ]
-            [simple   uint 16                maxAlarmDataLength                                     ]
-        ]
-        ['EXPECTED_SUBMODULE_BLOCK_REQ' PnIoCm_Block_ExpectedSubmoduleReq
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [implicit uint 16                numberOfApis         'COUNT(apis)'                     ]
-            [array    PnIoCm_ExpectedSubmoduleBlockReqApi apis   count         'numberOfApis'       ]
-        ]
-        ['MODULE_DIFF_BLOCK' PnIoCm_Block_ModuleDiff
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [implicit uint 16                numberOfApis         'COUNT(apis)'                     ]
-            [array    PnIoCm_ModuleDiffBlockApi apis              count         'numberOfApis'      ]
-        ]
-        ['AR_SERVER_BLOCK' PnIoCm_Block_ArServer
-            [implicit      uint 16          blockLength      'lengthInBytes - 4']
-            [simple        uint 8           blockVersionHigh                    ]
-            [simple        uint 8           blockVersionLow                     ]
-            [simple   PascalString                    stationName                                   ]
-            [padding  uint 8      pad '0x00'          '20 - 6 - (stationName.stringLength)'              ]
-        ]
-    ]
-]
-
-[type PascalString
-    [implicit int 8 sLength          'stringValue.length == 0 ? -1 : stringValue.length']
-    [simple vstring 'sLength == -1 ? 0 : sLength * 8' stringValue]
-    [virtual  int 8 stringLength     'stringValue.length == -1 ? 0 : stringValue.length']
-]
-
-[type PnIoCm_IoCrBlockReqApi
-    [const    uint 32             api              0x00000000             ]
-    [implicit uint 16             numIoDataObjects 'COUNT(ioDataObjects)'   ]
-    [array    PnIoCm_IoDataObject ioDataObjects    count 'numIoDataObjects' ]
-    [implicit uint 16             numIoCss         'COUNT(ioCss)'           ]
-    [array    PnIoCm_IoCs         ioCss            count 'numIoCss'         ]
-]
-
-[type PnIoCm_IoDataObject
-    [simple   uint 16 slotNumber             ]
-    [simple   uint 16 subSlotNumber          ]
-    [simple   uint 16 ioDataObjectFrameOffset]
-]
-
-[type PnIoCm_IoCs
-    [simple   uint 16 slotNumber   ]
-    [simple   uint 16 subSlotNumber]
-    [simple   uint 16 ioFrameOffset]
-]
-
-[type PnIoCm_DataUnitIoCs
-    [simple   bit               dataState]
-    [simple   uint 2            instance ]
-    [reserved uint 4            '0x00'   ]
-    [simple   bit               extension]
-]
-
-[type PnIoCm_DataUnitDataObject(uint 16 dataObjectLength)
-    [array    byte              dataState   count  'dataObjectLength']
-    [simple   PnIoCm_DataUnitIoCs iops   ]
-]
-
-[type PnIoCm_ExpectedSubmoduleBlockReqApi
-    [const    uint 32          api               0x00000000                       ]
-    [simple   uint 16          slotNumber                                           ]
-    [simple   uint 32          moduleIdentNumber                                    ]
-    [simple   uint 16          moduleProperties                                     ]
-    [implicit uint 16          numSubmodules     'COUNT(submodules)'                ]
-    [array    PnIoCm_Submodule submodules        count               'numSubmodules']
-]
-
-[type PnIoCm_ModuleDiffBlockApi byteOrder='BIG_ENDIAN'
-    [const    uint 32                          api        0x00000000                    ]
-    [implicit uint 16                          numModules 'COUNT(modules)'                ]
-    [array    PnIoCm_ModuleDiffBlockApi_Module modules    count               'numModules']
-]
-
-[type PnIoCm_ModuleDiffBlockApi_Module byteOrder='BIG_ENDIAN'
-    [simple   uint 16                             slotNumber                                           ]
-    [simple   uint 32                             moduleIdentNumber                                    ]
-    [simple   PnIoCm_ModuleState                  moduleState                                          ]
-    [implicit uint 16                             numSubmodules     'COUNT(submodules)'                ]
-    [array    PnIoCm_ModuleDiffBlockApi_Submodule submodules        count               'numSubmodules']
-]
-
-[type PnIoCm_ModuleDiffBlockApi_Submodule byteOrder='BIG_ENDIAN'
-    [simple uint 16          subslotNumber       ]
-    [simple uint 32          submoduleIdentNumber]
-    [simple bit              codingUsesIdentInfo ]
-    [simple PnIoCm_IdentInfo identInfo           ]
-    [simple PnIoCm_ArInfo    arInfo              ]
-    [simple bit              diagInfoAvailable   ]
-    [simple bit              maintenanceDemanded ]
-    [simple bit              maintenanceRequired ]
-    [simple bit              qualifiedInfo       ]
-    [simple PnIoCm_AddInfo   addInfo             ]
-]
-
-[discriminatedType PnIoCm_Submodule
-    [simple        uint 16                slotNumber                    ]
-    [simple        uint 32                submoduleIdentNumber          ]
-    // Begin SubmoduleProperties
-    [reserved      uint 10                '0x000'                       ]
-    [simple        bit                    discardIoxs                   ]
-    [simple        bit                    reduceOutputModuleDataLength  ]
-    [simple        bit                    reduceInputModuleDataLength   ]
-    [simple        bit                    sharedInput                   ]
-    [discriminator PnIoCm_SubmoduleType   submoduleType                 ]
-    // End SubmoduleProperties
-    [typeSwitch submoduleType
-        ['NO_INPUT_NO_OUTPUT_DATA' PnIoCm_Submodule_NoInputNoOutputData
-            [const    uint 16             dataDescription       0x0001]
-            [const    uint 16             submoduleDataLength   0x0000]
-            [const    uint 8              lengthIoCs            0x01  ]
-            [const    uint 8              lengthIoPs            0x01  ]
-        ]
-        ['INPUT_DATA' PnIoCm_Submodule_InputData
-            [const    uint 16             inputDataDescription  0x0001]
-            [simple   uint 16             inputSubmoduleDataLength      ]
-            [simple   uint 8              inputLengthIoCs               ]
-            [simple   uint 8              inputLengthIoPs               ]
-        ]
-        ['OUTPUT_DATA' PnIoCm_Submodule_OutputData
-            [const    uint 16             inputDataDescription  0x0002]
-            [simple   uint 16             inputSubmoduleDataLength      ]
-            [simple   uint 8              inputLengthIoCs               ]
-            [simple   uint 8              inputLengthIoPs               ]
-        ]
-        ['INPUT_AND_OUTPUT_DATA' PnIoCm_Submodule_InputAndOutputData
-            [const    uint 16             inputDataDescription  0x0001]
-            [simple   uint 16             inputSubmoduleDataLength      ]
-            [simple   uint 8              inputLengthIoCs               ]
-            [simple   uint 8              inputLengthIoPs               ]
-            [const    uint 16             outputDataDescription 0x0002]
-            [simple   uint 16             outputSubmoduleDataLength     ]
-            [simple   uint 8              outputLengthIoCs              ]
-            [simple   uint 8              outputLengthIoPs              ]
-        ]
-    ]
-]
-
-[type Uuid
-    [array byte data count '16']
-]
-
-[enum uint 16 PnIoCm_BlockType
-    ['0x0008' IOD_WRITE_REQUEST_HEADER    ]
-    ['0x0101' AR_BLOCK_REQ                ]
-    ['0x0102' IO_CR_BLOCK_REQ             ]
-    ['0x0103' ALARM_CR_BLOCK_REQ          ]
-    ['0x0104' EXPECTED_SUBMODULE_BLOCK_REQ]
-    ['0x0110' IOD_CONTROL_REQ             ]
-    ['0x0112' IOX_BLOCK_REQ               ]
-    ['0x0200' PD_PORT_DATA_CHECK          ]
-    ['0x020a' CHECK_PEERS                 ]
-    ['0x0250' PD_INTERFACE_ADJUST         ]
-    ['0x8008' IOD_WRITE_RESPONSE_HEADER    ]
-    ['0x8101' AR_BLOCK_RES                ]
-    ['0x8102' IO_CR_BLOCK_RES             ]
-    ['0x8103' ALARM_CR_BLOCK_RES          ]
-    ['0x8104' MODULE_DIFF_BLOCK           ]
-    ['0x8106' AR_SERVER_BLOCK             ]
-    ['0x8110' IOD_CONTROL_RES             ]
-    ['0x8112' IOX_BLOCK_RES               ]
-]
-
-[enum uint 8 ProfinetDeviceState
-    ['0x00'     IDLE]
-    ['0x01'     STARTUP]
-    ['0x02'     PREMED]
-    ['0x03'     WAITAPPLRDY]
-    ['0x04'     APPLRDY]
-    ['0x05'     CYCLICDATA]
-    ['0xFF'     ABORT]
-]
-
-[enum uint 16 PnIoCm_ArType
-    ['0x0001' IO_CONTROLLER]
-]
-
-[enum uint 2 PnIoCm_CompanionArType
-    ['0x0' SINGLE_AR]
-]
-
-[enum uint 3 PnIoCm_State
-    ['0x1' ACTIVE]
-]
-
-[enum uint 16 PnIoCm_IoCrType
-    ['0x0001' INPUT_CR]
-    ['0x0002' OUTPUT_CR]
-]
-
-[enum uint 4 PnIoCm_RtClass
-    ['0x2' RT_CLASS_2]
-]
-
-[enum uint 16 PnIoCm_AlarmCrType
-    ['0x0001' ALARM_CR]
-]
-
-[enum uint 16 PnIoCm_ModuleState
-    ['0x0002' PROPER_MODULE]
-]
-
-[enum uint 2 PnIoCm_SubmoduleType
-    ['0x0' NO_INPUT_NO_OUTPUT_DATA]
-    ['0x1' INPUT_DATA]
-    ['0x2' OUTPUT_DATA]
-    ['0x3' INPUT_AND_OUTPUT_DATA]
-]
-
-[enum bit MultipleInterfaceModeNameOfDevice
-    ['false' PORT_PROVIDED_BY_LLDP]
-    ['true'  NAME_PROVIDED_BY_LLDP]
-]
-
-[enum uint 16 PnIoCm_DescriptionType
-    ['0x0001' INPUT]
-]
-
-[enum uint 4 PnIoCm_IdentInfo
-    ['0x0' OK]
-]
-
-[enum uint 4 PnIoCm_ArInfo
-    ['0x0' OWN]
-]
-
-[enum uint 3 PnIoCm_AddInfo
-    ['0x0' NONE]
-]
-
-[enum uint 4 IntegerEncoding
-    ['0x0' BIG_ENDIAN]
-    ['0x1' LITTLE_ENDIAN]
-]
-
-[enum uint 4 CharacterEncoding
-    ['0x0' ASCII]
-    ['0x1' EBCDIC]
-]
-
-[enum uint 8 FloatingPointEncoding
-    ['0x00' IEEE]
-    ['0x01' VAX ]
-    ['0x02' CRAY]
-    ['0x03' IBM ]
-]
-
-
-[dataIo DataItem(ProfinetDataType dataType, uint 16 numberOfValues)
-    [typeSwitch dataType,numberOfValues
-        ['BOOL','1'  BOOL
-            [simple   bit     value                            ]
-        ]
-        ['BOOL'      List
-            [array    bit     value count 'numberOfValues'     ]
-        ]
-        ['BYTE','1'  BYTE
-            [simple uint 8 value]
-        ]
-        ['BYTE' List
-            [array    bit     value count 'numberOfValues * 8' ]
-        ]
-        ['WORD'      WORD
-            [simple   uint 16 value]
-        ]
-        ['DWORD'     DWORD
-            [simple   uint 32 value]
-        ]
-        ['LWORD'     LWORD
-            [simple   uint 64 value]
-        ]
-        ['SINT','1' SINT
-            [simple   int 8   value ]
-        ]
-        ['SINT' List
-            [array int 8 value count 'numberOfValues']
-        ]
-        ['INT','1' INT
-            [simple int 16 value]
-        ]
-        ['INT' List
-            [array int 16 value count 'numberOfValues']
-        ]
-        ['DINT','1' DINT
-            [simple int 32 value]
-        ]
-        ['DINT' List
-            [array int 32 value count 'numberOfValues']
-        ]
-        ['LINT','1' LINT
-            [simple int 64 value]
-        ]
-        ['LINT' List
-            [array int 64 value count 'numberOfValues']
-        ]
-        ['USINT','1' USINT
-            [simple   uint 8 value ]
-        ]
-        ['USINT' List
-            [array uint 8 value count 'numberOfValues']
-        ]
-        ['UINT','1' UINT
-            [simple uint 16 value]
-        ]
-        ['UINT' List
-            [array uint 16 value count 'numberOfValues']
-        ]
-        ['UDINT','1' UDINT
-            [simple uint 32 value]
-        ]
-        ['UDINT' List
-            [array uint 32 value count 'numberOfValues']
-        ]
-        ['ULINT','1' ULINT
-            [simple uint 64 value]
-        ]
-        ['ULINT' List
-            [array uint 64 value count 'numberOfValues']
-        ]
-        ['REAL','1' REAL
-            [simple float 32  value]
-        ]
-        ['REAL' List
-            [array float 32 value count 'numberOfValues']
-        ]
-        ['LREAL','1' LREAL
-            [simple float 64  value]
-        ]
-        ['LREAL' List
-            [array float 64 value count 'numberOfValues']
-        ]
-        ['CHAR','1' CHAR
-            [simple string 8 value encoding='"UTF-8"']
-        ]
-        ['CHAR' List
-            [array string 8 value count 'numberOfValues' encoding='"UTF-8"']
-        ]
-        ['WCHAR','1' WCHAR
-            [simple string 16 value encoding='"UTF-16"']
-        ]
-        ['WCHAR' List
-            [array string 16 value count 'numberOfValues' encoding='"UTF-16"']
-        ]
-    ]
-]
-
-[enum uint 8 ProfinetDataType(uint 8 dataTypeSize, string 16 conversion)
-    ['1' BOOL ['1','BOOLEAN']]
-    ['2' BYTE ['1','BYTE']]
-    ['3' WORD ['2','WORD']]
-    ['4' DWORD ['4','DWORD']]
-    ['5' LWORD ['8','LWORD']]
-    ['6' SINT ['1','SIGNED8']]
-    ['7' INT ['2','SIGNED16']]
-    ['8' DINT ['4','SIGNED32']]
-    ['9' LINT ['8','SIGNED64']]
-    ['10' USINT ['1','UNSIGNED8']]
-    ['11' UINT ['2','UNSIGNED16']]
-    ['12' UDINT ['4','UNSIGNED32']]
-    ['13' ULINT ['8','UNSIGNED64']]
-    ['14' REAL ['4','FLOAT32']]
-    ['15' LREAL ['8','FLOAT64']]
-    ['16' TIME ['8','TIME']]
-    ['17' LTIME ['8','LTIME']]
-    ['18' DATE ['8','DATE']]
-    ['19' LDATE ['8','LDATE']]
-    ['20' TIME_OF_DAY ['8','TIME_OF_DAY']]
-    ['21' LTIME_OF_DAY ['8','LTIME_OF_DAY']]
-    ['22' DATE_AND_TIME ['8','DATE_AND_TIME']]
-    ['23' LDATE_AND_TIME ['8','LDATE_AND_TIME']]
-    ['24' CHAR ['1','CHAR']]
-    ['25' WCHAR ['2','WCHAR']]
-    ['26' STRING ['1','STRING']]
-    ['27' WSTRING ['2','WSTRING']]
-]
\ No newline at end of file