You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2026/08/18 20:22:29 UTC

(plc4x) 11/17: test(plc4go/eip): connected-mode and message-router driver testsuites (ForwardOpen + all three read/write modes)

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

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

commit bec69853f8b0938db980c958d961e37661f242f1
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Aug 18 18:37:27 2026 +0200

    test(plc4go/eip): connected-mode and message-router driver testsuites (ForwardOpen + all three read/write modes)
    
    Adds DriverTestsuiteConnected.xml (ForwardOpen handshake, otConnectionId
    305419896, connected single read/write via SendUnitData) and
    DriverTestsuiteMessageRouter.xml (GetAttributeAll advertises only
    MessageRouter, no ConnectionManager: two-tag read goes out as a single
    CipRRData/CipUnconnectedRequest wrapping a MultipleServiceRequest, single
    write is a bare CipWriteRequest) - covering readWithConnectionManager/
    writeWithConnectionManager and readWithoutConnectionManager/
    writeWithoutConnectionManager, the two EIP messaging modes the existing
    DriverTestsuite.xml (unconnected, no message router) doesn't reach.
    
    Registers TestEIPDriverConnected and TestEIPDriverMessageRouter in
    eip_driver_test.go.
    
    Fixes a latent bug in spi/utils/ReadBufferXmlBased.go uncovered while
    authoring the ForwardOpen exchange: CipConnectionManagerRequest's
    connectionPaths is a terminated PathSegment array, and its termination
    check (NoMorePathSegments) speculatively parses one more item and calls
    GetPos()/Reset() to un-consume it if that succeeds. xml.Decoder.Token()
    is forward-only, so Reset() was a no-op against the real token stream -
    any XML-driven driver-testsuite exercising a non-empty terminated array
    (only ever an empty one previously, e.g. this driver's own probeAttributes
    response) would corrupt the parse. Fixed by buffering consumed tokens for
    replay, routing every token read (including DecodeElement's, which bypassed
    the buffer) through it, and resolving each Reset(pos) to the oldest
    still-pending GetPos() call reporting that value - needed because
    generated code's vestigial "currentPos := positionAware.GetPos()" (result
    always discarded) legitimately aliases to the same reported position at
    several nesting depths once a bit-level discriminator has been read.
    Verified against the full plc4go test suite, including bacnetip's
    extensive terminated-array driver-testsuites, with no regressions.
---
 .../protocols/eip/DriverTestsuiteConnected.xml     | 761 +++++++++++++++++++++
 .../protocols/eip/DriverTestsuiteMessageRouter.xml | 676 ++++++++++++++++++
 plc4go/spi/utils/ReadBufferXmlBased.go             | 188 ++++-
 plc4go/tests/drivers/tests/eip_driver_test.go      |  22 +
 .../protocols/eip/DriverTestsuiteConnected.xml     | 761 +++++++++++++++++++++
 .../protocols/eip/DriverTestsuiteMessageRouter.xml | 676 ++++++++++++++++++
 6 files changed, 3079 insertions(+), 5 deletions(-)

diff --git a/plc4go/assets/testing/protocols/eip/DriverTestsuiteConnected.xml b/plc4go/assets/testing/protocols/eip/DriverTestsuiteConnected.xml
new file mode 100644
index 0000000000..977102c7fd
--- /dev/null
+++ b/plc4go/assets/testing/protocols/eip/DriverTestsuiteConnected.xml
@@ -0,0 +1,761 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      https://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<test:driver-testsuite xmlns:test="https://plc4x.apache.org/schemas/driver-testsuite.xsd"
+                       byteOrder="LITTLE_ENDIAN">
+
+  <name>EIP</name>
+
+  <protocol-name>eip</protocol-name>
+  <output-flavor>read-write</output-flavor>
+
+  <driver-name>eip</driver-name>
+  <driver-parameters>
+    <parameter>
+      <name>big-endian</name>
+      <value>false</value>
+    </parameter>
+    <parameter>
+      <name>connection-serial-number</name>
+      <value>4660</value>
+    </parameter>
+  </driver-parameters>
+
+  <setup>
+    <!--
+      First the driver is expected to send a ListServicesRequest in order to find out if CIP
+      encapsulation is supported.
+    -->
+    <outgoing-plc-message name="Send list services request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">0</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesRequest>
+        </ListServicesRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <!-- The PLC will respond accordingly -->
+    <incoming-plc-message name="Receive list services response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">25</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">2417269484</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesResponse>
+          <typeIdCount dataType="uint" bitLength="16">1</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">256</id>
+              <ServicesResponse>
+                <serviceLen dataType="uint" bitLength="16">19</serviceLen>
+                <encapsulationProtocol dataType="uint" bitLength="16">1</encapsulationProtocol>
+                <reserved dataType="uint" bitLength="2">0</reserved>
+                <supportsCIPEncapsulation dataType="bit" bitLength="1">true</supportsCIPEncapsulation>
+                <reserved dataType="uint" bitLength="12">0</reserved>
+                <supportsUDP dataType="bit" bitLength="1">false</supportsUDP>
+                <data dataType="byte" bitLength="120">0x436f6d6d756e69636174696f6e7300</data>
+              </ServicesResponse>
+            </TypeId>
+          </typeIds>
+        </ListServicesResponse>
+      </EipPacket>
+    </incoming-plc-message>
+    <outgoing-plc-message name="Send connection request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionRequest>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive connection response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionResponse>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionResponse>
+      </EipPacket>
+    </incoming-plc-message>
+
+    <outgoing-plc-message name="Send get attribute all request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">22</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">6</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">false</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllRequest>
+                      <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                      <classSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">2</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </classSegment>
+                      <instanceSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </instanceSegment>
+                    </GetAttributeAllRequest>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive get attribute all response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">28</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">12</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">true</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllResponse>
+                      <reserved dataType="uint" bitLength="8">0</reserved>
+                      <status dataType="uint" bitLength="8">0</status>
+                      <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      <attributes>
+                        <CIPAttributes>
+                          <numberOfClasses dataType="uint" bitLength="16">2</numberOfClasses>
+                          <classId isList="true">
+                            <value dataType="uint" bitLength="16">2</value>
+                            <value dataType="uint" bitLength="16">6</value>
+                          </classId>
+                          <numberAvailable dataType="uint" bitLength="16">2</numberAvailable>
+                          <data dataType="byte" bitLength="0">0x</data>
+                        </CIPAttributes>
+                      </attributes>
+                    </GetAttributeAllResponse>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </incoming-plc-message>
+
+    <!-- Device advertises a ConnectionManager (class 6): the driver opens a connected channel with ForwardOpen -->
+    <outgoing-plc-message name="Send ForwardOpen request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">68</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">52</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">false</response>
+                    <service dataType="uint" bitLength="7">91</service>
+                    <CipConnectionManagerRequest>
+                      <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                      <classSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">6</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </classSegment>
+                      <instanceSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </instanceSegment>
+                      <priority dataType="uint" bitLength="4">0</priority>
+                      <tickTime dataType="uint" bitLength="4">10</tickTime>
+                      <timeoutTicks dataType="uint" bitLength="8">14</timeoutTicks>
+                      <otConnectionId dataType="uint" bitLength="32">536870914</otConnectionId>
+                      <toConnectionId dataType="uint" bitLength="32">33944</toConnectionId>
+                      <connectionSerialNumber dataType="uint" bitLength="16">4660</connectionSerialNumber>
+                      <originatorVendorId dataType="uint" bitLength="16">4919</originatorVendorId>
+                      <originatorSerialNumber dataType="uint" bitLength="32">42</originatorSerialNumber>
+                      <timeoutMultiplier dataType="uint" bitLength="8">3</timeoutMultiplier>
+                      <reserved dataType="uint" bitLength="24">0</reserved>
+                      <otRpi dataType="uint" bitLength="32">2101812</otRpi>
+                      <otConnectionParameters>
+                        <NetworkConnectionParameters>
+                          <connectionSize dataType="uint" bitLength="16">4002</connectionSize>
+                          <reserved dataType="uint" bitLength="8">0</reserved>
+                          <owner dataType="bit" bitLength="1">false</owner>
+                          <connectionType dataType="uint" bitLength="2">2</connectionType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                          <priority dataType="uint" bitLength="2">0</priority>
+                          <connectionSizeType dataType="bit" bitLength="1">true</connectionSizeType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                        </NetworkConnectionParameters>
+                      </otConnectionParameters>
+                      <toRpi dataType="uint" bitLength="32">2113537</toRpi>
+                      <toConnectionParameters>
+                        <NetworkConnectionParameters>
+                          <connectionSize dataType="uint" bitLength="16">4002</connectionSize>
+                          <reserved dataType="uint" bitLength="8">0</reserved>
+                          <owner dataType="bit" bitLength="1">false</owner>
+                          <connectionType dataType="uint" bitLength="2">2</connectionType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                          <priority dataType="uint" bitLength="2">0</priority>
+                          <connectionSizeType dataType="bit" bitLength="1">true</connectionSizeType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                        </NetworkConnectionParameters>
+                      </toConnectionParameters>
+                      <transportType>
+                        <TransportType>
+                          <direction dataType="bit" bitLength="1">true</direction>
+                          <trigger dataType="uint" bitLength="3">2</trigger>
+                          <classTransport dataType="uint" bitLength="4">3</classTransport>
+                        </TransportType>
+                      </transportType>
+                      <connectionPathSize dataType="uint" bitLength="8">3</connectionPathSize>
+                      <connectionPaths isList="true">
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">0</pathSegment>
+                          <PortSegment>
+                            <segmentType>
+                              <PortSegmentType>
+                                <extendedLinkAddress dataType="bit" bitLength="1">false</extendedLinkAddress>
+                                <PortSegmentNormal>
+                                  <port dataType="uint" bitLength="4">1</port>
+                                  <linkAddress dataType="uint" bitLength="8">0</linkAddress>
+                                </PortSegmentNormal>
+                              </PortSegmentType>
+                            </segmentType>
+                          </PortSegment>
+                        </PathSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">2</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </connectionPaths>
+                    </CipConnectionManagerRequest>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive ForwardOpen response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">46</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">30</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">true</response>
+                    <service dataType="uint" bitLength="7">91</service>
+                    <CipConnectionManagerResponse>
+                      <reserved dataType="uint" bitLength="24">0</reserved>
+                      <otConnectionId dataType="uint" bitLength="32">305419896</otConnectionId>
+                      <toConnectionId dataType="uint" bitLength="32">33944</toConnectionId>
+                      <connectionSerialNumber dataType="uint" bitLength="16">4660</connectionSerialNumber>
+                      <originatorVendorId dataType="uint" bitLength="16">4919</originatorVendorId>
+                      <originatorSerialNumber dataType="uint" bitLength="32">42</originatorSerialNumber>
+                      <otApi dataType="uint" bitLength="32">2101812</otApi>
+                      <toApi dataType="uint" bitLength="32">2113537</toApi>
+                      <replySize dataType="uint" bitLength="8">0</replySize>
+                      <reserved dataType="uint" bitLength="8">0</reserved>
+                    </CipConnectionManagerResponse>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </incoming-plc-message>
+  </setup>
+
+  <testcase>
+    <name>Connected single element read request</name>
+    <steps>
+      <api-request name="Receive Read Request from application">
+        <TestReadRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
+              <name>hurz</name>
+              <address>%rate</address>
+            </tag>
+          </tags>
+        </TestReadRequest>
+      </api-request>
+      <outgoing-plc-message name="Send CipReadRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">32</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">305419896</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">12</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">76</service>
+                      <CipReadRequest>
+                        <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                        <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                      </CipReadRequest>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get CipReadResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">32</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">33944</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">12</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">76</service>
+                      <CipReadResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                        <data>
+                          <CIPData>
+                            <dataType>
+                              <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196
+                              </CIPDataTypeCode>
+                            </dataType>
+                            <data dataType="byte" bitLength="32">0x00000216</data>
+                          </CIPData>
+                        </data>
+                      </CipReadResponse>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Read Response to application">
+        <PlcReadResponse>
+          <request>
+            <PlcReadRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="40" encoding="UTF-8">%rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz>
+                </tags>
+              </PlcTagRequest>
+            </PlcReadRequest>
+          </request>
+          <values isList="true">
+            <hurz>
+              <PlcResponseItem>
+                <code dataType="string" bitLength="16" encoding="UTF-8">OK</code>
+                <value>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </value>
+              </PlcResponseItem>
+            </hurz>
+          </values>
+        </PlcReadResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+  <testcase>
+    <name>Connected single element write request</name>
+    <steps>
+      <api-request name="Receive Write Request from application">
+        <TestWriteRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestValueTag">
+              <name>hurz</name>
+              <address>%rate:DINT</address>
+              <value>369229824</value>
+            </tag>
+          </tags>
+        </TestWriteRequest>
+      </api-request>
+      <outgoing-plc-message name="Send CipWriteRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">38</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">305419896</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">18</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">77</service>
+                      <CipWriteRequest>
+                        <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                        <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                        <dataType>
+                          <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196
+                          </CIPDataTypeCode>
+                        </dataType>
+                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        <data dataType="byte" bitLength="32">0x00000216</data>
+                      </CipWriteRequest>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get CipWriteResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">26</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">33944</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">6</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">77</service>
+                      <CipWriteResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      </CipWriteResponse>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Write Response to application">
+        <PlcWriteResponse>
+          <request>
+            <PlcWriteRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="32" encoding="UTF-8">rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz>
+                </tags>
+              </PlcTagRequest>
+              <values isList="true">
+                <hurz>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </hurz>
+              </values>
+            </PlcWriteRequest>
+          </request>
+          <responseCodes isList="true">
+            <hurz>
+              <ResponseCode dataType="uint" bitLength="8" stringRepresentation="OK">1</ResponseCode>
+            </hurz>
+          </responseCodes>
+        </PlcWriteResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+</test:driver-testsuite>
diff --git a/plc4go/assets/testing/protocols/eip/DriverTestsuiteMessageRouter.xml b/plc4go/assets/testing/protocols/eip/DriverTestsuiteMessageRouter.xml
new file mode 100644
index 0000000000..5bd2dd7c2c
--- /dev/null
+++ b/plc4go/assets/testing/protocols/eip/DriverTestsuiteMessageRouter.xml
@@ -0,0 +1,676 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      https://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<test:driver-testsuite xmlns:test="https://plc4x.apache.org/schemas/driver-testsuite.xsd"
+                       byteOrder="LITTLE_ENDIAN">
+
+  <name>EIP</name>
+
+  <protocol-name>eip</protocol-name>
+  <output-flavor>read-write</output-flavor>
+
+  <driver-name>eip</driver-name>
+  <driver-parameters>
+    <parameter>
+      <name>big-endian</name>
+      <value>false</value>
+    </parameter>
+  </driver-parameters>
+
+  <setup>
+    <!--
+      First the driver is expected to send a ListServicesRequest in order to find out if CIP
+      encapsulation is supported.
+    -->
+    <outgoing-plc-message name="Send list services request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">0</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesRequest>
+        </ListServicesRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <!-- The PLC will respond accordingly -->
+    <incoming-plc-message name="Receive list services response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">25</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">2417269484</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesResponse>
+          <typeIdCount dataType="uint" bitLength="16">1</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">256</id>
+              <ServicesResponse>
+                <serviceLen dataType="uint" bitLength="16">19</serviceLen>
+                <encapsulationProtocol dataType="uint" bitLength="16">1</encapsulationProtocol>
+                <reserved dataType="uint" bitLength="2">0</reserved>
+                <supportsCIPEncapsulation dataType="bit" bitLength="1">true</supportsCIPEncapsulation>
+                <reserved dataType="uint" bitLength="12">0</reserved>
+                <supportsUDP dataType="bit" bitLength="1">false</supportsUDP>
+                <data dataType="byte" bitLength="120">0x436f6d6d756e69636174696f6e7300</data>
+              </ServicesResponse>
+            </TypeId>
+          </typeIds>
+        </ListServicesResponse>
+      </EipPacket>
+    </incoming-plc-message>
+    <outgoing-plc-message name="Send connection request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionRequest>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive connection response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionResponse>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionResponse>
+      </EipPacket>
+    </incoming-plc-message>
+
+    <outgoing-plc-message name="Send get attribute all request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">22</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">6</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">false</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllRequest>
+                      <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                      <classSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">2</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </classSegment>
+                      <instanceSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </instanceSegment>
+                    </GetAttributeAllRequest>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </outgoing-plc-message>
+    <!-- Device advertises ONLY the MessageRouter class (2) - no ConnectionManager, so no ForwardOpen -->
+    <incoming-plc-message name="Receive get attribute all response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">26</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">10</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">true</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllResponse>
+                      <reserved dataType="uint" bitLength="8">0</reserved>
+                      <status dataType="uint" bitLength="8">0</status>
+                      <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      <attributes>
+                        <CIPAttributes>
+                          <numberOfClasses dataType="uint" bitLength="16">1</numberOfClasses>
+                          <classId isList="true">
+                            <value dataType="uint" bitLength="16">2</value>
+                          </classId>
+                          <numberAvailable dataType="uint" bitLength="16">1</numberAvailable>
+                          <data dataType="byte" bitLength="0">0x</data>
+                        </CIPAttributes>
+                      </attributes>
+                    </GetAttributeAllResponse>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </incoming-plc-message>
+  </setup>
+
+  <testcase>
+    <name>Two element read request via message router</name>
+    <steps>
+      <api-request name="Receive Read Request from application">
+        <TestReadRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
+              <name>hurz1</name>
+              <address>%rate</address>
+            </tag>
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
+              <name>hurz2</name>
+              <address>%count</address>
+            </tag>
+          </tags>
+        </TestReadRequest>
+      </api-request>
+      <outgoing-plc-message name="Send MultipleServiceRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">64</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">48</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">82</service>
+                      <CipUnconnectedRequest>
+                        <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                        <classSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                  <ClassID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <segmentClass dataType="uint" bitLength="8">6</segmentClass>
+                                  </ClassID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </classSegment>
+                        <instanceSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                  <InstanceID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <instance dataType="uint" bitLength="8">1</instance>
+                                  </InstanceID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </instanceSegment>
+                        <reserved dataType="uint" bitLength="16">40197</reserved>
+                        <messageSize dataType="uint" bitLength="16">34</messageSize>
+                        <unconnectedService>
+                          <CipService>
+                            <response dataType="bit" bitLength="1">false</response>
+                            <service dataType="uint" bitLength="7">10</service>
+                            <MultipleServiceRequest>
+                              <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                              <requestPath dataType="uint" bitLength="32">19137056</requestPath>
+                              <data>
+                                <Services>
+                                  <serviceNb dataType="uint" bitLength="16">2</serviceNb>
+                                  <offsets isList="true">
+                                    <value dataType="uint" bitLength="16">6</value>
+                                    <value dataType="uint" bitLength="16">16</value>
+                                  </offsets>
+                                  <services isList="true">
+                                    <CipService>
+                                      <response dataType="bit" bitLength="1">false</response>
+                                      <service dataType="uint" bitLength="7">76</service>
+                                      <CipReadRequest>
+                                        <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                                        <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                                      </CipReadRequest>
+                                    </CipService>
+                                    <CipService>
+                                      <response dataType="bit" bitLength="1">false</response>
+                                      <service dataType="uint" bitLength="7">76</service>
+                                      <CipReadRequest>
+                                        <requestPathSize dataType="uint" bitLength="8">4</requestPathSize>
+                                        <tag dataType="byte" bitLength="64">0x9105636f756e7400</tag>
+                                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                                      </CipReadRequest>
+                                    </CipService>
+                                  </services>
+                                </Services>
+                              </data>
+                            </MultipleServiceRequest>
+                          </CipService>
+                        </unconnectedService>
+                        <route dataType="uint" bitLength="16">1</route>
+                        <backPlane dataType="int" bitLength="8">1</backPlane>
+                        <slot dataType="int" bitLength="8">0</slot>
+                      </CipUnconnectedRequest>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get MultipleServiceResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">46</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">30</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">10</service>
+                      <MultipleServiceResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                        <serviceNb dataType="uint" bitLength="16">2</serviceNb>
+                        <offsets isList="true">
+                          <value dataType="uint" bitLength="16">6</value>
+                          <value dataType="uint" bitLength="16">16</value>
+                        </offsets>
+                        <servicesData dataType="byte" bitLength="160">0xcc000000c40000000216cc000000c4002a000000</servicesData>
+                      </MultipleServiceResponse>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Read Response to application">
+        <PlcReadResponse>
+          <request>
+            <PlcReadRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz1>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="40" encoding="UTF-8">%rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz1>
+                  <hurz2>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="48" encoding="UTF-8">%count</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz2>
+                </tags>
+              </PlcTagRequest>
+            </PlcReadRequest>
+          </request>
+          <values isList="true">
+            <hurz1>
+              <PlcResponseItem>
+                <code dataType="string" bitLength="16" encoding="UTF-8">OK</code>
+                <value>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </value>
+              </PlcResponseItem>
+            </hurz1>
+            <hurz2>
+              <PlcResponseItem>
+                <code dataType="string" bitLength="16" encoding="UTF-8">OK</code>
+                <value>
+                  <PlcDINT dataType="int" bitLength="32">42</PlcDINT>
+                </value>
+              </PlcResponseItem>
+            </hurz2>
+          </values>
+        </PlcReadResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+  <testcase>
+    <name>Single element write request via message router</name>
+    <steps>
+      <api-request name="Receive Write Request from application">
+        <TestWriteRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestValueTag">
+              <name>hurz</name>
+              <address>%rate:DINT</address>
+              <value>369229824</value>
+            </tag>
+          </tags>
+        </TestWriteRequest>
+      </api-request>
+      <outgoing-plc-message name="Send CipWriteRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">44</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">28</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">82</service>
+                      <CipUnconnectedRequest>
+                        <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                        <classSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                  <ClassID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <segmentClass dataType="uint" bitLength="8">6</segmentClass>
+                                  </ClassID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </classSegment>
+                        <instanceSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                  <InstanceID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <instance dataType="uint" bitLength="8">1</instance>
+                                  </InstanceID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </instanceSegment>
+                        <reserved dataType="uint" bitLength="16">40197</reserved>
+                        <messageSize dataType="uint" bitLength="16">14</messageSize>
+                        <unconnectedService>
+                          <CipService>
+                            <response dataType="bit" bitLength="1">false</response>
+                            <service dataType="uint" bitLength="7">77</service>
+                            <CipWriteRequest>
+                              <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                              <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                              <dataType>
+                                <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196
+                                </CIPDataTypeCode>
+                              </dataType>
+                              <elementNb dataType="uint" bitLength="16">1</elementNb>
+                              <data dataType="byte" bitLength="32">0x00000216</data>
+                            </CipWriteRequest>
+                          </CipService>
+                        </unconnectedService>
+                        <route dataType="uint" bitLength="16">1</route>
+                        <backPlane dataType="int" bitLength="8">1</backPlane>
+                        <slot dataType="int" bitLength="8">0</slot>
+                      </CipUnconnectedRequest>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get CipWriteResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">28</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">4</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">77</service>
+                      <CipWriteResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      </CipWriteResponse>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Write Response to application">
+        <PlcWriteResponse>
+          <request>
+            <PlcWriteRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="32" encoding="UTF-8">rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz>
+                </tags>
+              </PlcTagRequest>
+              <values isList="true">
+                <hurz>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </hurz>
+              </values>
+            </PlcWriteRequest>
+          </request>
+          <responseCodes isList="true">
+            <hurz>
+              <ResponseCode dataType="uint" bitLength="8" stringRepresentation="OK">1</ResponseCode>
+            </hurz>
+          </responseCodes>
+        </PlcWriteResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+</test:driver-testsuite>
diff --git a/plc4go/spi/utils/ReadBufferXmlBased.go b/plc4go/spi/utils/ReadBufferXmlBased.go
index e2c0a6c652..3fd2ca954d 100644
--- a/plc4go/spi/utils/ReadBufferXmlBased.go
+++ b/plc4go/spi/utils/ReadBufferXmlBased.go
@@ -26,6 +26,7 @@ import (
 	"fmt"
 	"io"
 	"math/big"
+	"strconv"
 	"strings"
 
 	"github.com/apache/plc4x/plc4go/spi/errors"
@@ -63,6 +64,30 @@ type xmlReadBuffer struct {
 	pos            uint
 	doValidateAttr bool
 	doValidateList bool
+
+	// tokenHistory/historyPos let GetPos()/Reset() genuinely rewind the token
+	// stream (xml.Decoder.Token() is forward-only, unlike a byte buffer's
+	// cursor). Speculative lookahead - e.g. terminated-array termination
+	// checks that parse-then-rewind - replays already-consumed tokens from
+	// tokenHistory instead of re-reading (and thereby corrupting) the
+	// underlying decoder.
+	//
+	// posMarks queues, per reported GetPos() value, the historyPos each call
+	// observed, in call order; Reset(pos) dequeues the oldest one. A plain
+	// "last GetPos() wins" map would misbehave here: every generated type's
+	// parse function also calls GetPos() once on entry purely for (unused)
+	// diagnostics, and because bit-level fields (e.g. a 3-bit discriminator)
+	// don't move x.pos across a full byte, several of those vestigial calls
+	// - nested arbitrarily deep - legitimately alias to the exact same
+	// reported value as the real caller's own GetPos(). Since the real
+	// caller's GetPos() always runs first (its Reset() is always the
+	// outermost pending one for that value) and none of the vestigial calls
+	// ever call Reset() at all, taking the oldest queued entry for a value
+	// is exactly the paired one, regardless of how many discarded lookups
+	// share it.
+	tokenHistory []xml.Token
+	historyPos   int
+	posMarks     map[uint32][]int
 }
 
 var _ ReadBuffer = (*xmlReadBuffer)(nil)
@@ -81,11 +106,39 @@ func (x *xmlReadBuffer) GetByteOrder() binary.ByteOrder {
 }
 
 func (x *xmlReadBuffer) GetPos() uint32 {
-	return uint32(x.pos / 8)
+	curPos := uint32(x.pos / 8)
+	if x.posMarks == nil {
+		x.posMarks = map[uint32][]int{}
+	}
+	x.posMarks[curPos] = append(x.posMarks[curPos], x.historyPos)
+	return curPos
 }
 
 func (x *xmlReadBuffer) Reset(pos uint32) {
-	x.pos = uint(pos * 8)
+	x.pos = uint(pos) * 8
+	if marks := x.posMarks[pos]; len(marks) > 0 {
+		x.historyPos = marks[0]
+		x.posMarks[pos] = marks[1:]
+	}
+}
+
+// nextToken returns the next XML token, transparently replaying tokens
+// already consumed from the underlying decoder (see tokenHistory) so a
+// Reset() to an earlier GetPos() snapshot can genuinely rewind - the
+// embedded xml.Decoder itself only ever reads forward.
+func (x *xmlReadBuffer) nextToken() (xml.Token, error) {
+	if x.historyPos < len(x.tokenHistory) {
+		token := x.tokenHistory[x.historyPos]
+		x.historyPos++
+		return token, nil
+	}
+	token, err := x.Decoder.Token()
+	if err != nil {
+		return nil, err
+	}
+	x.tokenHistory = append(x.tokenHistory, xml.CopyToken(token))
+	x.historyPos++
+	return token, nil
 }
 
 func (x *xmlReadBuffer) HasMore(bitLength uint8) bool {
@@ -303,7 +356,7 @@ func (x *xmlReadBuffer) move(bits uint8) {
 
 func (x *xmlReadBuffer) travelToNextStartElement() (xml.StartElement, error) {
 	for {
-		token, err := x.Token()
+		token, err := x.nextToken()
 		if err != nil {
 			return xml.StartElement{}, err
 		}
@@ -320,7 +373,7 @@ func (x *xmlReadBuffer) travelToNextEndElement() (xml.EndElement, error) {
 	var endElement xml.EndElement
 findTheEndToken:
 	for {
-		token, err := x.Token()
+		token, err := x.nextToken()
 		if err != nil {
 			return xml.EndElement{}, err
 		}
@@ -344,10 +397,135 @@ func (x *xmlReadBuffer) decode(logicalName string, dataType string, bitLength ui
 	if err != nil {
 		return err
 	}
-	err = x.DecodeElement(targetValue, &startElement)
+	// Deliberately not using x.DecodeElement here: DecodeElement consumes tokens
+	// straight from the embedded xml.Decoder, bypassing nextToken()'s replay
+	// buffer. That invisible consumption left GetPos()/Reset() (used by
+	// terminated-array termination checks, see NoMorePathSegments) unable to
+	// truly rewind, since the replayed history didn't include everything that
+	// had actually been consumed. Reading the element's text content by hand -
+	// through nextToken(), like everything else in this file - keeps the
+	// replay buffer complete so a Reset() to an earlier GetPos() is exact.
+	text, err := x.readElementText(startElement)
 	if err != nil {
 		return err
 	}
+	return assignDecodedText(text, targetValue)
+}
+
+// readElementText consumes tokens (via nextToken(), so they remain replayable)
+// up to and including the EndElement matching start, returning the
+// concatenated character data in between.
+func (x *xmlReadBuffer) readElementText(start xml.StartElement) (string, error) {
+	var sb strings.Builder
+	for {
+		token, err := x.nextToken()
+		if err != nil {
+			return "", err
+		}
+		switch t := token.(type) {
+		case xml.CharData:
+			sb.Write(t)
+		case xml.EndElement:
+			if t.Name != start.Name {
+				return "", errors.Errorf("unexpected end element %s. Expected end of %s", t.Name, start.Name)
+			}
+			return sb.String(), nil
+		case xml.StartElement:
+			return "", errors.Errorf("unexpected nested start element %s while reading text content of %s", t.Name, start.Name)
+		}
+	}
+}
+
+// assignDecodedText mirrors the primitive-type unmarshalling xml.DecodeElement
+// used to perform, for the handful of concrete pointer types this file ever
+// passes as a decode target. Numeric/bool/big.* targets are whitespace-trimmed
+// first, matching encoding/xml's own behavior (test fixtures sometimes wrap a
+// value's text content across a line break for readability); *string targets
+// are taken verbatim.
+func assignDecodedText(text string, targetValue any) error {
+	if _, isString := targetValue.(*string); !isString {
+		text = strings.TrimSpace(text)
+	}
+	switch v := targetValue.(type) {
+	case *bool:
+		parsed, err := strconv.ParseBool(text)
+		if err != nil {
+			return errors.Wrap(err, "error parsing bool")
+		}
+		*v = parsed
+	case *string:
+		*v = text
+	case *uint8:
+		parsed, err := strconv.ParseUint(text, 10, 8)
+		if err != nil {
+			return errors.Wrap(err, "error parsing uint8")
+		}
+		*v = uint8(parsed)
+	case *uint16:
+		parsed, err := strconv.ParseUint(text, 10, 16)
+		if err != nil {
+			return errors.Wrap(err, "error parsing uint16")
+		}
+		*v = uint16(parsed)
+	case *uint32:
+		parsed, err := strconv.ParseUint(text, 10, 32)
+		if err != nil {
+			return errors.Wrap(err, "error parsing uint32")
+		}
+		*v = uint32(parsed)
+	case *uint64:
+		parsed, err := strconv.ParseUint(text, 10, 64)
+		if err != nil {
+			return errors.Wrap(err, "error parsing uint64")
+		}
+		*v = parsed
+	case *int8:
+		parsed, err := strconv.ParseInt(text, 10, 8)
+		if err != nil {
+			return errors.Wrap(err, "error parsing int8")
+		}
+		*v = int8(parsed)
+	case *int16:
+		parsed, err := strconv.ParseInt(text, 10, 16)
+		if err != nil {
+			return errors.Wrap(err, "error parsing int16")
+		}
+		*v = int16(parsed)
+	case *int32:
+		parsed, err := strconv.ParseInt(text, 10, 32)
+		if err != nil {
+			return errors.Wrap(err, "error parsing int32")
+		}
+		*v = int32(parsed)
+	case *int64:
+		parsed, err := strconv.ParseInt(text, 10, 64)
+		if err != nil {
+			return errors.Wrap(err, "error parsing int64")
+		}
+		*v = parsed
+	case *float32:
+		parsed, err := strconv.ParseFloat(text, 32)
+		if err != nil {
+			return errors.Wrap(err, "error parsing float32")
+		}
+		*v = float32(parsed)
+	case *float64:
+		parsed, err := strconv.ParseFloat(text, 64)
+		if err != nil {
+			return errors.Wrap(err, "error parsing float64")
+		}
+		*v = parsed
+	case *big.Int:
+		if err := v.UnmarshalText([]byte(text)); err != nil {
+			return errors.Wrap(err, "error parsing big.Int")
+		}
+	case *big.Float:
+		if err := v.UnmarshalText([]byte(text)); err != nil {
+			return errors.Wrap(err, "error parsing big.Float")
+		}
+	default:
+		return errors.Errorf("unsupported xml decode target type %T", targetValue)
+	}
 	return nil
 }
 
diff --git a/plc4go/tests/drivers/tests/eip_driver_test.go b/plc4go/tests/drivers/tests/eip_driver_test.go
index 663912f854..7ab5c130a2 100644
--- a/plc4go/tests/drivers/tests/eip_driver_test.go
+++ b/plc4go/tests/drivers/tests/eip_driver_test.go
@@ -37,3 +37,25 @@ func TestEIPDriver(t *testing.T) {
 		optionsForTesting...,
 	)
 }
+
+func TestEIPDriverConnected(t *testing.T) {
+	optionsForTesting := testutils.EnrichOptionsWithOptionsForTesting(t)
+	testutils.RunDriverTestsuite(
+		t,
+		eip.NewDriver(optionsForTesting...),
+		"assets/testing/protocols/eip/DriverTestsuiteConnected.xml",
+		eipIO.EipXmlParserHelper{},
+		optionsForTesting...,
+	)
+}
+
+func TestEIPDriverMessageRouter(t *testing.T) {
+	optionsForTesting := testutils.EnrichOptionsWithOptionsForTesting(t)
+	testutils.RunDriverTestsuite(
+		t,
+		eip.NewDriver(optionsForTesting...),
+		"assets/testing/protocols/eip/DriverTestsuiteMessageRouter.xml",
+		eipIO.EipXmlParserHelper{},
+		optionsForTesting...,
+	)
+}
diff --git a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuiteConnected.xml b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuiteConnected.xml
new file mode 100644
index 0000000000..977102c7fd
--- /dev/null
+++ b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuiteConnected.xml
@@ -0,0 +1,761 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      https://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<test:driver-testsuite xmlns:test="https://plc4x.apache.org/schemas/driver-testsuite.xsd"
+                       byteOrder="LITTLE_ENDIAN">
+
+  <name>EIP</name>
+
+  <protocol-name>eip</protocol-name>
+  <output-flavor>read-write</output-flavor>
+
+  <driver-name>eip</driver-name>
+  <driver-parameters>
+    <parameter>
+      <name>big-endian</name>
+      <value>false</value>
+    </parameter>
+    <parameter>
+      <name>connection-serial-number</name>
+      <value>4660</value>
+    </parameter>
+  </driver-parameters>
+
+  <setup>
+    <!--
+      First the driver is expected to send a ListServicesRequest in order to find out if CIP
+      encapsulation is supported.
+    -->
+    <outgoing-plc-message name="Send list services request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">0</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesRequest>
+        </ListServicesRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <!-- The PLC will respond accordingly -->
+    <incoming-plc-message name="Receive list services response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">25</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">2417269484</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesResponse>
+          <typeIdCount dataType="uint" bitLength="16">1</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">256</id>
+              <ServicesResponse>
+                <serviceLen dataType="uint" bitLength="16">19</serviceLen>
+                <encapsulationProtocol dataType="uint" bitLength="16">1</encapsulationProtocol>
+                <reserved dataType="uint" bitLength="2">0</reserved>
+                <supportsCIPEncapsulation dataType="bit" bitLength="1">true</supportsCIPEncapsulation>
+                <reserved dataType="uint" bitLength="12">0</reserved>
+                <supportsUDP dataType="bit" bitLength="1">false</supportsUDP>
+                <data dataType="byte" bitLength="120">0x436f6d6d756e69636174696f6e7300</data>
+              </ServicesResponse>
+            </TypeId>
+          </typeIds>
+        </ListServicesResponse>
+      </EipPacket>
+    </incoming-plc-message>
+    <outgoing-plc-message name="Send connection request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionRequest>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive connection response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionResponse>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionResponse>
+      </EipPacket>
+    </incoming-plc-message>
+
+    <outgoing-plc-message name="Send get attribute all request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">22</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">6</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">false</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllRequest>
+                      <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                      <classSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">2</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </classSegment>
+                      <instanceSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </instanceSegment>
+                    </GetAttributeAllRequest>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive get attribute all response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">28</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">12</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">true</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllResponse>
+                      <reserved dataType="uint" bitLength="8">0</reserved>
+                      <status dataType="uint" bitLength="8">0</status>
+                      <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      <attributes>
+                        <CIPAttributes>
+                          <numberOfClasses dataType="uint" bitLength="16">2</numberOfClasses>
+                          <classId isList="true">
+                            <value dataType="uint" bitLength="16">2</value>
+                            <value dataType="uint" bitLength="16">6</value>
+                          </classId>
+                          <numberAvailable dataType="uint" bitLength="16">2</numberAvailable>
+                          <data dataType="byte" bitLength="0">0x</data>
+                        </CIPAttributes>
+                      </attributes>
+                    </GetAttributeAllResponse>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </incoming-plc-message>
+
+    <!-- Device advertises a ConnectionManager (class 6): the driver opens a connected channel with ForwardOpen -->
+    <outgoing-plc-message name="Send ForwardOpen request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">68</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">52</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">false</response>
+                    <service dataType="uint" bitLength="7">91</service>
+                    <CipConnectionManagerRequest>
+                      <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                      <classSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">6</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </classSegment>
+                      <instanceSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </instanceSegment>
+                      <priority dataType="uint" bitLength="4">0</priority>
+                      <tickTime dataType="uint" bitLength="4">10</tickTime>
+                      <timeoutTicks dataType="uint" bitLength="8">14</timeoutTicks>
+                      <otConnectionId dataType="uint" bitLength="32">536870914</otConnectionId>
+                      <toConnectionId dataType="uint" bitLength="32">33944</toConnectionId>
+                      <connectionSerialNumber dataType="uint" bitLength="16">4660</connectionSerialNumber>
+                      <originatorVendorId dataType="uint" bitLength="16">4919</originatorVendorId>
+                      <originatorSerialNumber dataType="uint" bitLength="32">42</originatorSerialNumber>
+                      <timeoutMultiplier dataType="uint" bitLength="8">3</timeoutMultiplier>
+                      <reserved dataType="uint" bitLength="24">0</reserved>
+                      <otRpi dataType="uint" bitLength="32">2101812</otRpi>
+                      <otConnectionParameters>
+                        <NetworkConnectionParameters>
+                          <connectionSize dataType="uint" bitLength="16">4002</connectionSize>
+                          <reserved dataType="uint" bitLength="8">0</reserved>
+                          <owner dataType="bit" bitLength="1">false</owner>
+                          <connectionType dataType="uint" bitLength="2">2</connectionType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                          <priority dataType="uint" bitLength="2">0</priority>
+                          <connectionSizeType dataType="bit" bitLength="1">true</connectionSizeType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                        </NetworkConnectionParameters>
+                      </otConnectionParameters>
+                      <toRpi dataType="uint" bitLength="32">2113537</toRpi>
+                      <toConnectionParameters>
+                        <NetworkConnectionParameters>
+                          <connectionSize dataType="uint" bitLength="16">4002</connectionSize>
+                          <reserved dataType="uint" bitLength="8">0</reserved>
+                          <owner dataType="bit" bitLength="1">false</owner>
+                          <connectionType dataType="uint" bitLength="2">2</connectionType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                          <priority dataType="uint" bitLength="2">0</priority>
+                          <connectionSizeType dataType="bit" bitLength="1">true</connectionSizeType>
+                          <reserved dataType="bit" bitLength="1">false</reserved>
+                        </NetworkConnectionParameters>
+                      </toConnectionParameters>
+                      <transportType>
+                        <TransportType>
+                          <direction dataType="bit" bitLength="1">true</direction>
+                          <trigger dataType="uint" bitLength="3">2</trigger>
+                          <classTransport dataType="uint" bitLength="4">3</classTransport>
+                        </TransportType>
+                      </transportType>
+                      <connectionPathSize dataType="uint" bitLength="8">3</connectionPathSize>
+                      <connectionPaths isList="true">
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">0</pathSegment>
+                          <PortSegment>
+                            <segmentType>
+                              <PortSegmentType>
+                                <extendedLinkAddress dataType="bit" bitLength="1">false</extendedLinkAddress>
+                                <PortSegmentNormal>
+                                  <port dataType="uint" bitLength="4">1</port>
+                                  <linkAddress dataType="uint" bitLength="8">0</linkAddress>
+                                </PortSegmentNormal>
+                              </PortSegmentType>
+                            </segmentType>
+                          </PortSegment>
+                        </PathSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">2</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </connectionPaths>
+                    </CipConnectionManagerRequest>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive ForwardOpen response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">46</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">30</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">true</response>
+                    <service dataType="uint" bitLength="7">91</service>
+                    <CipConnectionManagerResponse>
+                      <reserved dataType="uint" bitLength="24">0</reserved>
+                      <otConnectionId dataType="uint" bitLength="32">305419896</otConnectionId>
+                      <toConnectionId dataType="uint" bitLength="32">33944</toConnectionId>
+                      <connectionSerialNumber dataType="uint" bitLength="16">4660</connectionSerialNumber>
+                      <originatorVendorId dataType="uint" bitLength="16">4919</originatorVendorId>
+                      <originatorSerialNumber dataType="uint" bitLength="32">42</originatorSerialNumber>
+                      <otApi dataType="uint" bitLength="32">2101812</otApi>
+                      <toApi dataType="uint" bitLength="32">2113537</toApi>
+                      <replySize dataType="uint" bitLength="8">0</replySize>
+                      <reserved dataType="uint" bitLength="8">0</reserved>
+                    </CipConnectionManagerResponse>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </incoming-plc-message>
+  </setup>
+
+  <testcase>
+    <name>Connected single element read request</name>
+    <steps>
+      <api-request name="Receive Read Request from application">
+        <TestReadRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
+              <name>hurz</name>
+              <address>%rate</address>
+            </tag>
+          </tags>
+        </TestReadRequest>
+      </api-request>
+      <outgoing-plc-message name="Send CipReadRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">32</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">305419896</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">12</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">76</service>
+                      <CipReadRequest>
+                        <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                        <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                      </CipReadRequest>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get CipReadResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">32</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">33944</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">12</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">76</service>
+                      <CipReadResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                        <data>
+                          <CIPData>
+                            <dataType>
+                              <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196
+                              </CIPDataTypeCode>
+                            </dataType>
+                            <data dataType="byte" bitLength="32">0x00000216</data>
+                          </CIPData>
+                        </data>
+                      </CipReadResponse>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Read Response to application">
+        <PlcReadResponse>
+          <request>
+            <PlcReadRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="40" encoding="UTF-8">%rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz>
+                </tags>
+              </PlcTagRequest>
+            </PlcReadRequest>
+          </request>
+          <values isList="true">
+            <hurz>
+              <PlcResponseItem>
+                <code dataType="string" bitLength="16" encoding="UTF-8">OK</code>
+                <value>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </value>
+              </PlcResponseItem>
+            </hurz>
+          </values>
+        </PlcReadResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+  <testcase>
+    <name>Connected single element write request</name>
+    <steps>
+      <api-request name="Receive Write Request from application">
+        <TestWriteRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestValueTag">
+              <name>hurz</name>
+              <address>%rate:DINT</address>
+              <value>369229824</value>
+            </tag>
+          </tags>
+        </TestWriteRequest>
+      </api-request>
+      <outgoing-plc-message name="Send CipWriteRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">38</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">305419896</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">18</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">77</service>
+                      <CipWriteRequest>
+                        <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                        <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                        <dataType>
+                          <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196
+                          </CIPDataTypeCode>
+                        </dataType>
+                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        <data dataType="byte" bitLength="32">0x00000216</data>
+                      </CipWriteRequest>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get CipWriteResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">112</command>
+          <packetLength dataType="uint" bitLength="16">26</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <SendUnitData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">161</id>
+                <ConnectedAddressItem>
+                  <reserved dataType="uint" bitLength="16">4</reserved>
+                  <connectionId dataType="uint" bitLength="32">33944</connectionId>
+                </ConnectedAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">177</id>
+                <ConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">6</packetSize>
+                  <sequenceCount dataType="uint" bitLength="16">1</sequenceCount>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">77</service>
+                      <CipWriteResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      </CipWriteResponse>
+                    </CipService>
+                  </service>
+                </ConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </SendUnitData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Write Response to application">
+        <PlcWriteResponse>
+          <request>
+            <PlcWriteRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="32" encoding="UTF-8">rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz>
+                </tags>
+              </PlcTagRequest>
+              <values isList="true">
+                <hurz>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </hurz>
+              </values>
+            </PlcWriteRequest>
+          </request>
+          <responseCodes isList="true">
+            <hurz>
+              <ResponseCode dataType="uint" bitLength="8" stringRepresentation="OK">1</ResponseCode>
+            </hurz>
+          </responseCodes>
+        </PlcWriteResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+</test:driver-testsuite>
diff --git a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuiteMessageRouter.xml b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuiteMessageRouter.xml
new file mode 100644
index 0000000000..5bd2dd7c2c
--- /dev/null
+++ b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuiteMessageRouter.xml
@@ -0,0 +1,676 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      https://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<test:driver-testsuite xmlns:test="https://plc4x.apache.org/schemas/driver-testsuite.xsd"
+                       byteOrder="LITTLE_ENDIAN">
+
+  <name>EIP</name>
+
+  <protocol-name>eip</protocol-name>
+  <output-flavor>read-write</output-flavor>
+
+  <driver-name>eip</driver-name>
+  <driver-parameters>
+    <parameter>
+      <name>big-endian</name>
+      <value>false</value>
+    </parameter>
+  </driver-parameters>
+
+  <setup>
+    <!--
+      First the driver is expected to send a ListServicesRequest in order to find out if CIP
+      encapsulation is supported.
+    -->
+    <outgoing-plc-message name="Send list services request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">0</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesRequest>
+        </ListServicesRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <!-- The PLC will respond accordingly -->
+    <incoming-plc-message name="Receive list services response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">4</command>
+        <packetLength dataType="uint" bitLength="16">25</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">2417269484</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <ListServicesResponse>
+          <typeIdCount dataType="uint" bitLength="16">1</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">256</id>
+              <ServicesResponse>
+                <serviceLen dataType="uint" bitLength="16">19</serviceLen>
+                <encapsulationProtocol dataType="uint" bitLength="16">1</encapsulationProtocol>
+                <reserved dataType="uint" bitLength="2">0</reserved>
+                <supportsCIPEncapsulation dataType="bit" bitLength="1">true</supportsCIPEncapsulation>
+                <reserved dataType="uint" bitLength="12">0</reserved>
+                <supportsUDP dataType="bit" bitLength="1">false</supportsUDP>
+                <data dataType="byte" bitLength="120">0x436f6d6d756e69636174696f6e7300</data>
+              </ServicesResponse>
+            </TypeId>
+          </typeIds>
+        </ListServicesResponse>
+      </EipPacket>
+    </incoming-plc-message>
+    <outgoing-plc-message name="Send connection request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionRequest>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionRequest>
+      </EipPacket>
+    </outgoing-plc-message>
+    <incoming-plc-message name="Receive connection response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">101</command>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <EipConnectionResponse>
+          <protocolVersion dataType="uint" bitLength="16">1</protocolVersion>
+          <flags dataType="uint" bitLength="16">0</flags>
+        </EipConnectionResponse>
+      </EipPacket>
+    </incoming-plc-message>
+
+    <outgoing-plc-message name="Send get attribute all request">
+      <parser-arguments>
+        <response>false</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">22</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">6</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">false</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllRequest>
+                      <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                      <classSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                <ClassID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <segmentClass dataType="uint" bitLength="8">2</segmentClass>
+                                </ClassID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </classSegment>
+                      <instanceSegment>
+                        <PathSegment>
+                          <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                          <LogicalSegment>
+                            <segmentType>
+                              <LogicalSegmentType>
+                                <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                <InstanceID>
+                                  <format dataType="uint" bitLength="2">0</format>
+                                  <instance dataType="uint" bitLength="8">1</instance>
+                                </InstanceID>
+                              </LogicalSegmentType>
+                            </segmentType>
+                          </LogicalSegment>
+                        </PathSegment>
+                      </instanceSegment>
+                    </GetAttributeAllRequest>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </outgoing-plc-message>
+    <!-- Device advertises ONLY the MessageRouter class (2) - no ConnectionManager, so no ForwardOpen -->
+    <incoming-plc-message name="Receive get attribute all response">
+      <parser-arguments>
+        <response>true</response>
+      </parser-arguments>
+      <EipPacket>
+        <command dataType="uint" bitLength="16">111</command>
+        <packetLength dataType="uint" bitLength="16">26</packetLength>
+        <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+        <status dataType="uint" bitLength="32">0</status>
+        <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+        <options dataType="uint" bitLength="32">0</options>
+        <CipRRData>
+          <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+          <timeout dataType="uint" bitLength="16">0</timeout>
+          <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+          <typeIds isList="true">
+            <TypeId>
+              <id dataType="uint" bitLength="16">0</id>
+              <NullAddressItem>
+                <reserved dataType="uint" bitLength="16">0</reserved>
+              </NullAddressItem>
+            </TypeId>
+            <TypeId>
+              <id dataType="uint" bitLength="16">178</id>
+              <UnConnectedDataItem>
+                <packetSize dataType="uint" bitLength="16">10</packetSize>
+                <service>
+                  <CipService>
+                    <response dataType="bit" bitLength="1">true</response>
+                    <service dataType="uint" bitLength="7">1</service>
+                    <GetAttributeAllResponse>
+                      <reserved dataType="uint" bitLength="8">0</reserved>
+                      <status dataType="uint" bitLength="8">0</status>
+                      <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      <attributes>
+                        <CIPAttributes>
+                          <numberOfClasses dataType="uint" bitLength="16">1</numberOfClasses>
+                          <classId isList="true">
+                            <value dataType="uint" bitLength="16">2</value>
+                          </classId>
+                          <numberAvailable dataType="uint" bitLength="16">1</numberAvailable>
+                          <data dataType="byte" bitLength="0">0x</data>
+                        </CIPAttributes>
+                      </attributes>
+                    </GetAttributeAllResponse>
+                  </CipService>
+                </service>
+              </UnConnectedDataItem>
+            </TypeId>
+          </typeIds>
+        </CipRRData>
+      </EipPacket>
+    </incoming-plc-message>
+  </setup>
+
+  <testcase>
+    <name>Two element read request via message router</name>
+    <steps>
+      <api-request name="Receive Read Request from application">
+        <TestReadRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
+              <name>hurz1</name>
+              <address>%rate</address>
+            </tag>
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestTag">
+              <name>hurz2</name>
+              <address>%count</address>
+            </tag>
+          </tags>
+        </TestReadRequest>
+      </api-request>
+      <outgoing-plc-message name="Send MultipleServiceRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">64</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">48</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">82</service>
+                      <CipUnconnectedRequest>
+                        <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                        <classSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                  <ClassID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <segmentClass dataType="uint" bitLength="8">6</segmentClass>
+                                  </ClassID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </classSegment>
+                        <instanceSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                  <InstanceID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <instance dataType="uint" bitLength="8">1</instance>
+                                  </InstanceID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </instanceSegment>
+                        <reserved dataType="uint" bitLength="16">40197</reserved>
+                        <messageSize dataType="uint" bitLength="16">34</messageSize>
+                        <unconnectedService>
+                          <CipService>
+                            <response dataType="bit" bitLength="1">false</response>
+                            <service dataType="uint" bitLength="7">10</service>
+                            <MultipleServiceRequest>
+                              <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                              <requestPath dataType="uint" bitLength="32">19137056</requestPath>
+                              <data>
+                                <Services>
+                                  <serviceNb dataType="uint" bitLength="16">2</serviceNb>
+                                  <offsets isList="true">
+                                    <value dataType="uint" bitLength="16">6</value>
+                                    <value dataType="uint" bitLength="16">16</value>
+                                  </offsets>
+                                  <services isList="true">
+                                    <CipService>
+                                      <response dataType="bit" bitLength="1">false</response>
+                                      <service dataType="uint" bitLength="7">76</service>
+                                      <CipReadRequest>
+                                        <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                                        <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                                      </CipReadRequest>
+                                    </CipService>
+                                    <CipService>
+                                      <response dataType="bit" bitLength="1">false</response>
+                                      <service dataType="uint" bitLength="7">76</service>
+                                      <CipReadRequest>
+                                        <requestPathSize dataType="uint" bitLength="8">4</requestPathSize>
+                                        <tag dataType="byte" bitLength="64">0x9105636f756e7400</tag>
+                                        <elementNb dataType="uint" bitLength="16">1</elementNb>
+                                      </CipReadRequest>
+                                    </CipService>
+                                  </services>
+                                </Services>
+                              </data>
+                            </MultipleServiceRequest>
+                          </CipService>
+                        </unconnectedService>
+                        <route dataType="uint" bitLength="16">1</route>
+                        <backPlane dataType="int" bitLength="8">1</backPlane>
+                        <slot dataType="int" bitLength="8">0</slot>
+                      </CipUnconnectedRequest>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get MultipleServiceResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">46</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">30</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">10</service>
+                      <MultipleServiceResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                        <serviceNb dataType="uint" bitLength="16">2</serviceNb>
+                        <offsets isList="true">
+                          <value dataType="uint" bitLength="16">6</value>
+                          <value dataType="uint" bitLength="16">16</value>
+                        </offsets>
+                        <servicesData dataType="byte" bitLength="160">0xcc000000c40000000216cc000000c4002a000000</servicesData>
+                      </MultipleServiceResponse>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Read Response to application">
+        <PlcReadResponse>
+          <request>
+            <PlcReadRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz1>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="40" encoding="UTF-8">%rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz1>
+                  <hurz2>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="48" encoding="UTF-8">%count</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz2>
+                </tags>
+              </PlcTagRequest>
+            </PlcReadRequest>
+          </request>
+          <values isList="true">
+            <hurz1>
+              <PlcResponseItem>
+                <code dataType="string" bitLength="16" encoding="UTF-8">OK</code>
+                <value>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </value>
+              </PlcResponseItem>
+            </hurz1>
+            <hurz2>
+              <PlcResponseItem>
+                <code dataType="string" bitLength="16" encoding="UTF-8">OK</code>
+                <value>
+                  <PlcDINT dataType="int" bitLength="32">42</PlcDINT>
+                </value>
+              </PlcResponseItem>
+            </hurz2>
+          </values>
+        </PlcReadResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+  <testcase>
+    <name>Single element write request via message router</name>
+    <steps>
+      <api-request name="Receive Write Request from application">
+        <TestWriteRequest>
+          <tags isList="true">
+            <tag className="org.apache.plc4x.test.driver.internal.api.TestValueTag">
+              <name>hurz</name>
+              <address>%rate:DINT</address>
+              <value>369229824</value>
+            </tag>
+          </tags>
+        </TestWriteRequest>
+      </api-request>
+      <outgoing-plc-message name="Send CipWriteRequest to PLC">
+        <parser-arguments>
+          <response>false</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">44</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">28</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">false</response>
+                      <service dataType="uint" bitLength="7">82</service>
+                      <CipUnconnectedRequest>
+                        <requestPathSize dataType="uint" bitLength="8">2</requestPathSize>
+                        <classSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">0</logicalSegmentType>
+                                  <ClassID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <segmentClass dataType="uint" bitLength="8">6</segmentClass>
+                                  </ClassID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </classSegment>
+                        <instanceSegment>
+                          <PathSegment>
+                            <pathSegment dataType="uint" bitLength="3">1</pathSegment>
+                            <LogicalSegment>
+                              <segmentType>
+                                <LogicalSegmentType>
+                                  <logicalSegmentType dataType="uint" bitLength="3">1</logicalSegmentType>
+                                  <InstanceID>
+                                    <format dataType="uint" bitLength="2">0</format>
+                                    <instance dataType="uint" bitLength="8">1</instance>
+                                  </InstanceID>
+                                </LogicalSegmentType>
+                              </segmentType>
+                            </LogicalSegment>
+                          </PathSegment>
+                        </instanceSegment>
+                        <reserved dataType="uint" bitLength="16">40197</reserved>
+                        <messageSize dataType="uint" bitLength="16">14</messageSize>
+                        <unconnectedService>
+                          <CipService>
+                            <response dataType="bit" bitLength="1">false</response>
+                            <service dataType="uint" bitLength="7">77</service>
+                            <CipWriteRequest>
+                              <requestPathSize dataType="uint" bitLength="8">3</requestPathSize>
+                              <tag dataType="byte" bitLength="48">0x910472617465</tag>
+                              <dataType>
+                                <CIPDataTypeCode dataType="uint" bitLength="16" stringRepresentation="DINT">196
+                                </CIPDataTypeCode>
+                              </dataType>
+                              <elementNb dataType="uint" bitLength="16">1</elementNb>
+                              <data dataType="byte" bitLength="32">0x00000216</data>
+                            </CipWriteRequest>
+                          </CipService>
+                        </unconnectedService>
+                        <route dataType="uint" bitLength="16">1</route>
+                        <backPlane dataType="int" bitLength="8">1</backPlane>
+                        <slot dataType="int" bitLength="8">0</slot>
+                      </CipUnconnectedRequest>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </outgoing-plc-message>
+      <incoming-plc-message name="Get CipWriteResponse from PLC">
+        <parser-arguments>
+          <response>true</response>
+        </parser-arguments>
+        <EipPacket>
+          <command dataType="uint" bitLength="16">111</command>
+          <packetLength dataType="uint" bitLength="16">28</packetLength>
+          <sessionHandle dataType="uint" bitLength="32">1074224669</sessionHandle>
+          <status dataType="uint" bitLength="32">0</status>
+          <senderContext dataType="byte" bitLength="64">0x504c433458202020</senderContext>
+          <options dataType="uint" bitLength="32">0</options>
+          <CipRRData>
+            <interfaceHandle dataType="uint" bitLength="32">0</interfaceHandle>
+            <timeout dataType="uint" bitLength="16">0</timeout>
+            <typeIdCount dataType="uint" bitLength="16">2</typeIdCount>
+            <typeIds isList="true">
+              <TypeId>
+                <id dataType="uint" bitLength="16">0</id>
+                <NullAddressItem>
+                  <reserved dataType="uint" bitLength="16">0</reserved>
+                </NullAddressItem>
+              </TypeId>
+              <TypeId>
+                <id dataType="uint" bitLength="16">178</id>
+                <UnConnectedDataItem>
+                  <packetSize dataType="uint" bitLength="16">4</packetSize>
+                  <service>
+                    <CipService>
+                      <response dataType="bit" bitLength="1">true</response>
+                      <service dataType="uint" bitLength="7">77</service>
+                      <CipWriteResponse>
+                        <reserved dataType="uint" bitLength="8">0</reserved>
+                        <status dataType="uint" bitLength="8">0</status>
+                        <extStatus dataType="uint" bitLength="8">0</extStatus>
+                      </CipWriteResponse>
+                    </CipService>
+                  </service>
+                </UnConnectedDataItem>
+              </TypeId>
+            </typeIds>
+          </CipRRData>
+        </EipPacket>
+      </incoming-plc-message>
+      <api-response name="Report Write Response to application">
+        <PlcWriteResponse>
+          <request>
+            <PlcWriteRequest>
+              <PlcTagRequest>
+                <tags isList="true">
+                  <hurz>
+                    <PlcTagItem>
+                      <tag>
+                        <EipTag>
+                          <node dataType="string" bitLength="32" encoding="UTF-8">rate</node>
+                          <type dataType="string" bitLength="32" encoding="UTF-8">DINT</type>
+                          <elementNb dataType="uint" bitLength="16">1</elementNb>
+                        </EipTag>
+                      </tag>
+                    </PlcTagItem>
+                  </hurz>
+                </tags>
+              </PlcTagRequest>
+              <values isList="true">
+                <hurz>
+                  <PlcDINT dataType="int" bitLength="32">369229824</PlcDINT>
+                </hurz>
+              </values>
+            </PlcWriteRequest>
+          </request>
+          <responseCodes isList="true">
+            <hurz>
+              <ResponseCode dataType="uint" bitLength="8" stringRepresentation="OK">1</ResponseCode>
+            </hurz>
+          </responseCodes>
+        </PlcWriteResponse>
+      </api-response>
+    </steps>
+  </testcase>
+
+</test:driver-testsuite>