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

[plc4x] branch fix/cdutz/reenable-golang-driver-testsuites updated: refactor(plc4j): Continued porting the code to using contexts ... tried to fix the EIP Integration-Tests

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

cdutz pushed a commit to branch fix/cdutz/reenable-golang-driver-testsuites
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/fix/cdutz/reenable-golang-driver-testsuites by this push:
     new b58312912f refactor(plc4j): Continued porting the code to using contexts ... tried to fix the EIP Integration-Tests
b58312912f is described below

commit b58312912f659565356c8fdacb1f0b503fa745c6
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Feb 10 09:08:13 2023 +0100

    refactor(plc4j): Continued porting the code to using contexts ... tried to fix the EIP Integration-Tests
---
 .../testing/protocols/eip/DriverTestsuite.xml      |  10 +-
 plc4go/internal/modbus/Tag.go                      |   5 +-
 plc4go/internal/modbus/TagHandler.go               |   2 +-
 plc4go/internal/s7/Tag.go                          |  10 +-
 plc4go/pkg/api/model/plc_response_code.go          |  18 ++
 plc4go/spi/model/DefaultPlcBrowseEvent.go          |  80 +++++-
 plc4go/spi/model/DefaultPlcBrowseEvent_plc4xgen.go | 105 --------
 plc4go/spi/model/DefaultPlcBrowseItem.go           | 123 +++++++++-
 plc4go/spi/model/DefaultPlcBrowseItem_plc4xgen.go  | 148 -----------
 plc4go/spi/model/DefaultPlcBrowseRequest.go        |  89 ++++++-
 plc4go/spi/model/DefaultPlcBrowseRequestResult.go  |  80 +++++-
 .../DefaultPlcBrowseRequestResult_plc4xgen.go      | 101 --------
 .../spi/model/DefaultPlcBrowseRequest_plc4xgen.go  | 116 ---------
 plc4go/spi/model/DefaultPlcBrowseResponse.go       |  22 +-
 ...plc4xgen.go => DefaultPlcBrowseResponseItem.go} |  65 ++---
 plc4go/spi/model/DefaultPlcConsumerRegistration.go |  86 ++++++-
 plc4go/spi/model/DefaultPlcReadRequest.go          |  33 ++-
 .../model/DefaultPlcReadRequestBuilder_plc4xgen.go | 163 ------------
 plc4go/spi/model/DefaultPlcReadRequestResult.go    |  80 +++++-
 .../model/DefaultPlcReadRequestResult_plc4xgen.go  | 101 --------
 plc4go/spi/model/DefaultPlcReadRequest_plc4xgen.go |  98 --------
 plc4go/spi/model/DefaultPlcReadResponse.go         |  80 +++++-
 ...e_plc4xgen.go => DefaultPlcReadResponseItem.go} |  64 +++--
 .../spi/model/DefaultPlcReadResponse_plc4xgen.go   | 105 --------
 plc4go/spi/model/DefaultPlcSubscriptionEvent.go    |  82 +++++--
 .../spi/model/DefaultPlcSubscriptionEventItem.go   | 152 ++++++++++++
 .../model/DefaultPlcSubscriptionEvent_plc4xgen.go  | 151 ------------
 plc4go/spi/model/DefaultPlcSubscriptionHandle.go   |  51 +++-
 .../model/DefaultPlcSubscriptionHandle_plc4xgen.go |  76 ------
 plc4go/spi/model/DefaultPlcSubscriptionRequest.go  |  92 ++++++-
 ...efaultPlcSubscriptionRequestBuilder_plc4xgen.go | 202 ---------------
 .../model/DefaultPlcSubscriptionRequestResult.go   |  80 +++++-
 ...DefaultPlcSubscriptionRequestResult_plc4xgen.go | 101 --------
 .../DefaultPlcSubscriptionRequest_plc4xgen.go      | 118 ---------
 plc4go/spi/model/DefaultPlcSubscriptionResponse.go |  89 ++++++-
 .../model/DefaultPlcSubscriptionResponseItem.go    | 101 ++++++++
 .../DefaultPlcSubscriptionResponse_plc4xgen.go     | 105 --------
 plc4go/spi/model/DefaultPlcTagRequest.go           |  51 +++-
 plc4go/spi/model/DefaultPlcTagRequest_plc4xgen.go  |  94 -------
 .../model/DefaultPlcUnsubscriptionRequestResult.go |  80 +++++-
 ...faultPlcUnsubscriptionRequestResult_plc4xgen.go | 101 --------
 plc4go/spi/model/DefaultPlcWriteRequest.go         |  98 +++++++-
 .../DefaultPlcWriteRequestBuilder_plc4xgen.go      | 195 ---------------
 plc4go/spi/model/DefaultPlcWriteRequestResult.go   |  80 +++++-
 .../model/DefaultPlcWriteRequestResult_plc4xgen.go | 101 --------
 .../spi/model/DefaultPlcWriteRequest_plc4xgen.go   | 124 ----------
 plc4go/spi/model/DefaultPlcWriteResponse.go        |  85 ++++++-
 plc4go/spi/model/DefaultResponse.go                |  31 ++-
 plc4go/spi/model/DefaultResponse_plc4xgen.go       |  83 -------
 plc4go/spi/utils/WriteBufferXmlBased.go            |   4 +-
 plc4go/spi/values/PlcNull.go                       |  18 ++
 plc4go/spi/values/PlcValueAdapter.go               |   3 +
 plc4j/drivers/eip/pom.xml                          |   1 +
 .../plc4x/java/eip/readwrite/CIPDataTypeCode.java  |  89 +++++++
 .../java/eip/readwrite/CIPStructTypeCode.java}     |  33 ++-
 .../plc4x/java/eip/readwrite/CipExchange.java      | 204 ++++++++++++++++
 .../apache/plc4x/java/eip/readwrite/CipRRData.java | 192 +++++++++++++++
 .../plc4x/java/eip/readwrite/CipReadRequest.java   | 180 ++++++++++++++
 .../plc4x/java/eip/readwrite/CipReadResponse.java  | 217 ++++++++++++++++
 .../plc4x/java/eip/readwrite/CipService.java       | 173 +++++++++++++
 .../java/eip/readwrite/CipUnconnectedRequest.java  | 265 ++++++++++++++++++++
 .../plc4x/java/eip/readwrite/CipWriteRequest.java  | 231 +++++++++++++++++
 .../plc4x/java/eip/readwrite/CipWriteResponse.java | 170 +++++++++++++
 .../plc4x/java/eip/readwrite/EiPCommand.java}      |  35 ++-
 .../java/eip/readwrite/EipConnectionRequest.java   | 172 +++++++++++++
 .../java/eip/readwrite/EipDisconnectRequest.java   | 126 ++++++++++
 .../apache/plc4x/java/eip/readwrite/EipPacket.java | 272 +++++++++++++++++++++
 .../java/eip/readwrite/MultipleServiceRequest.java | 180 ++++++++++++++
 .../eip/readwrite/MultipleServiceResponse.java     | 238 ++++++++++++++++++
 .../apache/plc4x/java/eip/readwrite/Services.java  | 190 ++++++++++++++
 .../eip/readwrite/protocol/EipProtocolLogic.java   |  29 ++-
 .../{EIPDriverTestsuite.java => EIPDriverIT.java}  |   4 +-
 .../eip/src/test/resources/logback-test.xml        |   2 +-
 .../migration/MessageValidatorAndMigrator.java     |   2 +-
 .../resources/protocols/eip/DriverTestsuite.xml    |  12 +-
 75 files changed, 4787 insertions(+), 2562 deletions(-)

diff --git a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
index a78fc63408..f0603c00a6 100644
--- a/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/eip/DriverTestsuite.xml
@@ -32,7 +32,7 @@
     <outgoing-plc-message name="Send connection request">
       <EipPacket>
         <command dataType="uint" bitLength="16">101</command>
-        <len dataType="uint" bitLength="16">4</len>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
         <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
         <status dataType="uint" bitLength="32">0</status>
         <senderContext isList="true">
@@ -56,7 +56,7 @@
     <incoming-plc-message name="Receive connection response">
       <EipPacket>
         <command dataType="uint" bitLength="16">101</command>
-        <len dataType="uint" bitLength="16">4</len>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
         <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
         <status dataType="uint" bitLength="32">0</status>
         <senderContext isList="true">
@@ -75,9 +75,9 @@
           <flags dataType="uint" bitLength="16">0</flags>
         </EipConnectionRequest>
       </EipPacket>
-
     </incoming-plc-message>
   </setup>
+
   <testcase>
     <name>Single element read request</name>
     <steps>
@@ -94,7 +94,7 @@
       <outgoing-plc-message name="Send CipReadRequest to PLC">
         <EipPacket>
           <command dataType="uint" bitLength="16">111</command>
-          <len dataType="uint" bitLength="16">40</len>
+          <packetLength dataType="uint" bitLength="16">40</packetLength>
           <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
           <status dataType="uint" bitLength="32">0</status>
           <senderContext isList="true">
@@ -152,7 +152,7 @@
       <incoming-plc-message name="Get CipReadResponse from PLC">
         <EipPacket>
           <command dataType="uint" bitLength="16">111</command>
-          <len dataType="uint" bitLength="16">26</len>
+          <packetLength dataType="uint" bitLength="16">26</packetLength>
           <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
           <status dataType="uint" bitLength="32">0</status>
           <senderContext isList="true">
diff --git a/plc4go/internal/modbus/Tag.go b/plc4go/internal/modbus/Tag.go
index 8958d18c4f..64296943ed 100644
--- a/plc4go/internal/modbus/Tag.go
+++ b/plc4go/internal/modbus/Tag.go
@@ -20,6 +20,7 @@
 package modbus
 
 import (
+	"context"
 	"encoding/binary"
 	"fmt"
 	"strconv"
@@ -105,13 +106,13 @@ func CastToModbusTagFromPlcTag(plcTag model.PlcTag) (modbusTag, error) {
 
 func (m modbusTag) Serialize() ([]byte, error) {
 	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := m.SerializeWithWriteBuffer(wb); err != nil {
+	if err := m.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
 		return nil, err
 	}
 	return wb.GetBytes(), nil
 }
 
-func (m modbusTag) SerializeWithWriteBuffer(writeBuffer utils.WriteBuffer) error {
+func (m modbusTag) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
 	if err := writeBuffer.PushContext(m.TagType.GetName()); err != nil {
 		return err
 	}
diff --git a/plc4go/internal/modbus/TagHandler.go b/plc4go/internal/modbus/TagHandler.go
index 9fa496e7e7..746fb287e5 100644
--- a/plc4go/internal/modbus/TagHandler.go
+++ b/plc4go/internal/modbus/TagHandler.go
@@ -41,7 +41,7 @@ const (
 )
 
 func (i TagType) GetName() string {
-	return fmt.Sprintf("ModbusTags%s", i.String())
+	return fmt.Sprintf("ModbusTag%s", i.String())
 }
 
 type TagHandler struct {
diff --git a/plc4go/internal/s7/Tag.go b/plc4go/internal/s7/Tag.go
index 9dac023754..bcc7c923bc 100644
--- a/plc4go/internal/s7/Tag.go
+++ b/plc4go/internal/s7/Tag.go
@@ -20,6 +20,7 @@
 package s7
 
 import (
+	"context"
 	"encoding/binary"
 	"fmt"
 
@@ -32,6 +33,7 @@ import (
 
 type PlcTag interface {
 	model.PlcTag
+	utils.Serializable
 
 	GetDataType() readWriteModel.TransportSize
 	GetNumElements() uint16
@@ -136,13 +138,13 @@ func (m plcTag) GetQuantity() uint16 {
 }
 func (m plcTag) Serialize() ([]byte, error) {
 	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := m.SerializeWithWriteBuffer(wb); err != nil {
+	if err := m.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
 		return nil, err
 	}
 	return wb.GetBytes(), nil
 }
 
-func (m plcTag) SerializeWithWriteBuffer(writeBuffer utils.WriteBuffer) error {
+func (m plcTag) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
 	if err := writeBuffer.PushContext(m.TagType.GetName()); err != nil {
 		return err
 	}
@@ -174,13 +176,13 @@ func (m plcTag) SerializeWithWriteBuffer(writeBuffer utils.WriteBuffer) error {
 
 func (m PlcStringTag) Serialize() ([]byte, error) {
 	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := m.SerializeWithWriteBuffer(wb); err != nil {
+	if err := m.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
 		return nil, err
 	}
 	return wb.GetBytes(), nil
 }
 
-func (m PlcStringTag) SerializeWithWriteBuffer(writeBuffer utils.WriteBuffer) error {
+func (m PlcStringTag) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
 	if err := writeBuffer.PushContext(m.TagType.GetName()); err != nil {
 		return err
 	}
diff --git a/plc4go/pkg/api/model/plc_response_code.go b/plc4go/pkg/api/model/plc_response_code.go
index d3daa11d7b..4febb6559f 100644
--- a/plc4go/pkg/api/model/plc_response_code.go
+++ b/plc4go/pkg/api/model/plc_response_code.go
@@ -19,6 +19,12 @@
 
 package model
 
+import (
+	"context"
+
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
+
 type PlcResponseCode uint8
 
 const (
@@ -70,3 +76,15 @@ func (m PlcResponseCode) GetName() string {
 func (m PlcResponseCode) String() string {
 	return m.GetName()
 }
+
+func (m PlcResponseCode) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased()
+	if err := m.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (m PlcResponseCode) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("AlarmType", 8, uint8(m), utils.WithAdditionalStringRepresentation(m.GetName()))
+}
diff --git a/plc4go/spi/model/DefaultPlcBrowseEvent.go b/plc4go/spi/model/DefaultPlcBrowseEvent.go
index 51d55e1905..455f6aa5be 100644
--- a/plc4go/spi/model/DefaultPlcBrowseEvent.go
+++ b/plc4go/spi/model/DefaultPlcBrowseEvent.go
@@ -20,10 +20,14 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcBrowseEvent
 type DefaultPlcBrowseEvent struct {
 	Request   model.PlcBrowseRequest
 	QueryName string
@@ -50,3 +54,77 @@ func (d *DefaultPlcBrowseEvent) GetResult() model.PlcBrowseItem {
 func (d *DefaultPlcBrowseEvent) GetErr() error {
 	return d.Err
 }
+
+func (d *DefaultPlcBrowseEvent) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcBrowseEvent) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcBrowseEvent"); err != nil {
+		return err
+	}
+
+	if d.Request != nil {
+		if serializableField, ok := d.Request.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("request"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("request"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if err := writeBuffer.WriteString("queryName", uint32(len(d.QueryName)*8), "UTF-8", d.QueryName); err != nil {
+		return err
+	}
+
+	if d.Result != nil {
+		if serializableField, ok := d.Result.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("result"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("result"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Result)
+			if err := writeBuffer.WriteString("result", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Err != nil {
+		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("PlcBrowseEvent"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcBrowseEvent) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcBrowseEvent_plc4xgen.go b/plc4go/spi/model/DefaultPlcBrowseEvent_plc4xgen.go
deleted file mode 100644
index ae810d288b..0000000000
--- a/plc4go/spi/model/DefaultPlcBrowseEvent_plc4xgen.go
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcBrowseEvent"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcBrowseEvent) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcBrowseEvent) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcBrowseEvent"); err != nil {
-		return err
-	}
-
-	if d.Request != nil {
-		if serializableField, ok := d.Request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if err := writeBuffer.WriteString("queryName", uint32(len(d.QueryName)*8), "UTF-8", d.QueryName); err != nil {
-		return err
-	}
-
-	if d.Result != nil {
-		if serializableField, ok := d.Result.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("result"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("result"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Result)
-			if err := writeBuffer.WriteString("result", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Err != nil {
-		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("PlcBrowseEvent"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcBrowseEvent) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcBrowseItem.go b/plc4go/spi/model/DefaultPlcBrowseItem.go
index efd089ffd4..740a88fabb 100644
--- a/plc4go/spi/model/DefaultPlcBrowseItem.go
+++ b/plc4go/spi/model/DefaultPlcBrowseItem.go
@@ -20,11 +20,15 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/pkg/api/values"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcBrowseItem
 type DefaultPlcBrowseItem struct {
 	Tag          model.PlcTag
 	Name         string
@@ -67,3 +71,120 @@ func (d *DefaultPlcBrowseItem) GetChildren() map[string]model.PlcBrowseItem {
 func (d *DefaultPlcBrowseItem) GetOptions() map[string]values.PlcValue {
 	return d.Options
 }
+
+func (d *DefaultPlcBrowseItem) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcBrowseItem) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcBrowseItem"); err != nil {
+		return err
+	}
+
+	if d.Tag != nil {
+		if serializableField, ok := d.Tag.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("tag"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("tag"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Tag)
+			if err := writeBuffer.WriteString("tag", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if err := writeBuffer.WriteString("name", uint32(len(d.Name)*8), "UTF-8", d.Name); err != nil {
+		return err
+	}
+
+	if err := writeBuffer.WriteString("dataTypeName", uint32(len(d.DataTypeName)*8), "UTF-8", d.DataTypeName); err != nil {
+		return err
+	}
+
+	if err := writeBuffer.WriteBit("readable", d.Readable); err != nil {
+		return err
+	}
+
+	if err := writeBuffer.WriteBit("writable", d.Writable); err != nil {
+		return err
+	}
+
+	if err := writeBuffer.WriteBit("subscribable", d.Subscribable); err != nil {
+		return err
+	}
+	if err := writeBuffer.PushContext("children", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.Children {
+
+		var elem interface{} = elem
+		if serializable, ok := elem.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(name); err != nil {
+				return err
+			}
+			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(name); err != nil {
+				return err
+			}
+		} else {
+			elemAsString := fmt.Sprintf("%v", elem)
+			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("children", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PushContext("options", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.Options {
+
+		var elem interface{} = elem
+		if serializable, ok := elem.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(name); err != nil {
+				return err
+			}
+			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(name); err != nil {
+				return err
+			}
+		} else {
+			elemAsString := fmt.Sprintf("%v", elem)
+			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("options", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcBrowseItem"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcBrowseItem) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcBrowseItem_plc4xgen.go b/plc4go/spi/model/DefaultPlcBrowseItem_plc4xgen.go
deleted file mode 100644
index c747c8e16a..0000000000
--- a/plc4go/spi/model/DefaultPlcBrowseItem_plc4xgen.go
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcBrowseItem"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcBrowseItem) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcBrowseItem) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcBrowseItem"); err != nil {
-		return err
-	}
-
-	if d.Tag != nil {
-		if serializableField, ok := d.Tag.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("tag"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("tag"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Tag)
-			if err := writeBuffer.WriteString("tag", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if err := writeBuffer.WriteString("name", uint32(len(d.Name)*8), "UTF-8", d.Name); err != nil {
-		return err
-	}
-
-	if err := writeBuffer.WriteString("dataTypeName", uint32(len(d.DataTypeName)*8), "UTF-8", d.DataTypeName); err != nil {
-		return err
-	}
-
-	if err := writeBuffer.WriteBit("readable", d.Readable); err != nil {
-		return err
-	}
-
-	if err := writeBuffer.WriteBit("writable", d.Writable); err != nil {
-		return err
-	}
-
-	if err := writeBuffer.WriteBit("subscribable", d.Subscribable); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("children", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.Children {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("children", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("options", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.Options {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("options", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("PlcBrowseItem"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcBrowseItem) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcBrowseRequest.go b/plc4go/spi/model/DefaultPlcBrowseRequest.go
index b39853f8e9..37424cdfa4 100644
--- a/plc4go/spi/model/DefaultPlcBrowseRequest.go
+++ b/plc4go/spi/model/DefaultPlcBrowseRequest.go
@@ -21,9 +21,12 @@ package model
 
 import (
 	"context"
+	"encoding/binary"
+	"fmt"
 
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/spi"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 )
 
@@ -61,7 +64,6 @@ func (d *DefaultPlcBrowseRequestBuilder) Build() (model.PlcBrowseRequest, error)
 	return NewDefaultPlcBrowseRequest(queries, d.queryNames, d.browser), nil
 }
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcBrowseRequest
 type DefaultPlcBrowseRequest struct {
 	DefaultPlcRequest
 	browser    spi.PlcBrowser
@@ -101,3 +103,88 @@ func (d *DefaultPlcBrowseRequest) GetQueryNames() []string {
 func (d *DefaultPlcBrowseRequest) GetQuery(queryName string) model.PlcQuery {
 	return d.queries[queryName]
 }
+
+func (d *DefaultPlcBrowseRequest) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcBrowseRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcBrowseRequest"); err != nil {
+		return err
+	}
+	if err := d.DefaultPlcRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+		return err
+	}
+
+	if d.browser != nil {
+		if serializableField, ok := d.browser.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("browser"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("browser"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.browser)
+			if err := writeBuffer.WriteString("browser", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PushContext("queryNames", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for _, elem := range d.queryNames {
+		if err := writeBuffer.WriteString("", uint32(len(elem)*8), "UTF-8", elem); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("queryNames", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PushContext("queries", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.queries {
+
+		var elem interface{} = elem
+		if serializable, ok := elem.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(name); err != nil {
+				return err
+			}
+			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(name); err != nil {
+				return err
+			}
+		} else {
+			elemAsString := fmt.Sprintf("%v", elem)
+			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("queries", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcBrowseRequest"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcBrowseRequest) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcBrowseRequestResult.go b/plc4go/spi/model/DefaultPlcBrowseRequestResult.go
index 09c49155ea..2a4b6b34d1 100644
--- a/plc4go/spi/model/DefaultPlcBrowseRequestResult.go
+++ b/plc4go/spi/model/DefaultPlcBrowseRequestResult.go
@@ -19,9 +19,15 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcBrowseRequestResult
 type DefaultPlcBrowseRequestResult struct {
 	Request  model.PlcBrowseRequest
 	Response model.PlcBrowseResponse
@@ -39,3 +45,73 @@ func (d *DefaultPlcBrowseRequestResult) GetResponse() model.PlcBrowseResponse {
 func (d *DefaultPlcBrowseRequestResult) GetErr() error {
 	return d.Err
 }
+
+func (d *DefaultPlcBrowseRequestResult) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcBrowseRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcBrowseRequestResult"); err != nil {
+		return err
+	}
+
+	if d.Request != nil {
+		if serializableField, ok := d.Request.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("request"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("request"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Response != nil {
+		if serializableField, ok := d.Response.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("response"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("response"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Response)
+			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Err != nil {
+		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("PlcBrowseRequestResult"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcBrowseRequestResult) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcBrowseRequestResult_plc4xgen.go b/plc4go/spi/model/DefaultPlcBrowseRequestResult_plc4xgen.go
deleted file mode 100644
index 8f6b1f3154..0000000000
--- a/plc4go/spi/model/DefaultPlcBrowseRequestResult_plc4xgen.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcBrowseRequestResult"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcBrowseRequestResult) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcBrowseRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcBrowseRequestResult"); err != nil {
-		return err
-	}
-
-	if d.Request != nil {
-		if serializableField, ok := d.Request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Response != nil {
-		if serializableField, ok := d.Response.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("response"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("response"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Response)
-			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Err != nil {
-		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("PlcBrowseRequestResult"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcBrowseRequestResult) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcBrowseRequest_plc4xgen.go b/plc4go/spi/model/DefaultPlcBrowseRequest_plc4xgen.go
deleted file mode 100644
index 8d578da51d..0000000000
--- a/plc4go/spi/model/DefaultPlcBrowseRequest_plc4xgen.go
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcBrowseRequest"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcBrowseRequest) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcBrowseRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcBrowseRequest"); err != nil {
-		return err
-	}
-	if err := d.DefaultPlcRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-
-	if d.browser != nil {
-		if serializableField, ok := d.browser.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("browser"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("browser"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.browser)
-			if err := writeBuffer.WriteString("browser", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PushContext("queryNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for _, elem := range d.queryNames {
-		if err := writeBuffer.WriteString("", uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("queryNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("queries", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.queries {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("queries", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("PlcBrowseRequest"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcBrowseRequest) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcBrowseResponse.go b/plc4go/spi/model/DefaultPlcBrowseResponse.go
index f4d7f2e97b..864512adc0 100644
--- a/plc4go/spi/model/DefaultPlcBrowseResponse.go
+++ b/plc4go/spi/model/DefaultPlcBrowseResponse.go
@@ -33,14 +33,18 @@ type DefaultPlcBrowseResponse struct {
 	DefaultResponse
 	request      model.PlcBrowseRequest
 	responseCode model.PlcResponseCode
-	results      map[string][]model.PlcBrowseItem
+	results      map[string]*DefaultPlcBrowseResponseItem
 }
 
 func NewDefaultPlcBrowseResponse(request model.PlcBrowseRequest, results map[string][]model.PlcBrowseItem, responseCodes map[string]model.PlcResponseCode) DefaultPlcBrowseResponse {
+	res := map[string]*DefaultPlcBrowseResponseItem{}
+	for name, code := range responseCodes {
+		value := results[name]
+		res[name] = NewBrowseResponseItem(code, value)
+	}
 	return DefaultPlcBrowseResponse{
-		DefaultResponse: DefaultResponse{responseCodes: responseCodes},
-		request:         request,
-		results:         results,
+		request: request,
+		results: res,
 	}
 }
 
@@ -56,8 +60,12 @@ func (d DefaultPlcBrowseResponse) GetQueryNames() []string {
 	return queryNames
 }
 
+func (d DefaultPlcBrowseResponse) GetResponseCode(name string) model.PlcResponseCode {
+	return d.results[name].GetCode()
+}
+
 func (d DefaultPlcBrowseResponse) GetQueryResults(queryName string) []model.PlcBrowseItem {
-	return d.results[queryName]
+	return d.results[queryName].GetResults()
 }
 
 func (d DefaultPlcBrowseResponse) Serialize() ([]byte, error) {
@@ -84,11 +92,11 @@ func (d DefaultPlcBrowseResponse) SerializeWithWriteBuffer(ctx context.Context,
 	if err := writeBuffer.PushContext("results"); err != nil {
 		return err
 	}
-	for tagName, foundTags := range d.results {
+	for tagName, browseResponseItem := range d.results {
 		if err := writeBuffer.PushContext(tagName); err != nil {
 			return err
 		}
-		for _, tag := range foundTags {
+		for _, tag := range browseResponseItem.GetResults() {
 			if serializableTag, ok := tag.(utils.Serializable); ok {
 				if err := serializableTag.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
 					return err
diff --git a/plc4go/spi/model/DefaultPlcConsumerRegistration_plc4xgen.go b/plc4go/spi/model/DefaultPlcBrowseResponseItem.go
similarity index 59%
rename from plc4go/spi/model/DefaultPlcConsumerRegistration_plc4xgen.go
rename to plc4go/spi/model/DefaultPlcBrowseResponseItem.go
index c4c2f002c4..d5439ca898 100644
--- a/plc4go/spi/model/DefaultPlcConsumerRegistration_plc4xgen.go
+++ b/plc4go/spi/model/DefaultPlcBrowseResponseItem.go
@@ -17,20 +17,38 @@
  * under the License.
  */
 
-// Code generated by "plc4xgenerator -type=DefaultPlcConsumerRegistration"; DO NOT EDIT.
-
 package model
 
 import (
 	"context"
 	"encoding/binary"
 	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-var _ = fmt.Printf
+type DefaultPlcBrowseResponseItem struct {
+	code    model.PlcResponseCode
+	results []model.PlcBrowseItem
+}
 
-func (d *DefaultPlcConsumerRegistration) Serialize() ([]byte, error) {
+func NewBrowseResponseItem(code model.PlcResponseCode, results []model.PlcBrowseItem) *DefaultPlcBrowseResponseItem {
+	return &DefaultPlcBrowseResponseItem{
+		code:    code,
+		results: results,
+	}
+}
+
+func (r *DefaultPlcBrowseResponseItem) GetCode() model.PlcResponseCode {
+	return r.code
+}
+
+func (r *DefaultPlcBrowseResponseItem) GetResults() []model.PlcBrowseItem {
+	return r.results
+}
+
+func (d *DefaultPlcBrowseResponseItem) Serialize() ([]byte, error) {
 	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
 	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
 		return nil, err
@@ -38,38 +56,21 @@ func (d *DefaultPlcConsumerRegistration) Serialize() ([]byte, error) {
 	return wb.GetBytes(), nil
 }
 
-func (d *DefaultPlcConsumerRegistration) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcConsumerRegistration"); err != nil {
-		return err
-	}
-	_value := fmt.Sprintf("%v", d.consumerId)
-
-	if err := writeBuffer.WriteString("consumerId", uint32(len(_value)*8), "UTF-8", _value); err != nil {
+func (d *DefaultPlcBrowseResponseItem) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcBrowseResponseItem"); err != nil {
 		return err
 	}
 
-	if d.plcSubscriber != nil {
-		if serializableField, ok := d.plcSubscriber.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("plcSubscriber"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("plcSubscriber"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.plcSubscriber)
-			if err := writeBuffer.WriteString("plcSubscriber", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
+	{
+		stringValue := fmt.Sprintf("%v", d.code)
+		if err := writeBuffer.WriteString("code", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+			return err
 		}
 	}
-	if err := writeBuffer.PushContext("handles", utils.WithRenderAsList(true)); err != nil {
+	if err := writeBuffer.PushContext("results", utils.WithRenderAsList(true)); err != nil {
 		return err
 	}
-	for _, elem := range d.handles {
+	for _, elem := range d.results {
 		var elem interface{} = elem
 
 		if elem != nil {
@@ -91,16 +92,16 @@ func (d *DefaultPlcConsumerRegistration) SerializeWithWriteBuffer(ctx context.Co
 			}
 		}
 	}
-	if err := writeBuffer.PopContext("handles", utils.WithRenderAsList(true)); err != nil {
+	if err := writeBuffer.PopContext("results", utils.WithRenderAsList(true)); err != nil {
 		return err
 	}
-	if err := writeBuffer.PopContext("PlcConsumerRegistration"); err != nil {
+	if err := writeBuffer.PopContext("PlcBrowseResponseItem"); err != nil {
 		return err
 	}
 	return nil
 }
 
-func (d *DefaultPlcConsumerRegistration) String() string {
+func (d *DefaultPlcBrowseResponseItem) String() string {
 	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
 	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
 		return err.Error()
diff --git a/plc4go/spi/model/DefaultPlcConsumerRegistration.go b/plc4go/spi/model/DefaultPlcConsumerRegistration.go
index b35fca8c4a..12c09dfe59 100644
--- a/plc4go/spi/model/DefaultPlcConsumerRegistration.go
+++ b/plc4go/spi/model/DefaultPlcConsumerRegistration.go
@@ -20,12 +20,16 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+	"math/rand"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/spi"
-	"math/rand"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcConsumerRegistration
 type DefaultPlcConsumerRegistration struct {
 	consumerId    int
 	consumer      model.PlcSubscriptionEventConsumer `ignore:"true"` // Function not renderable
@@ -54,3 +58,81 @@ func (d *DefaultPlcConsumerRegistration) GetSubscriptionHandles() []model.PlcSub
 func (d *DefaultPlcConsumerRegistration) Unregister() {
 	d.plcSubscriber.Unregister(d)
 }
+
+func (d *DefaultPlcConsumerRegistration) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcConsumerRegistration) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcConsumerRegistration"); err != nil {
+		return err
+	}
+	_value := fmt.Sprintf("%v", d.consumerId)
+
+	if err := writeBuffer.WriteString("consumerId", uint32(len(_value)*8), "UTF-8", _value); err != nil {
+		return err
+	}
+
+	if d.plcSubscriber != nil {
+		if serializableField, ok := d.plcSubscriber.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("plcSubscriber"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("plcSubscriber"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.plcSubscriber)
+			if err := writeBuffer.WriteString("plcSubscriber", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PushContext("handles", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for _, elem := range d.handles {
+		var elem interface{} = elem
+
+		if elem != nil {
+			if serializableField, ok := elem.(utils.Serializable); ok {
+				if err := writeBuffer.PushContext("value"); err != nil {
+					return err
+				}
+				if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+					return err
+				}
+				if err := writeBuffer.PopContext("value"); err != nil {
+					return err
+				}
+			} else {
+				stringValue := fmt.Sprintf("%v", elem)
+				if err := writeBuffer.WriteString("value", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+					return err
+				}
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("handles", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcConsumerRegistration"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcConsumerRegistration) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcReadRequest.go b/plc4go/spi/model/DefaultPlcReadRequest.go
index b62345f9fd..4a651b5f2a 100644
--- a/plc4go/spi/model/DefaultPlcReadRequest.go
+++ b/plc4go/spi/model/DefaultPlcReadRequest.go
@@ -21,15 +21,16 @@ package model
 
 import (
 	"context"
+	"encoding/binary"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/spi/interceptors"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcReadRequestBuilder
 type DefaultPlcReadRequestBuilder struct {
 	reader                 spi.PlcReader
 	tagHandler             spi.PlcTagHandler
@@ -82,7 +83,6 @@ func (d *DefaultPlcReadRequestBuilder) Build() (model.PlcReadRequest, error) {
 	return NewDefaultPlcReadRequest(d.tags, d.tagNames, d.reader, d.readRequestInterceptor), nil
 }
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcReadRequest
 type DefaultPlcReadRequest struct {
 	DefaultPlcTagRequest
 	reader                 spi.PlcReader
@@ -152,3 +152,32 @@ func (d *DefaultPlcReadRequest) ExecuteWithContext(ctx context.Context) <-chan m
 
 	return resultChannel
 }
+
+func (d *DefaultPlcReadRequest) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcReadRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcReadRequest"); err != nil {
+		return err
+	}
+	if err := d.DefaultPlcTagRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcReadRequest"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcReadRequest) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcReadRequestBuilder_plc4xgen.go b/plc4go/spi/model/DefaultPlcReadRequestBuilder_plc4xgen.go
deleted file mode 100644
index 0d5a6a1817..0000000000
--- a/plc4go/spi/model/DefaultPlcReadRequestBuilder_plc4xgen.go
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcReadRequestBuilder"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcReadRequestBuilder) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcReadRequestBuilder) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcReadRequestBuilder"); err != nil {
-		return err
-	}
-
-	if d.reader != nil {
-		if serializableField, ok := d.reader.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("reader"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("reader"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.reader)
-			if err := writeBuffer.WriteString("reader", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.tagHandler != nil {
-		if serializableField, ok := d.tagHandler.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("tagHandler"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("tagHandler"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.tagHandler)
-			if err := writeBuffer.WriteString("tagHandler", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PushContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for _, elem := range d.tagNames {
-		if err := writeBuffer.WriteString("", uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tagAddresses", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tagAddresses {
-
-		if err := writeBuffer.WriteString(name, uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("tagAddresses", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tags {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-
-	if d.readRequestInterceptor != nil {
-		if serializableField, ok := d.readRequestInterceptor.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("readRequestInterceptor"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("readRequestInterceptor"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.readRequestInterceptor)
-			if err := writeBuffer.WriteString("readRequestInterceptor", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("PlcReadRequestBuilder"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcReadRequestBuilder) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcReadRequestResult.go b/plc4go/spi/model/DefaultPlcReadRequestResult.go
index 578014c7db..0eb3f8d199 100644
--- a/plc4go/spi/model/DefaultPlcReadRequestResult.go
+++ b/plc4go/spi/model/DefaultPlcReadRequestResult.go
@@ -19,9 +19,15 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcReadRequestResult
 type DefaultPlcReadRequestResult struct {
 	Request  model.PlcReadRequest
 	Response model.PlcReadResponse
@@ -39,3 +45,73 @@ func (d *DefaultPlcReadRequestResult) GetResponse() model.PlcReadResponse {
 func (d *DefaultPlcReadRequestResult) GetErr() error {
 	return d.Err
 }
+
+func (d *DefaultPlcReadRequestResult) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcReadRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcReadRequestResult"); err != nil {
+		return err
+	}
+
+	if d.Request != nil {
+		if serializableField, ok := d.Request.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("request"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("request"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Response != nil {
+		if serializableField, ok := d.Response.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("response"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("response"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Response)
+			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Err != nil {
+		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("PlcReadRequestResult"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcReadRequestResult) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcReadRequestResult_plc4xgen.go b/plc4go/spi/model/DefaultPlcReadRequestResult_plc4xgen.go
deleted file mode 100644
index 7169484d20..0000000000
--- a/plc4go/spi/model/DefaultPlcReadRequestResult_plc4xgen.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcReadRequestResult"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcReadRequestResult) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcReadRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcReadRequestResult"); err != nil {
-		return err
-	}
-
-	if d.Request != nil {
-		if serializableField, ok := d.Request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Response != nil {
-		if serializableField, ok := d.Response.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("response"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("response"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Response)
-			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Err != nil {
-		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("PlcReadRequestResult"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcReadRequestResult) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcReadRequest_plc4xgen.go b/plc4go/spi/model/DefaultPlcReadRequest_plc4xgen.go
deleted file mode 100644
index 548c3fd55f..0000000000
--- a/plc4go/spi/model/DefaultPlcReadRequest_plc4xgen.go
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcReadRequest"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcReadRequest) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcReadRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcReadRequest"); err != nil {
-		return err
-	}
-	if err := d.DefaultPlcTagRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-
-	if d.reader != nil {
-		if serializableField, ok := d.reader.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("reader"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("reader"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.reader)
-			if err := writeBuffer.WriteString("reader", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.readRequestInterceptor != nil {
-		if serializableField, ok := d.readRequestInterceptor.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("readRequestInterceptor"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("readRequestInterceptor"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.readRequestInterceptor)
-			if err := writeBuffer.WriteString("readRequestInterceptor", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("PlcReadRequest"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcReadRequest) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcReadResponse.go b/plc4go/spi/model/DefaultPlcReadResponse.go
index 7da74fb0b4..50fd7094b0 100644
--- a/plc4go/spi/model/DefaultPlcReadResponse.go
+++ b/plc4go/spi/model/DefaultPlcReadResponse.go
@@ -20,22 +20,30 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/pkg/api/values"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcReadResponse
 type DefaultPlcReadResponse struct {
 	DefaultResponse
 	request model.PlcReadRequest
-	values  map[string]values.PlcValue
+	values  map[string]*DefaultPlcReadResponseItem
 }
 
 func NewDefaultPlcReadResponse(request model.PlcReadRequest, responseCodes map[string]model.PlcResponseCode, values map[string]values.PlcValue) model.PlcReadResponse {
+	valueMap := map[string]*DefaultPlcReadResponseItem{}
+	for name, code := range responseCodes {
+		value := values[name]
+		valueMap[name] = NewReadResponseItem(code, value)
+	}
 	return &DefaultPlcReadResponse{
-		DefaultResponse: NewDefaultResponse(responseCodes),
-		request:         request,
-		values:          values,
+		request: request,
+		values:  valueMap,
 	}
 }
 
@@ -54,6 +62,66 @@ func (d *DefaultPlcReadResponse) GetRequest() model.PlcReadRequest {
 	return d.request
 }
 
+func (d *DefaultPlcReadResponse) GetResponseCode(name string) model.PlcResponseCode {
+	return d.values[name].GetCode()
+}
+
 func (d *DefaultPlcReadResponse) GetValue(name string) values.PlcValue {
-	return d.values[name]
+	return d.values[name].GetValue()
+}
+
+func (d *DefaultPlcReadResponse) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcReadResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcReadResponse"); err != nil {
+		return err
+	}
+
+	if d.request != nil {
+		if serializableField, ok := d.request.(utils.Serializable); ok {
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PushContext("values"); err != nil {
+		return err
+	}
+	for name, elem := range d.values {
+		if err := writeBuffer.PushContext(name); err != nil {
+			return err
+		}
+		if err := elem.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+			return err
+		}
+		if err := writeBuffer.PopContext(name); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcReadResponse"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcReadResponse) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
 }
diff --git a/plc4go/spi/model/DefaultPlcWriteResponse_plc4xgen.go b/plc4go/spi/model/DefaultPlcReadResponseItem.go
similarity index 53%
rename from plc4go/spi/model/DefaultPlcWriteResponse_plc4xgen.go
rename to plc4go/spi/model/DefaultPlcReadResponseItem.go
index 74bcecb9b7..23659fc0a6 100644
--- a/plc4go/spi/model/DefaultPlcWriteResponse_plc4xgen.go
+++ b/plc4go/spi/model/DefaultPlcReadResponseItem.go
@@ -17,20 +17,39 @@
  * under the License.
  */
 
-// Code generated by "plc4xgenerator -type=DefaultPlcWriteResponse"; DO NOT EDIT.
-
 package model
 
 import (
 	"context"
 	"encoding/binary"
 	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/pkg/api/values"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-var _ = fmt.Printf
+type DefaultPlcReadResponseItem struct {
+	code  model.PlcResponseCode
+	value values.PlcValue
+}
+
+func NewReadResponseItem(code model.PlcResponseCode, value values.PlcValue) *DefaultPlcReadResponseItem {
+	return &DefaultPlcReadResponseItem{
+		code:  code,
+		value: value,
+	}
+}
+
+func (r *DefaultPlcReadResponseItem) GetCode() model.PlcResponseCode {
+	return r.code
+}
+
+func (r *DefaultPlcReadResponseItem) GetValue() values.PlcValue {
+	return r.value
+}
 
-func (d *DefaultPlcWriteResponse) Serialize() ([]byte, error) {
+func (d *DefaultPlcReadResponseItem) Serialize() ([]byte, error) {
 	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
 	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
 		return nil, err
@@ -38,39 +57,32 @@ func (d *DefaultPlcWriteResponse) Serialize() ([]byte, error) {
 	return wb.GetBytes(), nil
 }
 
-func (d *DefaultPlcWriteResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcWriteResponse"); err != nil {
+func (d *DefaultPlcReadResponseItem) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("ResponseItem"); err != nil {
 		return err
 	}
-	if err := d.DefaultResponse.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
+
+	{
+		stringValue := fmt.Sprintf("%v", d.code)
+		if err := writeBuffer.WriteString("result", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+			return err
+		}
 	}
 
-	if d.request != nil {
-		if serializableField, ok := d.request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
+	if d.value != nil {
+		var elem interface{} = d.value
+		if err := elem.(utils.Serializable).SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+			return err
 		}
 	}
-	if err := writeBuffer.PopContext("PlcWriteResponse"); err != nil {
+
+	if err := writeBuffer.PopContext("ResponseItem"); err != nil {
 		return err
 	}
 	return nil
 }
 
-func (d *DefaultPlcWriteResponse) String() string {
+func (d *DefaultPlcReadResponseItem) String() string {
 	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
 	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
 		return err.Error()
diff --git a/plc4go/spi/model/DefaultPlcReadResponse_plc4xgen.go b/plc4go/spi/model/DefaultPlcReadResponse_plc4xgen.go
deleted file mode 100644
index 8a264848a9..0000000000
--- a/plc4go/spi/model/DefaultPlcReadResponse_plc4xgen.go
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcReadResponse"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcReadResponse) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcReadResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcReadResponse"); err != nil {
-		return err
-	}
-	if err := d.DefaultResponse.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-
-	if d.request != nil {
-		if serializableField, ok := d.request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.values {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("PlcReadResponse"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcReadResponse) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionEvent.go b/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
index 89b2a5623d..e91d042ebc 100644
--- a/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
+++ b/plc4go/spi/model/DefaultPlcSubscriptionEvent.go
@@ -20,6 +20,9 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
@@ -27,14 +30,10 @@ import (
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcSubscriptionEvent
 type DefaultPlcSubscriptionEvent struct {
 	DefaultResponse
 	DefaultPlcSubscriptionEventRequirements `ignore:"true"` // Avoid recursion
-	tags                                    map[string]model.PlcTag
-	types                                   map[string]SubscriptionType
-	intervals                               map[string]time.Duration
-	values                                  map[string]values.PlcValue
+	values                                  map[string]*DefaultPlcSubscriptionEventItem
 }
 
 type DefaultPlcSubscriptionEventRequirements interface {
@@ -45,34 +44,48 @@ type DefaultPlcSubscriptionEventRequirements interface {
 func NewDefaultPlcSubscriptionEvent(defaultPlcSubscriptionEventRequirements DefaultPlcSubscriptionEventRequirements, tags map[string]model.PlcTag, types map[string]SubscriptionType,
 	intervals map[string]time.Duration, responseCodes map[string]model.PlcResponseCode,
 	values map[string]values.PlcValue) DefaultPlcSubscriptionEvent {
+
+	valueMap := map[string]*DefaultPlcSubscriptionEventItem{}
+	for name, code := range responseCodes {
+		tag := tags[name]
+		subscriptionType := types[name]
+		interval := intervals[name]
+		value := values[name]
+		valueMap[name] = NewSubscriptionEventItem(code, tag, subscriptionType, interval, value)
+	}
+
 	return DefaultPlcSubscriptionEvent{
-		DefaultResponse:                         NewDefaultResponse(responseCodes),
 		DefaultPlcSubscriptionEventRequirements: defaultPlcSubscriptionEventRequirements,
-		tags:                                    tags,
-		types:                                   types,
-		intervals:                               intervals,
-		values:                                  values,
+		values:                                  valueMap,
 	}
 }
 
 func (d *DefaultPlcSubscriptionEvent) GetTagNames() []string {
 	var tagNames []string
-	for tagName := range d.tags {
-		tagNames = append(tagNames, tagName)
+	for valueName := range d.values {
+		tagNames = append(tagNames, valueName)
 	}
 	return tagNames
 }
 
+func (d *DefaultPlcSubscriptionEvent) GetResponseCode(name string) model.PlcResponseCode {
+	return d.values[name].GetCode()
+}
+
 func (d *DefaultPlcSubscriptionEvent) GetTag(name string) model.PlcTag {
-	return d.tags[name]
+	return d.values[name].GetTag()
 }
 
 func (d *DefaultPlcSubscriptionEvent) GetType(name string) SubscriptionType {
-	return d.types[name]
+	return d.values[name].GetSubscriptionType()
 }
 
 func (d *DefaultPlcSubscriptionEvent) GetInterval(name string) time.Duration {
-	return d.intervals[name]
+	return d.values[name].GetInterval()
+}
+
+func (d *DefaultPlcSubscriptionEvent) GetValue(name string) values.PlcValue {
+	return d.values[name].GetValue()
 }
 
 func (d *DefaultPlcSubscriptionEvent) GetAddress(name string) string {
@@ -83,6 +96,41 @@ func (d *DefaultPlcSubscriptionEvent) GetSource(name string) string {
 	return d.GetAddress(name)
 }
 
-func (d *DefaultPlcSubscriptionEvent) GetValue(name string) values.PlcValue {
-	return d.values[name]
+func (d *DefaultPlcSubscriptionEvent) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcSubscriptionEvent) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionEvent"); err != nil {
+		return err
+	}
+	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.values {
+		_value := fmt.Sprintf("%v", elem)
+
+		if err := writeBuffer.WriteString(name, uint32(len(_value)*8), "UTF-8", _value); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcSubscriptionEvent"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcSubscriptionEvent) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
 }
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionEventItem.go b/plc4go/spi/model/DefaultPlcSubscriptionEventItem.go
new file mode 100644
index 0000000000..64d8cbfb3d
--- /dev/null
+++ b/plc4go/spi/model/DefaultPlcSubscriptionEventItem.go
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+	"time"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/pkg/api/values"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
+
+type DefaultPlcSubscriptionEventItem struct {
+	code             model.PlcResponseCode
+	tag              model.PlcTag
+	subscriptionType SubscriptionType
+	interval         time.Duration
+	value            values.PlcValue
+}
+
+func NewSubscriptionEventItem(code model.PlcResponseCode, tag model.PlcTag, subscriptionType SubscriptionType, interval time.Duration, value values.PlcValue) *DefaultPlcSubscriptionEventItem {
+	return &DefaultPlcSubscriptionEventItem{
+		code:             code,
+		tag:              tag,
+		subscriptionType: subscriptionType,
+		interval:         interval,
+		value:            value,
+	}
+}
+
+func (r *DefaultPlcSubscriptionEventItem) GetCode() model.PlcResponseCode {
+	return r.code
+}
+
+func (r *DefaultPlcSubscriptionEventItem) GetTag() model.PlcTag {
+	return r.tag
+}
+
+func (r *DefaultPlcSubscriptionEventItem) GetSubscriptionType() SubscriptionType {
+	return r.subscriptionType
+}
+
+func (r *DefaultPlcSubscriptionEventItem) GetInterval() time.Duration {
+	return r.interval
+}
+
+func (r *DefaultPlcSubscriptionEventItem) GetValue() values.PlcValue {
+	return r.value
+}
+
+func (d *DefaultPlcSubscriptionEventItem) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcSubscriptionEventItem) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionEventItem"); err != nil {
+		return err
+	}
+
+	{
+		stringValue := fmt.Sprintf("%v", d.code)
+		if err := writeBuffer.WriteString("code", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+			return err
+		}
+	}
+
+	if d.tag != nil {
+		if serializableField, ok := d.tag.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("tag"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("tag"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.tag)
+			if err := writeBuffer.WriteString("tag", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	_value := fmt.Sprintf("%v", d.subscriptionType)
+
+	if err := writeBuffer.WriteString("subscriptionType", uint32(len(_value)*8), "UTF-8", _value); err != nil {
+		return err
+	}
+
+	{
+		stringValue := fmt.Sprintf("%v", d.interval)
+		if err := writeBuffer.WriteString("interval", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+			return err
+		}
+	}
+
+	if d.value != nil {
+		if serializableField, ok := d.value.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("value"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("value"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.value)
+			if err := writeBuffer.WriteString("value", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("PlcSubscriptionEventItem"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcSubscriptionEventItem) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionEvent_plc4xgen.go b/plc4go/spi/model/DefaultPlcSubscriptionEvent_plc4xgen.go
deleted file mode 100644
index 220a2dd257..0000000000
--- a/plc4go/spi/model/DefaultPlcSubscriptionEvent_plc4xgen.go
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcSubscriptionEvent"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcSubscriptionEvent) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcSubscriptionEvent) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcSubscriptionEvent"); err != nil {
-		return err
-	}
-	if err := d.DefaultResponse.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tags {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("types", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.types {
-		_value := fmt.Sprintf("%v", elem)
-
-		if err := writeBuffer.WriteString(name, uint32(len(_value)*8), "UTF-8", _value); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("types", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("intervals", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.intervals {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("intervals", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.values {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("PlcSubscriptionEvent"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcSubscriptionEvent) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionHandle.go b/plc4go/spi/model/DefaultPlcSubscriptionHandle.go
index 5e745bac1d..1567514a99 100644
--- a/plc4go/spi/model/DefaultPlcSubscriptionHandle.go
+++ b/plc4go/spi/model/DefaultPlcSubscriptionHandle.go
@@ -20,11 +20,15 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/spi"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcSubscriptionHandle
 type DefaultPlcSubscriptionHandle struct {
 	handleToRegister model.PlcSubscriptionHandle `ignore:"true"`
 	plcSubscriber    spi.PlcSubscriber
@@ -51,3 +55,48 @@ func NewDefaultPlcSubscriptionHandleWithHandleToRegister(plcSubscriber spi.PlcSu
 func (d *DefaultPlcSubscriptionHandle) Register(consumer model.PlcSubscriptionEventConsumer) model.PlcConsumerRegistration {
 	return d.plcSubscriber.Register(consumer, []model.PlcSubscriptionHandle{d.handleToRegister})
 }
+
+func (d *DefaultPlcSubscriptionHandle) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcSubscriptionHandle) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionHandle"); err != nil {
+		return err
+	}
+
+	if d.plcSubscriber != nil {
+		if serializableField, ok := d.plcSubscriber.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("plcSubscriber"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("plcSubscriber"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.plcSubscriber)
+			if err := writeBuffer.WriteString("plcSubscriber", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("PlcSubscriptionHandle"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcSubscriptionHandle) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionHandle_plc4xgen.go b/plc4go/spi/model/DefaultPlcSubscriptionHandle_plc4xgen.go
deleted file mode 100644
index 4b38ca429e..0000000000
--- a/plc4go/spi/model/DefaultPlcSubscriptionHandle_plc4xgen.go
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcSubscriptionHandle"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcSubscriptionHandle) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcSubscriptionHandle) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcSubscriptionHandle"); err != nil {
-		return err
-	}
-
-	if d.plcSubscriber != nil {
-		if serializableField, ok := d.plcSubscriber.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("plcSubscriber"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("plcSubscriber"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.plcSubscriber)
-			if err := writeBuffer.WriteString("plcSubscriber", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("PlcSubscriptionHandle"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcSubscriptionHandle) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionRequest.go b/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
index 03feba8c09..fcc9275c7b 100644
--- a/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
+++ b/plc4go/spi/model/DefaultPlcSubscriptionRequest.go
@@ -21,10 +21,13 @@ package model
 
 import (
 	"context"
+	"encoding/binary"
+	"fmt"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/spi"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 )
 
@@ -49,7 +52,6 @@ func (s SubscriptionType) String() string {
 	}
 }
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcSubscriptionRequestBuilder
 type DefaultPlcSubscriptionRequestBuilder struct {
 	subscriber             spi.PlcSubscriber
 	tagHandler             spi.PlcTagHandler
@@ -141,7 +143,6 @@ func (d *DefaultPlcSubscriptionRequestBuilder) Build() (model.PlcSubscriptionReq
 	return NewDefaultPlcSubscriptionRequest(d.subscriber, d.tagNames, d.tags, d.types, d.intervals, d.preRegisteredConsumers), nil
 }
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcSubscriptionRequest
 type DefaultPlcSubscriptionRequest struct {
 	DefaultPlcTagRequest
 	types                  map[string]SubscriptionType
@@ -173,3 +174,90 @@ func (d *DefaultPlcSubscriptionRequest) GetInterval(name string) time.Duration {
 func (d *DefaultPlcSubscriptionRequest) GetPreRegisteredConsumers(name string) []model.PlcSubscriptionEventConsumer {
 	return d.preRegisteredConsumers[name]
 }
+
+func (d *DefaultPlcSubscriptionRequest) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcSubscriptionRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionRequest"); err != nil {
+		return err
+	}
+	if err := d.DefaultPlcTagRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+		return err
+	}
+	if err := writeBuffer.PushContext("types", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.types {
+		_value := fmt.Sprintf("%v", elem)
+
+		if err := writeBuffer.WriteString(name, uint32(len(_value)*8), "UTF-8", _value); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("types", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PushContext("intervals", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.intervals {
+
+		var elem interface{} = elem
+		if serializable, ok := elem.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(name); err != nil {
+				return err
+			}
+			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(name); err != nil {
+				return err
+			}
+		} else {
+			elemAsString := fmt.Sprintf("%v", elem)
+			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("intervals", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+
+	if d.subscriber != nil {
+		if serializableField, ok := d.subscriber.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("subscriber"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("subscriber"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.subscriber)
+			if err := writeBuffer.WriteString("subscriber", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("PlcSubscriptionRequest"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcSubscriptionRequest) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionRequestBuilder_plc4xgen.go b/plc4go/spi/model/DefaultPlcSubscriptionRequestBuilder_plc4xgen.go
deleted file mode 100644
index abdac565f7..0000000000
--- a/plc4go/spi/model/DefaultPlcSubscriptionRequestBuilder_plc4xgen.go
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcSubscriptionRequestBuilder"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcSubscriptionRequestBuilder) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcSubscriptionRequestBuilder) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcSubscriptionRequestBuilder"); err != nil {
-		return err
-	}
-
-	if d.subscriber != nil {
-		if serializableField, ok := d.subscriber.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("subscriber"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("subscriber"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.subscriber)
-			if err := writeBuffer.WriteString("subscriber", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.tagHandler != nil {
-		if serializableField, ok := d.tagHandler.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("tagHandler"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("tagHandler"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.tagHandler)
-			if err := writeBuffer.WriteString("tagHandler", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.valueHandler != nil {
-		if serializableField, ok := d.valueHandler.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("valueHandler"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("valueHandler"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.valueHandler)
-			if err := writeBuffer.WriteString("valueHandler", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PushContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for _, elem := range d.tagNames {
-		if err := writeBuffer.WriteString("", uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tagAddresses", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tagAddresses {
-
-		if err := writeBuffer.WriteString(name, uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("tagAddresses", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tags {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("types", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.types {
-		_value := fmt.Sprintf("%v", elem)
-
-		if err := writeBuffer.WriteString(name, uint32(len(_value)*8), "UTF-8", _value); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("types", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("intervals", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.intervals {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("intervals", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("PlcSubscriptionRequestBuilder"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcSubscriptionRequestBuilder) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionRequestResult.go b/plc4go/spi/model/DefaultPlcSubscriptionRequestResult.go
index cb806caa01..aaac3b618b 100644
--- a/plc4go/spi/model/DefaultPlcSubscriptionRequestResult.go
+++ b/plc4go/spi/model/DefaultPlcSubscriptionRequestResult.go
@@ -19,9 +19,15 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcSubscriptionRequestResult
 type DefaultPlcSubscriptionRequestResult struct {
 	Request  model.PlcSubscriptionRequest
 	Response model.PlcSubscriptionResponse
@@ -39,3 +45,73 @@ func (d *DefaultPlcSubscriptionRequestResult) GetResponse() model.PlcSubscriptio
 func (d *DefaultPlcSubscriptionRequestResult) GetErr() error {
 	return d.Err
 }
+
+func (d *DefaultPlcSubscriptionRequestResult) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcSubscriptionRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionRequestResult"); err != nil {
+		return err
+	}
+
+	if d.Request != nil {
+		if serializableField, ok := d.Request.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("request"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("request"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Response != nil {
+		if serializableField, ok := d.Response.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("response"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("response"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Response)
+			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Err != nil {
+		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("PlcSubscriptionRequestResult"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcSubscriptionRequestResult) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionRequestResult_plc4xgen.go b/plc4go/spi/model/DefaultPlcSubscriptionRequestResult_plc4xgen.go
deleted file mode 100644
index dd04d7bb9f..0000000000
--- a/plc4go/spi/model/DefaultPlcSubscriptionRequestResult_plc4xgen.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcSubscriptionRequestResult"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcSubscriptionRequestResult) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcSubscriptionRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcSubscriptionRequestResult"); err != nil {
-		return err
-	}
-
-	if d.Request != nil {
-		if serializableField, ok := d.Request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Response != nil {
-		if serializableField, ok := d.Response.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("response"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("response"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Response)
-			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Err != nil {
-		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("PlcSubscriptionRequestResult"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcSubscriptionRequestResult) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionRequest_plc4xgen.go b/plc4go/spi/model/DefaultPlcSubscriptionRequest_plc4xgen.go
deleted file mode 100644
index ac0e53efeb..0000000000
--- a/plc4go/spi/model/DefaultPlcSubscriptionRequest_plc4xgen.go
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcSubscriptionRequest"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcSubscriptionRequest) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcSubscriptionRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcSubscriptionRequest"); err != nil {
-		return err
-	}
-	if err := d.DefaultPlcTagRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("types", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.types {
-		_value := fmt.Sprintf("%v", elem)
-
-		if err := writeBuffer.WriteString(name, uint32(len(_value)*8), "UTF-8", _value); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("types", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("intervals", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.intervals {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("intervals", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-
-	if d.subscriber != nil {
-		if serializableField, ok := d.subscriber.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("subscriber"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("subscriber"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.subscriber)
-			if err := writeBuffer.WriteString("subscriber", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("PlcSubscriptionRequest"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcSubscriptionRequest) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionResponse.go b/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
index bea5b331b3..1305eb7c91 100644
--- a/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
+++ b/plc4go/spi/model/DefaultPlcSubscriptionResponse.go
@@ -20,22 +20,30 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcSubscriptionResponse
 type DefaultPlcSubscriptionResponse struct {
 	DefaultResponse
 	request model.PlcSubscriptionRequest
-	values  map[string]model.PlcSubscriptionHandle
+	values  map[string]*DefaultPlcSubscriptionResponseItem
 }
 
 func NewDefaultPlcSubscriptionResponse(request model.PlcSubscriptionRequest, responseCodes map[string]model.PlcResponseCode, values map[string]model.PlcSubscriptionHandle) *DefaultPlcSubscriptionResponse {
+	valueMap := map[string]*DefaultPlcSubscriptionResponseItem{}
+	for name, code := range responseCodes {
+		value := values[name]
+		valueMap[name] = NewSubscriptionResponseItem(code, value)
+	}
 	plcSubscriptionResponse := DefaultPlcSubscriptionResponse{
-		DefaultResponse: NewDefaultResponse(responseCodes),
-		request:         request,
-		values:          values,
+		request: request,
+		values:  valueMap,
 	}
 	for subscriptionTagName, consumers := range request.(*DefaultPlcSubscriptionRequest).preRegisteredConsumers {
 		subscriptionHandle, err := plcSubscriptionResponse.GetSubscriptionHandle(subscriptionTagName)
@@ -57,25 +65,86 @@ func (d *DefaultPlcSubscriptionResponse) GetTagNames() []string {
 	var tagNames []string
 	// We take the tag names from the request to keep order as map is not ordered
 	for _, name := range d.request.(*DefaultPlcSubscriptionRequest).GetTagNames() {
-		if _, ok := d.responseCodes[name]; ok {
+		if _, ok := d.values[name]; ok {
 			tagNames = append(tagNames, name)
 		}
 	}
 	return tagNames
 }
 
+func (d *DefaultPlcSubscriptionResponse) GetResponseCode(name string) model.PlcResponseCode {
+	return d.values[name].GetCode()
+}
+
 func (d *DefaultPlcSubscriptionResponse) GetSubscriptionHandle(name string) (model.PlcSubscriptionHandle, error) {
-	if d.responseCodes[name] != model.PlcResponseCode_OK {
+	if d.values[name].GetCode() != model.PlcResponseCode_OK {
 		return nil, errors.Errorf("%s failed to subscribe", name)
 	}
-	return d.values[name], nil
+	return d.values[name].GetSubscriptionHandle(), nil
 }
 
 func (d *DefaultPlcSubscriptionResponse) GetSubscriptionHandles() []model.PlcSubscriptionHandle {
 	result := make([]model.PlcSubscriptionHandle, 0, len(d.values))
-
 	for _, value := range d.values {
-		result = append(result, value)
+		result = append(result, value.GetSubscriptionHandle())
 	}
 	return result
 }
+
+func (d *DefaultPlcSubscriptionResponse) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcSubscriptionResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionResponse"); err != nil {
+		return err
+	}
+
+	if d.request != nil {
+		if serializableField, ok := d.request.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("request"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("request"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.values {
+		_value := fmt.Sprintf("%v", elem)
+
+		if err := writeBuffer.WriteString(name, uint32(len(_value)*8), "UTF-8", _value); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcSubscriptionResponse"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcSubscriptionResponse) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionResponseItem.go b/plc4go/spi/model/DefaultPlcSubscriptionResponseItem.go
new file mode 100644
index 0000000000..3c41f1dd8c
--- /dev/null
+++ b/plc4go/spi/model/DefaultPlcSubscriptionResponseItem.go
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
+
+type DefaultPlcSubscriptionResponseItem struct {
+	code               model.PlcResponseCode
+	subscriptionHandle model.PlcSubscriptionHandle
+}
+
+func NewSubscriptionResponseItem(code model.PlcResponseCode, subscriptionHandle model.PlcSubscriptionHandle) *DefaultPlcSubscriptionResponseItem {
+	return &DefaultPlcSubscriptionResponseItem{
+		code:               code,
+		subscriptionHandle: subscriptionHandle,
+	}
+}
+
+func (r *DefaultPlcSubscriptionResponseItem) GetCode() model.PlcResponseCode {
+	return r.code
+}
+
+func (r *DefaultPlcSubscriptionResponseItem) GetSubscriptionHandle() model.PlcSubscriptionHandle {
+	return r.subscriptionHandle
+}
+
+func (d *DefaultPlcSubscriptionResponseItem) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcSubscriptionResponseItem) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcSubscriptionResponseItem"); err != nil {
+		return err
+	}
+
+	{
+		stringValue := fmt.Sprintf("%v", d.code)
+		if err := writeBuffer.WriteString("code", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+			return err
+		}
+	}
+
+	if d.subscriptionHandle != nil {
+		if serializableField, ok := d.subscriptionHandle.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("subscriptionHandle"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("subscriptionHandle"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.subscriptionHandle)
+			if err := writeBuffer.WriteString("subscriptionHandle", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("PlcSubscriptionResponseItem"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcSubscriptionResponseItem) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcSubscriptionResponse_plc4xgen.go b/plc4go/spi/model/DefaultPlcSubscriptionResponse_plc4xgen.go
deleted file mode 100644
index 2f60f76d61..0000000000
--- a/plc4go/spi/model/DefaultPlcSubscriptionResponse_plc4xgen.go
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcSubscriptionResponse"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcSubscriptionResponse) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcSubscriptionResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcSubscriptionResponse"); err != nil {
-		return err
-	}
-	if err := d.DefaultResponse.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-
-	if d.request != nil {
-		if serializableField, ok := d.request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.values {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("PlcSubscriptionResponse"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcSubscriptionResponse) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcTagRequest.go b/plc4go/spi/model/DefaultPlcTagRequest.go
index d91e065fe6..3a7a4b713c 100644
--- a/plc4go/spi/model/DefaultPlcTagRequest.go
+++ b/plc4go/spi/model/DefaultPlcTagRequest.go
@@ -20,10 +20,14 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcTagRequest
 type DefaultPlcTagRequest struct {
 	tags     map[string]model.PlcTag
 	tagNames []string
@@ -47,3 +51,48 @@ func (d *DefaultPlcTagRequest) GetTag(name string) model.PlcTag {
 	}
 	return nil
 }
+
+func (d *DefaultPlcTagRequest) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcTagRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("tags"); err != nil {
+		return err
+	}
+	for name, elem := range d.tags {
+		var elem interface{} = elem
+		if serializable, ok := elem.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(name); err != nil {
+				return err
+			}
+			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(name); err != nil {
+				return err
+			}
+		} else {
+			elemAsString := fmt.Sprintf("%v", elem)
+			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("tags"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcTagRequest) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcTagRequest_plc4xgen.go b/plc4go/spi/model/DefaultPlcTagRequest_plc4xgen.go
deleted file mode 100644
index 0bce50167e..0000000000
--- a/plc4go/spi/model/DefaultPlcTagRequest_plc4xgen.go
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcTagRequest"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcTagRequest) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcTagRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcTagRequest"); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tags {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for _, elem := range d.tagNames {
-		if err := writeBuffer.WriteString("", uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("PlcTagRequest"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcTagRequest) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcUnsubscriptionRequestResult.go b/plc4go/spi/model/DefaultPlcUnsubscriptionRequestResult.go
index 41d6c7df0f..9dd5b91377 100644
--- a/plc4go/spi/model/DefaultPlcUnsubscriptionRequestResult.go
+++ b/plc4go/spi/model/DefaultPlcUnsubscriptionRequestResult.go
@@ -19,9 +19,15 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcUnsubscriptionRequestResult
 type DefaultPlcUnsubscriptionRequestResult struct {
 	Request  model.PlcUnsubscriptionRequest
 	Response model.PlcUnsubscriptionResponse
@@ -39,3 +45,73 @@ func (d *DefaultPlcUnsubscriptionRequestResult) GetResponse() model.PlcUnsubscri
 func (d *DefaultPlcUnsubscriptionRequestResult) GetErr() error {
 	return d.Err
 }
+
+func (d *DefaultPlcUnsubscriptionRequestResult) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcUnsubscriptionRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcUnsubscriptionRequestResult"); err != nil {
+		return err
+	}
+
+	if d.Request != nil {
+		if serializableField, ok := d.Request.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("request"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("request"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Response != nil {
+		if serializableField, ok := d.Response.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("response"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("response"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Response)
+			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Err != nil {
+		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("PlcUnsubscriptionRequestResult"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcUnsubscriptionRequestResult) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcUnsubscriptionRequestResult_plc4xgen.go b/plc4go/spi/model/DefaultPlcUnsubscriptionRequestResult_plc4xgen.go
deleted file mode 100644
index 2b5237bae3..0000000000
--- a/plc4go/spi/model/DefaultPlcUnsubscriptionRequestResult_plc4xgen.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcUnsubscriptionRequestResult"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcUnsubscriptionRequestResult) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcUnsubscriptionRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcUnsubscriptionRequestResult"); err != nil {
-		return err
-	}
-
-	if d.Request != nil {
-		if serializableField, ok := d.Request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Response != nil {
-		if serializableField, ok := d.Response.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("response"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("response"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Response)
-			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Err != nil {
-		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("PlcUnsubscriptionRequestResult"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcUnsubscriptionRequestResult) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcWriteRequest.go b/plc4go/spi/model/DefaultPlcWriteRequest.go
index af5a2108d9..3547da5e97 100644
--- a/plc4go/spi/model/DefaultPlcWriteRequest.go
+++ b/plc4go/spi/model/DefaultPlcWriteRequest.go
@@ -21,16 +21,18 @@ package model
 
 import (
 	"context"
+	"encoding/binary"
+	"fmt"
 	"time"
 
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
 	"github.com/apache/plc4x/plc4go/pkg/api/values"
 	"github.com/apache/plc4x/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/spi/interceptors"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 	"github.com/pkg/errors"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcWriteRequestBuilder
 type DefaultPlcWriteRequestBuilder struct {
 	writer                  spi.PlcWriter
 	tagHandler              spi.PlcTagHandler
@@ -115,7 +117,6 @@ func (m *DefaultPlcWriteRequestBuilder) Build() (model.PlcWriteRequest, error) {
 	return NewDefaultPlcWriteRequest(m.tags, m.tagNames, plcValues, m.writer, m.writeRequestInterceptor), nil
 }
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcWriteRequest
 type DefaultPlcWriteRequest struct {
 	DefaultPlcTagRequest
 	values                  map[string]values.PlcValue
@@ -187,3 +188,96 @@ func (d *DefaultPlcWriteRequest) GetWriteRequestInterceptor() interceptors.Write
 func (d *DefaultPlcWriteRequest) GetValue(name string) values.PlcValue {
 	return d.values[name]
 }
+
+func (d *DefaultPlcWriteRequest) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcWriteRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcWriteRequest"); err != nil {
+		return err
+	}
+	if err := d.DefaultPlcTagRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+		return err
+	}
+	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.values {
+
+		var elem interface{} = elem
+		if serializable, ok := elem.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(name); err != nil {
+				return err
+			}
+			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(name); err != nil {
+				return err
+			}
+		} else {
+			elemAsString := fmt.Sprintf("%v", elem)
+			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+
+	if d.writer != nil {
+		if serializableField, ok := d.writer.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("writer"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("writer"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.writer)
+			if err := writeBuffer.WriteString("writer", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.writeRequestInterceptor != nil {
+		if serializableField, ok := d.writeRequestInterceptor.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("writeRequestInterceptor"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("writeRequestInterceptor"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.writeRequestInterceptor)
+			if err := writeBuffer.WriteString("writeRequestInterceptor", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("PlcWriteRequest"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcWriteRequest) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcWriteRequestBuilder_plc4xgen.go b/plc4go/spi/model/DefaultPlcWriteRequestBuilder_plc4xgen.go
deleted file mode 100644
index 841afc30a3..0000000000
--- a/plc4go/spi/model/DefaultPlcWriteRequestBuilder_plc4xgen.go
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcWriteRequestBuilder"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcWriteRequestBuilder) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcWriteRequestBuilder) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcWriteRequestBuilder"); err != nil {
-		return err
-	}
-
-	if d.writer != nil {
-		if serializableField, ok := d.writer.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("writer"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("writer"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.writer)
-			if err := writeBuffer.WriteString("writer", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.tagHandler != nil {
-		if serializableField, ok := d.tagHandler.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("tagHandler"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("tagHandler"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.tagHandler)
-			if err := writeBuffer.WriteString("tagHandler", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.valueHandler != nil {
-		if serializableField, ok := d.valueHandler.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("valueHandler"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("valueHandler"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.valueHandler)
-			if err := writeBuffer.WriteString("valueHandler", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PushContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for _, elem := range d.tagNames {
-		if err := writeBuffer.WriteString("", uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("tagNames", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tagAddresses", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tagAddresses {
-
-		if err := writeBuffer.WriteString(name, uint32(len(elem)*8), "UTF-8", elem); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("tagAddresses", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.tags {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("tags", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.values {
-		_value := fmt.Sprintf("%v", elem)
-
-		if err := writeBuffer.WriteString(name, uint32(len(_value)*8), "UTF-8", _value); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-
-	if d.writeRequestInterceptor != nil {
-		if serializableField, ok := d.writeRequestInterceptor.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("writeRequestInterceptor"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("writeRequestInterceptor"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.writeRequestInterceptor)
-			if err := writeBuffer.WriteString("writeRequestInterceptor", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("PlcWriteRequestBuilder"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcWriteRequestBuilder) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcWriteRequestResult.go b/plc4go/spi/model/DefaultPlcWriteRequestResult.go
index 442d6b6513..6e4f17e2a6 100644
--- a/plc4go/spi/model/DefaultPlcWriteRequestResult.go
+++ b/plc4go/spi/model/DefaultPlcWriteRequestResult.go
@@ -19,9 +19,15 @@
 
 package model
 
-import "github.com/apache/plc4x/plc4go/pkg/api/model"
+import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
+	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+)
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcWriteRequestResult
 type DefaultPlcWriteRequestResult struct {
 	Request  model.PlcWriteRequest
 	Response model.PlcWriteResponse
@@ -39,3 +45,73 @@ func (d *DefaultPlcWriteRequestResult) GetResponse() model.PlcWriteResponse {
 func (d *DefaultPlcWriteRequestResult) GetErr() error {
 	return d.Err
 }
+
+func (d *DefaultPlcWriteRequestResult) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcWriteRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcWriteRequestResult"); err != nil {
+		return err
+	}
+
+	if d.Request != nil {
+		if serializableField, ok := d.Request.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("request"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("request"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Response != nil {
+		if serializableField, ok := d.Response.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext("response"); err != nil {
+				return err
+			}
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext("response"); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.Response)
+			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+
+	if d.Err != nil {
+		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
+			return err
+		}
+	}
+	if err := writeBuffer.PopContext("PlcWriteRequestResult"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcWriteRequestResult) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultPlcWriteRequestResult_plc4xgen.go b/plc4go/spi/model/DefaultPlcWriteRequestResult_plc4xgen.go
deleted file mode 100644
index 66cc2337c7..0000000000
--- a/plc4go/spi/model/DefaultPlcWriteRequestResult_plc4xgen.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcWriteRequestResult"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcWriteRequestResult) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcWriteRequestResult) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcWriteRequestResult"); err != nil {
-		return err
-	}
-
-	if d.Request != nil {
-		if serializableField, ok := d.Request.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("request"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("request"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Request)
-			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Response != nil {
-		if serializableField, ok := d.Response.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("response"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("response"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.Response)
-			if err := writeBuffer.WriteString("response", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.Err != nil {
-		if err := writeBuffer.WriteString("err", uint32(len(d.Err.Error())*8), "UTF-8", d.Err.Error()); err != nil {
-			return err
-		}
-	}
-	if err := writeBuffer.PopContext("PlcWriteRequestResult"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcWriteRequestResult) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcWriteRequest_plc4xgen.go b/plc4go/spi/model/DefaultPlcWriteRequest_plc4xgen.go
deleted file mode 100644
index 36c8ef1a7f..0000000000
--- a/plc4go/spi/model/DefaultPlcWriteRequest_plc4xgen.go
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultPlcWriteRequest"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultPlcWriteRequest) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultPlcWriteRequest) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("PlcWriteRequest"); err != nil {
-		return err
-	}
-	if err := d.DefaultPlcTagRequest.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.values {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("values", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-
-	if d.writer != nil {
-		if serializableField, ok := d.writer.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("writer"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("writer"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.writer)
-			if err := writeBuffer.WriteString("writer", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-
-	if d.writeRequestInterceptor != nil {
-		if serializableField, ok := d.writeRequestInterceptor.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext("writeRequestInterceptor"); err != nil {
-				return err
-			}
-			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext("writeRequestInterceptor"); err != nil {
-				return err
-			}
-		} else {
-			stringValue := fmt.Sprintf("%v", d.writeRequestInterceptor)
-			if err := writeBuffer.WriteString("writeRequestInterceptor", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("PlcWriteRequest"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultPlcWriteRequest) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/model/DefaultPlcWriteResponse.go b/plc4go/spi/model/DefaultPlcWriteResponse.go
index af331339a6..2c53cabe2f 100644
--- a/plc4go/spi/model/DefaultPlcWriteResponse.go
+++ b/plc4go/spi/model/DefaultPlcWriteResponse.go
@@ -20,19 +20,24 @@
 package model
 
 import (
+	"context"
+	"encoding/binary"
+	"fmt"
+
 	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultPlcWriteResponse
 type DefaultPlcWriteResponse struct {
 	DefaultResponse
-	request model.PlcWriteRequest
+	request       model.PlcWriteRequest
+	responseCodes map[string]model.PlcResponseCode
 }
 
 func NewDefaultPlcWriteResponse(request model.PlcWriteRequest, responseCodes map[string]model.PlcResponseCode) model.PlcWriteResponse {
 	return &DefaultPlcWriteResponse{
-		DefaultResponse: NewDefaultResponse(responseCodes),
-		request:         request,
+		request:       request,
+		responseCodes: responseCodes,
 	}
 }
 
@@ -50,3 +55,75 @@ func (m *DefaultPlcWriteResponse) GetTagNames() []string {
 func (m *DefaultPlcWriteResponse) GetRequest() model.PlcWriteRequest {
 	return m.request
 }
+
+func (m *DefaultPlcWriteResponse) GetResponseCode(name string) model.PlcResponseCode {
+	return m.responseCodes[name]
+}
+
+func (d *DefaultPlcWriteResponse) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultPlcWriteResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcWriteResponse"); err != nil {
+		return err
+	}
+	if err := d.DefaultResponse.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+		return err
+	}
+
+	if d.request != nil {
+		if serializableField, ok := d.request.(utils.Serializable); ok {
+			if err := serializableField.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+		} else {
+			stringValue := fmt.Sprintf("%v", d.request)
+			if err := writeBuffer.WriteString("request", uint32(len(stringValue)*8), "UTF-8", stringValue); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PushContext("responseCodes", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	for name, elem := range d.responseCodes {
+
+		var elem interface{} = elem
+		if serializable, ok := elem.(utils.Serializable); ok {
+			if err := writeBuffer.PushContext(name); err != nil {
+				return err
+			}
+			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+				return err
+			}
+			if err := writeBuffer.PopContext(name); err != nil {
+				return err
+			}
+		} else {
+			elemAsString := fmt.Sprintf("%v", elem)
+			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
+				return err
+			}
+		}
+	}
+	if err := writeBuffer.PopContext("responseCodes", utils.WithRenderAsList(true)); err != nil {
+		return err
+	}
+	if err := writeBuffer.PopContext("PlcWriteResponse"); err != nil {
+		return err
+	}
+	return nil
+}
+
+func (d *DefaultPlcWriteResponse) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/spi/model/DefaultResponse.go b/plc4go/spi/model/DefaultResponse.go
index aee5984d94..3ecdf43745 100644
--- a/plc4go/spi/model/DefaultResponse.go
+++ b/plc4go/spi/model/DefaultResponse.go
@@ -20,22 +20,39 @@
 package model
 
 import (
-	"github.com/apache/plc4x/plc4go/pkg/api/model"
+	"context"
+	"encoding/binary"
+
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
-//go:generate go run ../../tools/plc4xgenerator/gen.go -type=DefaultResponse
 type DefaultResponse struct {
-	responseCodes map[string]model.PlcResponseCode
 }
 
 func (d *DefaultResponse) IsAPlcMessage() bool {
 	return true
 }
 
-func (d *DefaultResponse) GetResponseCode(name string) model.PlcResponseCode {
-	return d.responseCodes[name]
+func NewDefaultResponse() DefaultResponse {
+	return DefaultResponse{}
+}
+
+func (d *DefaultResponse) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (d *DefaultResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	return nil
 }
 
-func NewDefaultResponse(responseCodes map[string]model.PlcResponseCode) DefaultResponse {
-	return DefaultResponse{responseCodes}
+func (d *DefaultResponse) String() string {
+	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
 }
diff --git a/plc4go/spi/model/DefaultResponse_plc4xgen.go b/plc4go/spi/model/DefaultResponse_plc4xgen.go
deleted file mode 100644
index 5d05563492..0000000000
--- a/plc4go/spi/model/DefaultResponse_plc4xgen.go
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// Code generated by "plc4xgenerator -type=DefaultResponse"; DO NOT EDIT.
-
-package model
-
-import (
-	"context"
-	"encoding/binary"
-	"fmt"
-	"github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-var _ = fmt.Printf
-
-func (d *DefaultResponse) Serialize() ([]byte, error) {
-	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
-	if err := d.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
-		return nil, err
-	}
-	return wb.GetBytes(), nil
-}
-
-func (d *DefaultResponse) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
-	if err := writeBuffer.PushContext("Response"); err != nil {
-		return err
-	}
-	if err := writeBuffer.PushContext("responseCodes", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	for name, elem := range d.responseCodes {
-
-		var elem interface{} = elem
-		if serializable, ok := elem.(utils.Serializable); ok {
-			if err := writeBuffer.PushContext(name); err != nil {
-				return err
-			}
-			if err := serializable.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-				return err
-			}
-			if err := writeBuffer.PopContext(name); err != nil {
-				return err
-			}
-		} else {
-			elemAsString := fmt.Sprintf("%v", elem)
-			if err := writeBuffer.WriteString(name, uint32(len(elemAsString)*8), "UTF-8", elemAsString); err != nil {
-				return err
-			}
-		}
-	}
-	if err := writeBuffer.PopContext("responseCodes", utils.WithRenderAsList(true)); err != nil {
-		return err
-	}
-	if err := writeBuffer.PopContext("Response"); err != nil {
-		return err
-	}
-	return nil
-}
-
-func (d *DefaultResponse) String() string {
-	writeBuffer := utils.NewWriteBufferBoxBasedWithOptions(true, true)
-	if err := writeBuffer.WriteSerializable(context.Background(), d); err != nil {
-		return err.Error()
-	}
-	return writeBuffer.GetBox().String()
-}
diff --git a/plc4go/spi/utils/WriteBufferXmlBased.go b/plc4go/spi/utils/WriteBufferXmlBased.go
index a56d0f6ad9..887f8ef031 100644
--- a/plc4go/spi/utils/WriteBufferXmlBased.go
+++ b/plc4go/spi/utils/WriteBufferXmlBased.go
@@ -161,12 +161,12 @@ func (x *xmlWriteBuffer) WriteBigInt(logicalName string, bitLength uint8, value
 
 func (x *xmlWriteBuffer) WriteFloat32(logicalName string, bitLength uint8, value float32, writerArgs ...WithWriterArgs) error {
 	x.move(uint(bitLength))
-	return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
+	return x.encodeElement(logicalName, fmt.Sprintf("%16.16f", value), x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
 }
 
 func (x *xmlWriteBuffer) WriteFloat64(logicalName string, bitLength uint8, value float64, writerArgs ...WithWriterArgs) error {
 	x.move(uint(bitLength))
-	return x.encodeElement(logicalName, value, x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
+	return x.encodeElement(logicalName, fmt.Sprintf("%32.32f", value), x.generateAttr(rwFloatKey, uint(bitLength), writerArgs...), writerArgs...)
 }
 
 func (x *xmlWriteBuffer) WriteBigFloat(logicalName string, bitLength uint8, value *big.Float, writerArgs ...WithWriterArgs) error {
diff --git a/plc4go/spi/values/PlcNull.go b/plc4go/spi/values/PlcNull.go
index b5d5abe2ea..cb74a3896f 100644
--- a/plc4go/spi/values/PlcNull.go
+++ b/plc4go/spi/values/PlcNull.go
@@ -20,9 +20,12 @@
 package values
 
 import (
+	"context"
+	"encoding/binary"
 	"fmt"
 
 	apiValues "github.com/apache/plc4x/plc4go/pkg/api/values"
+	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
 type PlcNull struct {
@@ -41,6 +44,21 @@ func (m PlcNull) GetPlcValueType() apiValues.PlcValueType {
 	return apiValues.NULL
 }
 
+func (m PlcNull) Serialize() ([]byte, error) {
+	wb := utils.NewWriteBufferByteBased(utils.WithByteOrderForByteBasedBuffer(binary.BigEndian))
+	if err := m.SerializeWithWriteBuffer(context.Background(), wb); err != nil {
+		return nil, err
+	}
+	return wb.GetBytes(), nil
+}
+
+func (m PlcNull) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils.WriteBuffer) error {
+	if err := writeBuffer.PushContext("PlcNULL"); err != nil {
+		return err
+	}
+	return writeBuffer.PopContext("PlcNULL")
+}
+
 func (m PlcNull) String() string {
 	return fmt.Sprintf("%s", m.GetPlcValueType())
 }
diff --git a/plc4go/spi/values/PlcValueAdapter.go b/plc4go/spi/values/PlcValueAdapter.go
index 828e9f79fa..bfce0e8995 100644
--- a/plc4go/spi/values/PlcValueAdapter.go
+++ b/plc4go/spi/values/PlcValueAdapter.go
@@ -21,11 +21,14 @@ package values
 
 import (
 	apiValues "github.com/apache/plc4x/plc4go/pkg/api/values"
+	"github.com/apache/plc4x/plc4go/spi/utils"
+
 	"time"
 )
 
 // PlcValueAdapter Dummy structure
 type PlcValueAdapter struct {
+	utils.Serializable
 }
 
 ////////
diff --git a/plc4j/drivers/eip/pom.xml b/plc4j/drivers/eip/pom.xml
index 1e13a17dde..e0ce0db0d2 100644
--- a/plc4j/drivers/eip/pom.xml
+++ b/plc4j/drivers/eip/pom.xml
@@ -47,6 +47,7 @@
               <protocolName>eip</protocolName>
               <languageName>java</languageName>
               <outputFlavor>read-write</outputFlavor>
+              <outputDir>src/main/generated</outputDir>
             </configuration>
           </execution>
         </executions>
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
new file mode 100644
index 0000000000..ca5b95d13b
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPDataTypeCode.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum CIPDataTypeCode {
+  BOOL((int) 0X00C1, (short) 1),
+  SINT((int) 0X00C2, (short) 1),
+  INT((int) 0X00C3, (short) 2),
+  DINT((int) 0X00C4, (short) 4),
+  LINT((int) 0X00C5, (short) 8),
+  REAL((int) 0X00CA, (short) 4),
+  DWORD((int) 0X00D3, (short) 4),
+  Struct((int) 0X02A0, (short) 88),
+  STRING((int) 0X02A0, (short) 88);
+  private static final Map<Integer, CIPDataTypeCode> map;
+
+  static {
+    map = new HashMap<>();
+    for (CIPDataTypeCode value : CIPDataTypeCode.values()) {
+      map.put((int) value.getValue(), value);
+    }
+  }
+
+  private int value;
+  private short size;
+
+  CIPDataTypeCode(int value, short size) {
+    this.value = value;
+    this.size = size;
+  }
+
+  public int getValue() {
+    return value;
+  }
+
+  public short getSize() {
+    return size;
+  }
+
+  public static CIPDataTypeCode firstEnumForFieldSize(short fieldValue) {
+    for (CIPDataTypeCode _val : CIPDataTypeCode.values()) {
+      if (_val.getSize() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<CIPDataTypeCode> enumsForFieldSize(short fieldValue) {
+    List<CIPDataTypeCode> _values = new ArrayList();
+    for (CIPDataTypeCode _val : CIPDataTypeCode.values()) {
+      if (_val.getSize() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public static CIPDataTypeCode enumForValue(int value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(int value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPStructTypeCode.java
similarity index 56%
copy from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
copy to plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPStructTypeCode.java
index 143b3cca35..2b0d234e90 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CIPStructTypeCode.java
@@ -18,12 +18,37 @@
  */
 package org.apache.plc4x.java.eip.readwrite;
 
-import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
+import java.util.HashMap;
+import java.util.Map;
 
-public class EIPDriverTestsuite extends DriverTestsuiteRunner {
+// Code generated by code-generation. DO NOT EDIT.
 
-    public EIPDriverTestsuite() {
-        super("/protocols/eip/DriverTestsuite.xml");
+public enum CIPStructTypeCode {
+  STRING((int) 0x0FCE);
+  private static final Map<Integer, CIPStructTypeCode> map;
+
+  static {
+    map = new HashMap<>();
+    for (CIPStructTypeCode value : CIPStructTypeCode.values()) {
+      map.put((int) value.getValue(), value);
     }
+  }
+
+  private int value;
+
+  CIPStructTypeCode(int value) {
+    this.value = value;
+  }
+
+  public int getValue() {
+    return value;
+  }
+
+  public static CIPStructTypeCode enumForValue(int value) {
+    return map.get(value);
+  }
 
+  public static Boolean isDefined(int value) {
+    return map.containsKey(value);
+  }
 }
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipExchange.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipExchange.java
new file mode 100644
index 0000000000..f8a2480ee5
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipExchange.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CipExchange implements Message {
+
+  // Constant values.
+  public static final Integer ITEMCOUNT = 0x02;
+  public static final Long NULLPTR = 0x0L;
+  public static final Integer UNCONNECTEDDATA = 0x00B2;
+
+  // Properties.
+  protected final CipService service;
+
+  public CipExchange(CipService service) {
+    super();
+    this.service = service;
+  }
+
+  public CipService getService() {
+    return service;
+  }
+
+  public int getItemCount() {
+    return ITEMCOUNT;
+  }
+
+  public long getNullPtr() {
+    return NULLPTR;
+  }
+
+  public int getUnconnectedData() {
+    return UNCONNECTEDDATA;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipExchange");
+
+    // Const Field (itemCount)
+    writeConstField("itemCount", ITEMCOUNT, writeUnsignedInt(writeBuffer, 16));
+
+    // Const Field (nullPtr)
+    writeConstField("nullPtr", NULLPTR, writeUnsignedLong(writeBuffer, 32));
+
+    // Const Field (unconnectedData)
+    writeConstField("unconnectedData", UNCONNECTEDDATA, writeUnsignedInt(writeBuffer, 16));
+
+    // Implicit Field (size) (Used for parsing, but its value is not stored as it's implicitly given
+    // by the objects content)
+    int size = (int) (((getLengthInBytes()) - (8)) - (2));
+    writeImplicitField("size", size, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (service)
+    writeSimpleField("service", service, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("CipExchange");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    CipExchange _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (itemCount)
+    lengthInBits += 16;
+
+    // Const Field (nullPtr)
+    lengthInBits += 32;
+
+    // Const Field (unconnectedData)
+    lengthInBits += 16;
+
+    // Implicit Field (size)
+    lengthInBits += 16;
+
+    // Simple field (service)
+    lengthInBits += service.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static CipExchange staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    if ((args == null) || (args.length != 1)) {
+      throw new PlcRuntimeException(
+          "Wrong number of arguments, expected 1, but got " + args.length);
+    }
+    Integer exchangeLen;
+    if (args[0] instanceof Integer) {
+      exchangeLen = (Integer) args[0];
+    } else if (args[0] instanceof String) {
+      exchangeLen = Integer.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type Integer or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, exchangeLen);
+  }
+
+  public static CipExchange staticParse(ReadBuffer readBuffer, Integer exchangeLen)
+      throws ParseException {
+    readBuffer.pullContext("CipExchange");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int itemCount =
+        readConstField("itemCount", readUnsignedInt(readBuffer, 16), CipExchange.ITEMCOUNT);
+
+    long nullPtr = readConstField("nullPtr", readUnsignedLong(readBuffer, 32), CipExchange.NULLPTR);
+
+    int unconnectedData =
+        readConstField(
+            "unconnectedData", readUnsignedInt(readBuffer, 16), CipExchange.UNCONNECTEDDATA);
+
+    int size = readImplicitField("size", readUnsignedInt(readBuffer, 16));
+
+    CipService service =
+        readSimpleField(
+            "service",
+            new DataReaderComplexDefault<>(
+                () -> CipService.staticParse(readBuffer, (int) ((exchangeLen) - (10))),
+                readBuffer));
+
+    readBuffer.closeContext("CipExchange");
+    // Create the instance
+    CipExchange _cipExchange;
+    _cipExchange = new CipExchange(service);
+    return _cipExchange;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipExchange)) {
+      return false;
+    }
+    CipExchange that = (CipExchange) o;
+    return (getService() == that.getService()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getService());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipRRData.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipRRData.java
new file mode 100644
index 0000000000..4e99f6cbdc
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipRRData.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CipRRData extends EipPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getCommand() {
+    return (int) 0x006F;
+  }
+
+  // Properties.
+  protected final CipExchange exchange;
+
+  public CipRRData(
+      long sessionHandle,
+      long status,
+      List<Short> senderContext,
+      long options,
+      CipExchange exchange) {
+    super(sessionHandle, status, senderContext, options);
+    this.exchange = exchange;
+  }
+
+  public CipExchange getExchange() {
+    return exchange;
+  }
+
+  @Override
+  protected void serializeEipPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipRRData");
+
+    // Reserved Field (reserved)
+    writeReservedField(
+        "reserved",
+        (long) 0x00000000,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Reserved Field (reserved)
+    writeReservedField(
+        "reserved",
+        (int) 0x0000,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Simple Field (exchange)
+    writeSimpleField(
+        "exchange",
+        exchange,
+        new DataWriterComplexDefault<>(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    writeBuffer.popContext("CipRRData");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CipRRData _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 32;
+
+    // Reserved Field (reserved)
+    lengthInBits += 16;
+
+    // Simple field (exchange)
+    lengthInBits += exchange.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static EipPacketBuilder staticParseEipPacketBuilder(
+      ReadBuffer readBuffer, Integer packetLength) throws ParseException {
+    readBuffer.pullContext("CipRRData");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Long reservedField0 =
+        readReservedField(
+            "reserved",
+            readUnsignedLong(readBuffer, 32),
+            (long) 0x00000000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    Integer reservedField1 =
+        readReservedField(
+            "reserved",
+            readUnsignedInt(readBuffer, 16),
+            (int) 0x0000,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    CipExchange exchange =
+        readSimpleField(
+            "exchange",
+            new DataReaderComplexDefault<>(
+                () -> CipExchange.staticParse(readBuffer, (int) ((packetLength) - (6))),
+                readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    readBuffer.closeContext("CipRRData");
+    // Create the instance
+    return new CipRRDataBuilderImpl(exchange);
+  }
+
+  public static class CipRRDataBuilderImpl implements EipPacket.EipPacketBuilder {
+    private final CipExchange exchange;
+
+    public CipRRDataBuilderImpl(CipExchange exchange) {
+      this.exchange = exchange;
+    }
+
+    public CipRRData build(
+        long sessionHandle, long status, List<Short> senderContext, long options) {
+      CipRRData cipRRData = new CipRRData(sessionHandle, status, senderContext, options, exchange);
+      return cipRRData;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipRRData)) {
+      return false;
+    }
+    CipRRData that = (CipRRData) o;
+    return (getExchange() == that.getExchange()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getExchange());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipReadRequest.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipReadRequest.java
new file mode 100644
index 0000000000..3d5c349aec
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipReadRequest.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CipReadRequest extends CipService implements Message {
+
+  // Accessors for discriminator values.
+  public Short getService() {
+    return (short) 0x4C;
+  }
+
+  // Properties.
+  protected final byte requestPathSize;
+  protected final byte[] tag;
+  protected final int elementNb;
+
+  public CipReadRequest(byte requestPathSize, byte[] tag, int elementNb) {
+    super();
+    this.requestPathSize = requestPathSize;
+    this.tag = tag;
+    this.elementNb = elementNb;
+  }
+
+  public byte getRequestPathSize() {
+    return requestPathSize;
+  }
+
+  public byte[] getTag() {
+    return tag;
+  }
+
+  public int getElementNb() {
+    return elementNb;
+  }
+
+  @Override
+  protected void serializeCipServiceChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipReadRequest");
+
+    // Simple Field (requestPathSize)
+    writeSimpleField("requestPathSize", requestPathSize, writeSignedByte(writeBuffer, 8));
+
+    // Array Field (tag)
+    writeByteArrayField("tag", tag, writeByteArray(writeBuffer, 8));
+
+    // Simple Field (elementNb)
+    writeSimpleField("elementNb", elementNb, writeUnsignedInt(writeBuffer, 16));
+
+    writeBuffer.popContext("CipReadRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CipReadRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (requestPathSize)
+    lengthInBits += 8;
+
+    // Array field
+    if (tag != null) {
+      lengthInBits += 8 * tag.length;
+    }
+
+    // Simple field (elementNb)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static CipServiceBuilder staticParseCipServiceBuilder(
+      ReadBuffer readBuffer, Integer serviceLen) throws ParseException {
+    readBuffer.pullContext("CipReadRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte requestPathSize = readSimpleField("requestPathSize", readSignedByte(readBuffer, 8));
+
+    byte[] tag = readBuffer.readByteArray("tag", Math.toIntExact(((requestPathSize) * (2))));
+
+    int elementNb = readSimpleField("elementNb", readUnsignedInt(readBuffer, 16));
+
+    readBuffer.closeContext("CipReadRequest");
+    // Create the instance
+    return new CipReadRequestBuilderImpl(requestPathSize, tag, elementNb);
+  }
+
+  public static class CipReadRequestBuilderImpl implements CipService.CipServiceBuilder {
+    private final byte requestPathSize;
+    private final byte[] tag;
+    private final int elementNb;
+
+    public CipReadRequestBuilderImpl(byte requestPathSize, byte[] tag, int elementNb) {
+      this.requestPathSize = requestPathSize;
+      this.tag = tag;
+      this.elementNb = elementNb;
+    }
+
+    public CipReadRequest build() {
+      CipReadRequest cipReadRequest = new CipReadRequest(requestPathSize, tag, elementNb);
+      return cipReadRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipReadRequest)) {
+      return false;
+    }
+    CipReadRequest that = (CipReadRequest) o;
+    return (getRequestPathSize() == that.getRequestPathSize())
+        && (getTag() == that.getTag())
+        && (getElementNb() == that.getElementNb())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getRequestPathSize(), getTag(), getElementNb());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipReadResponse.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipReadResponse.java
new file mode 100644
index 0000000000..c3e2821dc7
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipReadResponse.java
@@ -0,0 +1,217 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CipReadResponse extends CipService implements Message {
+
+  // Accessors for discriminator values.
+  public Short getService() {
+    return (short) 0xCC;
+  }
+
+  // Properties.
+  protected final short status;
+  protected final short extStatus;
+  protected final CIPDataTypeCode dataType;
+  protected final byte[] data;
+
+  public CipReadResponse(short status, short extStatus, CIPDataTypeCode dataType, byte[] data) {
+    super();
+    this.status = status;
+    this.extStatus = extStatus;
+    this.dataType = dataType;
+    this.data = data;
+  }
+
+  public short getStatus() {
+    return status;
+  }
+
+  public short getExtStatus() {
+    return extStatus;
+  }
+
+  public CIPDataTypeCode getDataType() {
+    return dataType;
+  }
+
+  public byte[] getData() {
+    return data;
+  }
+
+  @Override
+  protected void serializeCipServiceChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipReadResponse");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (status)
+    writeSimpleField("status", status, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (extStatus)
+    writeSimpleField("extStatus", extStatus, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (dataType)
+    writeSimpleEnumField(
+        "dataType",
+        "CIPDataTypeCode",
+        dataType,
+        new DataWriterEnumDefault<>(
+            CIPDataTypeCode::getValue, CIPDataTypeCode::name, writeUnsignedInt(writeBuffer, 16)));
+
+    // Array Field (data)
+    writeByteArrayField("data", data, writeByteArray(writeBuffer, 8));
+
+    writeBuffer.popContext("CipReadResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CipReadResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Simple field (status)
+    lengthInBits += 8;
+
+    // Simple field (extStatus)
+    lengthInBits += 8;
+
+    // Simple field (dataType)
+    lengthInBits += 16;
+
+    // Array field
+    if (data != null) {
+      lengthInBits += 8 * data.length;
+    }
+
+    return lengthInBits;
+  }
+
+  public static CipServiceBuilder staticParseCipServiceBuilder(
+      ReadBuffer readBuffer, Integer serviceLen) throws ParseException {
+    readBuffer.pullContext("CipReadResponse");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    short status = readSimpleField("status", readUnsignedShort(readBuffer, 8));
+
+    short extStatus = readSimpleField("extStatus", readUnsignedShort(readBuffer, 8));
+
+    CIPDataTypeCode dataType =
+        readEnumField(
+            "dataType",
+            "CIPDataTypeCode",
+            new DataReaderEnumDefault<>(
+                CIPDataTypeCode::enumForValue, readUnsignedInt(readBuffer, 16)));
+
+    byte[] data = readBuffer.readByteArray("data", Math.toIntExact((serviceLen) - (6)));
+
+    readBuffer.closeContext("CipReadResponse");
+    // Create the instance
+    return new CipReadResponseBuilderImpl(status, extStatus, dataType, data);
+  }
+
+  public static class CipReadResponseBuilderImpl implements CipService.CipServiceBuilder {
+    private final short status;
+    private final short extStatus;
+    private final CIPDataTypeCode dataType;
+    private final byte[] data;
+
+    public CipReadResponseBuilderImpl(
+        short status, short extStatus, CIPDataTypeCode dataType, byte[] data) {
+      this.status = status;
+      this.extStatus = extStatus;
+      this.dataType = dataType;
+      this.data = data;
+    }
+
+    public CipReadResponse build() {
+      CipReadResponse cipReadResponse = new CipReadResponse(status, extStatus, dataType, data);
+      return cipReadResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipReadResponse)) {
+      return false;
+    }
+    CipReadResponse that = (CipReadResponse) o;
+    return (getStatus() == that.getStatus())
+        && (getExtStatus() == that.getExtStatus())
+        && (getDataType() == that.getDataType())
+        && (getData() == that.getData())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getStatus(), getExtStatus(), getDataType(), getData());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipService.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipService.java
new file mode 100644
index 0000000000..e2cb697b53
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipService.java
@@ -0,0 +1,173 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public abstract class CipService implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getService();
+
+  public CipService() {
+    super();
+  }
+
+  protected abstract void serializeCipServiceChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipService");
+
+    // Discriminator Field (service) (Used as input to a switch field)
+    writeDiscriminatorField("service", getService(), writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeCipServiceChild(writeBuffer);
+
+    writeBuffer.popContext("CipService");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    CipService _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (service)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static CipService staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    if ((args == null) || (args.length != 1)) {
+      throw new PlcRuntimeException(
+          "Wrong number of arguments, expected 1, but got " + args.length);
+    }
+    Integer serviceLen;
+    if (args[0] instanceof Integer) {
+      serviceLen = (Integer) args[0];
+    } else if (args[0] instanceof String) {
+      serviceLen = Integer.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type Integer or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, serviceLen);
+  }
+
+  public static CipService staticParse(ReadBuffer readBuffer, Integer serviceLen)
+      throws ParseException {
+    readBuffer.pullContext("CipService");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short service = readDiscriminatorField("service", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    CipServiceBuilder builder = null;
+    if (EvaluationHelper.equals(service, (short) 0x4C)) {
+      builder = CipReadRequest.staticParseCipServiceBuilder(readBuffer, serviceLen);
+    } else if (EvaluationHelper.equals(service, (short) 0xCC)) {
+      builder = CipReadResponse.staticParseCipServiceBuilder(readBuffer, serviceLen);
+    } else if (EvaluationHelper.equals(service, (short) 0x4D)) {
+      builder = CipWriteRequest.staticParseCipServiceBuilder(readBuffer, serviceLen);
+    } else if (EvaluationHelper.equals(service, (short) 0xCD)) {
+      builder = CipWriteResponse.staticParseCipServiceBuilder(readBuffer, serviceLen);
+    } else if (EvaluationHelper.equals(service, (short) 0x0A)) {
+      builder = MultipleServiceRequest.staticParseCipServiceBuilder(readBuffer, serviceLen);
+    } else if (EvaluationHelper.equals(service, (short) 0x8A)) {
+      builder = MultipleServiceResponse.staticParseCipServiceBuilder(readBuffer, serviceLen);
+    } else if (EvaluationHelper.equals(service, (short) 0x52)) {
+      builder = CipUnconnectedRequest.staticParseCipServiceBuilder(readBuffer, serviceLen);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type" + " parameters [" + "service=" + service + "]");
+    }
+
+    readBuffer.closeContext("CipService");
+    // Create the instance
+    CipService _cipService = builder.build();
+    return _cipService;
+  }
+
+  public interface CipServiceBuilder {
+    CipService build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipService)) {
+      return false;
+    }
+    CipService that = (CipService) o;
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash();
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipUnconnectedRequest.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipUnconnectedRequest.java
new file mode 100644
index 0000000000..cfeaf41e3c
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipUnconnectedRequest.java
@@ -0,0 +1,265 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CipUnconnectedRequest extends CipService implements Message {
+
+  // Accessors for discriminator values.
+  public Short getService() {
+    return (short) 0x52;
+  }
+
+  // Constant values.
+  public static final Integer ROUTE = 0x0001;
+
+  // Properties.
+  protected final CipService unconnectedService;
+  protected final byte backPlane;
+  protected final byte slot;
+
+  public CipUnconnectedRequest(CipService unconnectedService, byte backPlane, byte slot) {
+    super();
+    this.unconnectedService = unconnectedService;
+    this.backPlane = backPlane;
+    this.slot = slot;
+  }
+
+  public CipService getUnconnectedService() {
+    return unconnectedService;
+  }
+
+  public byte getBackPlane() {
+    return backPlane;
+  }
+
+  public byte getSlot() {
+    return slot;
+  }
+
+  public int getRoute() {
+    return ROUTE;
+  }
+
+  @Override
+  protected void serializeCipServiceChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipUnconnectedRequest");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x02, writeUnsignedShort(writeBuffer, 8));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x20, writeUnsignedShort(writeBuffer, 8));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x06, writeUnsignedShort(writeBuffer, 8));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x24, writeUnsignedShort(writeBuffer, 8));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x01, writeUnsignedShort(writeBuffer, 8));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (int) 0x9D05, writeUnsignedInt(writeBuffer, 16));
+
+    // Implicit Field (messageSize) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int messageSize = (int) (((getLengthInBytes()) - (10)) - (4));
+    writeImplicitField("messageSize", messageSize, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (unconnectedService)
+    writeSimpleField(
+        "unconnectedService", unconnectedService, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Const Field (route)
+    writeConstField("route", ROUTE, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (backPlane)
+    writeSimpleField("backPlane", backPlane, writeSignedByte(writeBuffer, 8));
+
+    // Simple Field (slot)
+    writeSimpleField("slot", slot, writeSignedByte(writeBuffer, 8));
+
+    writeBuffer.popContext("CipUnconnectedRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CipUnconnectedRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Reserved Field (reserved)
+    lengthInBits += 16;
+
+    // Implicit Field (messageSize)
+    lengthInBits += 16;
+
+    // Simple field (unconnectedService)
+    lengthInBits += unconnectedService.getLengthInBits();
+
+    // Const Field (route)
+    lengthInBits += 16;
+
+    // Simple field (backPlane)
+    lengthInBits += 8;
+
+    // Simple field (slot)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static CipServiceBuilder staticParseCipServiceBuilder(
+      ReadBuffer readBuffer, Integer serviceLen) throws ParseException {
+    readBuffer.pullContext("CipUnconnectedRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x02);
+
+    Short reservedField1 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x20);
+
+    Short reservedField2 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x06);
+
+    Short reservedField3 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x24);
+
+    Short reservedField4 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x01);
+
+    Integer reservedField5 =
+        readReservedField("reserved", readUnsignedInt(readBuffer, 16), (int) 0x9D05);
+
+    int messageSize = readImplicitField("messageSize", readUnsignedInt(readBuffer, 16));
+
+    CipService unconnectedService =
+        readSimpleField(
+            "unconnectedService",
+            new DataReaderComplexDefault<>(
+                () -> CipService.staticParse(readBuffer, (int) (messageSize)), readBuffer));
+
+    int route =
+        readConstField("route", readUnsignedInt(readBuffer, 16), CipUnconnectedRequest.ROUTE);
+
+    byte backPlane = readSimpleField("backPlane", readSignedByte(readBuffer, 8));
+
+    byte slot = readSimpleField("slot", readSignedByte(readBuffer, 8));
+
+    readBuffer.closeContext("CipUnconnectedRequest");
+    // Create the instance
+    return new CipUnconnectedRequestBuilderImpl(unconnectedService, backPlane, slot);
+  }
+
+  public static class CipUnconnectedRequestBuilderImpl implements CipService.CipServiceBuilder {
+    private final CipService unconnectedService;
+    private final byte backPlane;
+    private final byte slot;
+
+    public CipUnconnectedRequestBuilderImpl(
+        CipService unconnectedService, byte backPlane, byte slot) {
+      this.unconnectedService = unconnectedService;
+      this.backPlane = backPlane;
+      this.slot = slot;
+    }
+
+    public CipUnconnectedRequest build() {
+      CipUnconnectedRequest cipUnconnectedRequest =
+          new CipUnconnectedRequest(unconnectedService, backPlane, slot);
+      return cipUnconnectedRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipUnconnectedRequest)) {
+      return false;
+    }
+    CipUnconnectedRequest that = (CipUnconnectedRequest) o;
+    return (getUnconnectedService() == that.getUnconnectedService())
+        && (getBackPlane() == that.getBackPlane())
+        && (getSlot() == that.getSlot())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getUnconnectedService(), getBackPlane(), getSlot());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipWriteRequest.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipWriteRequest.java
new file mode 100644
index 0000000000..0726a38ec1
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipWriteRequest.java
@@ -0,0 +1,231 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CipWriteRequest extends CipService implements Message {
+
+  // Accessors for discriminator values.
+  public Short getService() {
+    return (short) 0x4D;
+  }
+
+  // Properties.
+  protected final byte requestPathSize;
+  protected final byte[] tag;
+  protected final CIPDataTypeCode dataType;
+  protected final int elementNb;
+  protected final byte[] data;
+
+  public CipWriteRequest(
+      byte requestPathSize, byte[] tag, CIPDataTypeCode dataType, int elementNb, byte[] data) {
+    super();
+    this.requestPathSize = requestPathSize;
+    this.tag = tag;
+    this.dataType = dataType;
+    this.elementNb = elementNb;
+    this.data = data;
+  }
+
+  public byte getRequestPathSize() {
+    return requestPathSize;
+  }
+
+  public byte[] getTag() {
+    return tag;
+  }
+
+  public CIPDataTypeCode getDataType() {
+    return dataType;
+  }
+
+  public int getElementNb() {
+    return elementNb;
+  }
+
+  public byte[] getData() {
+    return data;
+  }
+
+  @Override
+  protected void serializeCipServiceChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipWriteRequest");
+
+    // Simple Field (requestPathSize)
+    writeSimpleField("requestPathSize", requestPathSize, writeSignedByte(writeBuffer, 8));
+
+    // Array Field (tag)
+    writeByteArrayField("tag", tag, writeByteArray(writeBuffer, 8));
+
+    // Simple Field (dataType)
+    writeSimpleEnumField(
+        "dataType",
+        "CIPDataTypeCode",
+        dataType,
+        new DataWriterEnumDefault<>(
+            CIPDataTypeCode::getValue, CIPDataTypeCode::name, writeUnsignedInt(writeBuffer, 16)));
+
+    // Simple Field (elementNb)
+    writeSimpleField("elementNb", elementNb, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (data)
+    writeByteArrayField("data", data, writeByteArray(writeBuffer, 8));
+
+    writeBuffer.popContext("CipWriteRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CipWriteRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (requestPathSize)
+    lengthInBits += 8;
+
+    // Array field
+    if (tag != null) {
+      lengthInBits += 8 * tag.length;
+    }
+
+    // Simple field (dataType)
+    lengthInBits += 16;
+
+    // Simple field (elementNb)
+    lengthInBits += 16;
+
+    // Array field
+    if (data != null) {
+      lengthInBits += 8 * data.length;
+    }
+
+    return lengthInBits;
+  }
+
+  public static CipServiceBuilder staticParseCipServiceBuilder(
+      ReadBuffer readBuffer, Integer serviceLen) throws ParseException {
+    readBuffer.pullContext("CipWriteRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte requestPathSize = readSimpleField("requestPathSize", readSignedByte(readBuffer, 8));
+
+    byte[] tag = readBuffer.readByteArray("tag", Math.toIntExact((requestPathSize) * (2)));
+
+    CIPDataTypeCode dataType =
+        readEnumField(
+            "dataType",
+            "CIPDataTypeCode",
+            new DataReaderEnumDefault<>(
+                CIPDataTypeCode::enumForValue, readUnsignedInt(readBuffer, 16)));
+
+    int elementNb = readSimpleField("elementNb", readUnsignedInt(readBuffer, 16));
+
+    byte[] data =
+        readBuffer.readByteArray("data", Math.toIntExact((dataType.getSize()) * (elementNb)));
+
+    readBuffer.closeContext("CipWriteRequest");
+    // Create the instance
+    return new CipWriteRequestBuilderImpl(requestPathSize, tag, dataType, elementNb, data);
+  }
+
+  public static class CipWriteRequestBuilderImpl implements CipService.CipServiceBuilder {
+    private final byte requestPathSize;
+    private final byte[] tag;
+    private final CIPDataTypeCode dataType;
+    private final int elementNb;
+    private final byte[] data;
+
+    public CipWriteRequestBuilderImpl(
+        byte requestPathSize, byte[] tag, CIPDataTypeCode dataType, int elementNb, byte[] data) {
+      this.requestPathSize = requestPathSize;
+      this.tag = tag;
+      this.dataType = dataType;
+      this.elementNb = elementNb;
+      this.data = data;
+    }
+
+    public CipWriteRequest build() {
+      CipWriteRequest cipWriteRequest =
+          new CipWriteRequest(requestPathSize, tag, dataType, elementNb, data);
+      return cipWriteRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipWriteRequest)) {
+      return false;
+    }
+    CipWriteRequest that = (CipWriteRequest) o;
+    return (getRequestPathSize() == that.getRequestPathSize())
+        && (getTag() == that.getTag())
+        && (getDataType() == that.getDataType())
+        && (getElementNb() == that.getElementNb())
+        && (getData() == that.getData())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(), getRequestPathSize(), getTag(), getDataType(), getElementNb(), getData());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipWriteResponse.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipWriteResponse.java
new file mode 100644
index 0000000000..ceeb18ed40
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipWriteResponse.java
@@ -0,0 +1,170 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class CipWriteResponse extends CipService implements Message {
+
+  // Accessors for discriminator values.
+  public Short getService() {
+    return (short) 0xCD;
+  }
+
+  // Properties.
+  protected final short status;
+  protected final short extStatus;
+
+  public CipWriteResponse(short status, short extStatus) {
+    super();
+    this.status = status;
+    this.extStatus = extStatus;
+  }
+
+  public short getStatus() {
+    return status;
+  }
+
+  public short getExtStatus() {
+    return extStatus;
+  }
+
+  @Override
+  protected void serializeCipServiceChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("CipWriteResponse");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (status)
+    writeSimpleField("status", status, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (extStatus)
+    writeSimpleField("extStatus", extStatus, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("CipWriteResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    CipWriteResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Simple field (status)
+    lengthInBits += 8;
+
+    // Simple field (extStatus)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static CipServiceBuilder staticParseCipServiceBuilder(
+      ReadBuffer readBuffer, Integer serviceLen) throws ParseException {
+    readBuffer.pullContext("CipWriteResponse");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    short status = readSimpleField("status", readUnsignedShort(readBuffer, 8));
+
+    short extStatus = readSimpleField("extStatus", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("CipWriteResponse");
+    // Create the instance
+    return new CipWriteResponseBuilderImpl(status, extStatus);
+  }
+
+  public static class CipWriteResponseBuilderImpl implements CipService.CipServiceBuilder {
+    private final short status;
+    private final short extStatus;
+
+    public CipWriteResponseBuilderImpl(short status, short extStatus) {
+      this.status = status;
+      this.extStatus = extStatus;
+    }
+
+    public CipWriteResponse build() {
+      CipWriteResponse cipWriteResponse = new CipWriteResponse(status, extStatus);
+      return cipWriteResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CipWriteResponse)) {
+      return false;
+    }
+    CipWriteResponse that = (CipWriteResponse) o;
+    return (getStatus() == that.getStatus())
+        && (getExtStatus() == that.getExtStatus())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getStatus(), getExtStatus());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EiPCommand.java
similarity index 54%
copy from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
copy to plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EiPCommand.java
index 143b3cca35..54504c1d85 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EiPCommand.java
@@ -18,12 +18,39 @@
  */
 package org.apache.plc4x.java.eip.readwrite;
 
-import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
+import java.util.HashMap;
+import java.util.Map;
 
-public class EIPDriverTestsuite extends DriverTestsuiteRunner {
+// Code generated by code-generation. DO NOT EDIT.
 
-    public EIPDriverTestsuite() {
-        super("/protocols/eip/DriverTestsuite.xml");
+public enum EiPCommand {
+  RegisterSession((int) 0x0065),
+  UnregisterSession((int) 0x0066),
+  SendRRData((int) 0x006F);
+  private static final Map<Integer, EiPCommand> map;
+
+  static {
+    map = new HashMap<>();
+    for (EiPCommand value : EiPCommand.values()) {
+      map.put((int) value.getValue(), value);
     }
+  }
+
+  private int value;
+
+  EiPCommand(int value) {
+    this.value = value;
+  }
+
+  public int getValue() {
+    return value;
+  }
+
+  public static EiPCommand enumForValue(int value) {
+    return map.get(value);
+  }
 
+  public static Boolean isDefined(int value) {
+    return map.containsKey(value);
+  }
 }
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipConnectionRequest.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipConnectionRequest.java
new file mode 100644
index 0000000000..dde1c17ef3
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipConnectionRequest.java
@@ -0,0 +1,172 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class EipConnectionRequest extends EipPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getCommand() {
+    return (int) 0x0065;
+  }
+
+  // Constant values.
+  public static final Integer PROTOCOLVERSION = 0x01;
+  public static final Integer FLAGS = 0x00;
+
+  public EipConnectionRequest(
+      long sessionHandle, long status, List<Short> senderContext, long options) {
+    super(sessionHandle, status, senderContext, options);
+  }
+
+  public int getProtocolVersion() {
+    return PROTOCOLVERSION;
+  }
+
+  public int getFlags() {
+    return FLAGS;
+  }
+
+  @Override
+  protected void serializeEipPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("EipConnectionRequest");
+
+    // Const Field (protocolVersion)
+    writeConstField(
+        "protocolVersion",
+        PROTOCOLVERSION,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Const Field (flags)
+    writeConstField(
+        "flags",
+        FLAGS,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    writeBuffer.popContext("EipConnectionRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EipConnectionRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (protocolVersion)
+    lengthInBits += 16;
+
+    // Const Field (flags)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static EipPacketBuilder staticParseEipPacketBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("EipConnectionRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int protocolVersion =
+        readConstField(
+            "protocolVersion",
+            readUnsignedInt(readBuffer, 16),
+            EipConnectionRequest.PROTOCOLVERSION,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int flags =
+        readConstField(
+            "flags",
+            readUnsignedInt(readBuffer, 16),
+            EipConnectionRequest.FLAGS,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    readBuffer.closeContext("EipConnectionRequest");
+    // Create the instance
+    return new EipConnectionRequestBuilderImpl();
+  }
+
+  public static class EipConnectionRequestBuilderImpl implements EipPacket.EipPacketBuilder {
+
+    public EipConnectionRequestBuilderImpl() {}
+
+    public EipConnectionRequest build(
+        long sessionHandle, long status, List<Short> senderContext, long options) {
+      EipConnectionRequest eipConnectionRequest =
+          new EipConnectionRequest(sessionHandle, status, senderContext, options);
+      return eipConnectionRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EipConnectionRequest)) {
+      return false;
+    }
+    EipConnectionRequest that = (EipConnectionRequest) o;
+    return super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipDisconnectRequest.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipDisconnectRequest.java
new file mode 100644
index 0000000000..e06e803443
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipDisconnectRequest.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class EipDisconnectRequest extends EipPacket implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getCommand() {
+    return (int) 0x0066;
+  }
+
+  public EipDisconnectRequest(
+      long sessionHandle, long status, List<Short> senderContext, long options) {
+    super(sessionHandle, status, senderContext, options);
+  }
+
+  @Override
+  protected void serializeEipPacketChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("EipDisconnectRequest");
+
+    writeBuffer.popContext("EipDisconnectRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EipDisconnectRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    return lengthInBits;
+  }
+
+  public static EipPacketBuilder staticParseEipPacketBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("EipDisconnectRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    readBuffer.closeContext("EipDisconnectRequest");
+    // Create the instance
+    return new EipDisconnectRequestBuilderImpl();
+  }
+
+  public static class EipDisconnectRequestBuilderImpl implements EipPacket.EipPacketBuilder {
+
+    public EipDisconnectRequestBuilderImpl() {}
+
+    public EipDisconnectRequest build(
+        long sessionHandle, long status, List<Short> senderContext, long options) {
+      EipDisconnectRequest eipDisconnectRequest =
+          new EipDisconnectRequest(sessionHandle, status, senderContext, options);
+      return eipDisconnectRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EipDisconnectRequest)) {
+      return false;
+    }
+    EipDisconnectRequest that = (EipDisconnectRequest) o;
+    return super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipPacket.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipPacket.java
new file mode 100644
index 0000000000..4f946e428b
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/EipPacket.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public abstract class EipPacket implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Integer getCommand();
+
+  // Properties.
+  protected final long sessionHandle;
+  protected final long status;
+  protected final List<Short> senderContext;
+  protected final long options;
+
+  public EipPacket(long sessionHandle, long status, List<Short> senderContext, long options) {
+    super();
+    this.sessionHandle = sessionHandle;
+    this.status = status;
+    this.senderContext = senderContext;
+    this.options = options;
+  }
+
+  public long getSessionHandle() {
+    return sessionHandle;
+  }
+
+  public long getStatus() {
+    return status;
+  }
+
+  public List<Short> getSenderContext() {
+    return senderContext;
+  }
+
+  public long getOptions() {
+    return options;
+  }
+
+  protected abstract void serializeEipPacketChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("EipPacket");
+
+    // Discriminator Field (command) (Used as input to a switch field)
+    writeDiscriminatorField(
+        "command",
+        getCommand(),
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Implicit Field (packetLength) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int packetLength = (int) ((getLengthInBytes()) - (24));
+    writeImplicitField(
+        "packetLength",
+        packetLength,
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Simple Field (sessionHandle)
+    writeSimpleField(
+        "sessionHandle",
+        sessionHandle,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Simple Field (status)
+    writeSimpleField(
+        "status",
+        status,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Array Field (senderContext)
+    writeSimpleTypeArrayField(
+        "senderContext",
+        senderContext,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Simple Field (options)
+    writeSimpleField(
+        "options",
+        options,
+        writeUnsignedLong(writeBuffer, 32),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Switch field (Serialize the sub-type)
+    serializeEipPacketChild(writeBuffer);
+
+    writeBuffer.popContext("EipPacket");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    EipPacket _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (command)
+    lengthInBits += 16;
+
+    // Implicit Field (packetLength)
+    lengthInBits += 16;
+
+    // Simple field (sessionHandle)
+    lengthInBits += 32;
+
+    // Simple field (status)
+    lengthInBits += 32;
+
+    // Array field
+    if (senderContext != null) {
+      lengthInBits += 8 * senderContext.size();
+    }
+
+    // Simple field (options)
+    lengthInBits += 32;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static EipPacket staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static EipPacket staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EipPacket");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int command =
+        readDiscriminatorField(
+            "command",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int packetLength =
+        readImplicitField(
+            "packetLength",
+            readUnsignedInt(readBuffer, 16),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    long sessionHandle =
+        readSimpleField(
+            "sessionHandle",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    long status =
+        readSimpleField(
+            "status",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    List<Short> senderContext =
+        readCountArrayField(
+            "senderContext",
+            readUnsignedShort(readBuffer, 8),
+            8,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    long options =
+        readSimpleField(
+            "options",
+            readUnsignedLong(readBuffer, 32),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    EipPacketBuilder builder = null;
+    if (EvaluationHelper.equals(command, (int) 0x0065)) {
+      builder = EipConnectionRequest.staticParseEipPacketBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(command, (int) 0x0066)) {
+      builder = EipDisconnectRequest.staticParseEipPacketBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(command, (int) 0x006F)) {
+      builder = CipRRData.staticParseEipPacketBuilder(readBuffer, packetLength);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type" + " parameters [" + "command=" + command + "]");
+    }
+
+    readBuffer.closeContext("EipPacket");
+    // Create the instance
+    EipPacket _eipPacket = builder.build(sessionHandle, status, senderContext, options);
+    return _eipPacket;
+  }
+
+  public interface EipPacketBuilder {
+    EipPacket build(long sessionHandle, long status, List<Short> senderContext, long options);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EipPacket)) {
+      return false;
+    }
+    EipPacket that = (EipPacket) o;
+    return (getSessionHandle() == that.getSessionHandle())
+        && (getStatus() == that.getStatus())
+        && (getSenderContext() == that.getSenderContext())
+        && (getOptions() == that.getOptions())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getSessionHandle(), getStatus(), getSenderContext(), getOptions());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/MultipleServiceRequest.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/MultipleServiceRequest.java
new file mode 100644
index 0000000000..e687185beb
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/MultipleServiceRequest.java
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class MultipleServiceRequest extends CipService implements Message {
+
+  // Accessors for discriminator values.
+  public Short getService() {
+    return (short) 0x0A;
+  }
+
+  // Constant values.
+  public static final Byte REQUESTPATHSIZE = 0x02;
+  public static final Long REQUESTPATH = 0x01240220L;
+
+  // Properties.
+  protected final Services data;
+
+  public MultipleServiceRequest(Services data) {
+    super();
+    this.data = data;
+  }
+
+  public Services getData() {
+    return data;
+  }
+
+  public byte getRequestPathSize() {
+    return REQUESTPATHSIZE;
+  }
+
+  public long getRequestPath() {
+    return REQUESTPATH;
+  }
+
+  @Override
+  protected void serializeCipServiceChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("MultipleServiceRequest");
+
+    // Const Field (requestPathSize)
+    writeConstField("requestPathSize", REQUESTPATHSIZE, writeSignedByte(writeBuffer, 8));
+
+    // Const Field (requestPath)
+    writeConstField("requestPath", REQUESTPATH, writeUnsignedLong(writeBuffer, 32));
+
+    // Simple Field (data)
+    writeSimpleField("data", data, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("MultipleServiceRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    MultipleServiceRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (requestPathSize)
+    lengthInBits += 8;
+
+    // Const Field (requestPath)
+    lengthInBits += 32;
+
+    // Simple field (data)
+    lengthInBits += data.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static CipServiceBuilder staticParseCipServiceBuilder(
+      ReadBuffer readBuffer, Integer serviceLen) throws ParseException {
+    readBuffer.pullContext("MultipleServiceRequest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte requestPathSize =
+        readConstField(
+            "requestPathSize",
+            readSignedByte(readBuffer, 8),
+            MultipleServiceRequest.REQUESTPATHSIZE);
+
+    long requestPath =
+        readConstField(
+            "requestPath", readUnsignedLong(readBuffer, 32), MultipleServiceRequest.REQUESTPATH);
+
+    Services data =
+        readSimpleField(
+            "data",
+            new DataReaderComplexDefault<>(
+                () -> Services.staticParse(readBuffer, (int) ((serviceLen) - (6))), readBuffer));
+
+    readBuffer.closeContext("MultipleServiceRequest");
+    // Create the instance
+    return new MultipleServiceRequestBuilderImpl(data);
+  }
+
+  public static class MultipleServiceRequestBuilderImpl implements CipService.CipServiceBuilder {
+    private final Services data;
+
+    public MultipleServiceRequestBuilderImpl(Services data) {
+      this.data = data;
+    }
+
+    public MultipleServiceRequest build() {
+      MultipleServiceRequest multipleServiceRequest = new MultipleServiceRequest(data);
+      return multipleServiceRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof MultipleServiceRequest)) {
+      return false;
+    }
+    MultipleServiceRequest that = (MultipleServiceRequest) o;
+    return (getData() == that.getData()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getData());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/MultipleServiceResponse.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/MultipleServiceResponse.java
new file mode 100644
index 0000000000..d0ed6918cd
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/MultipleServiceResponse.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class MultipleServiceResponse extends CipService implements Message {
+
+  // Accessors for discriminator values.
+  public Short getService() {
+    return (short) 0x8A;
+  }
+
+  // Properties.
+  protected final short status;
+  protected final short extStatus;
+  protected final int serviceNb;
+  protected final List<Integer> offsets;
+  protected final byte[] servicesData;
+
+  public MultipleServiceResponse(
+      short status, short extStatus, int serviceNb, List<Integer> offsets, byte[] servicesData) {
+    super();
+    this.status = status;
+    this.extStatus = extStatus;
+    this.serviceNb = serviceNb;
+    this.offsets = offsets;
+    this.servicesData = servicesData;
+  }
+
+  public short getStatus() {
+    return status;
+  }
+
+  public short getExtStatus() {
+    return extStatus;
+  }
+
+  public int getServiceNb() {
+    return serviceNb;
+  }
+
+  public List<Integer> getOffsets() {
+    return offsets;
+  }
+
+  public byte[] getServicesData() {
+    return servicesData;
+  }
+
+  @Override
+  protected void serializeCipServiceChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("MultipleServiceResponse");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x0, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (status)
+    writeSimpleField("status", status, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (extStatus)
+    writeSimpleField("extStatus", extStatus, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (serviceNb)
+    writeSimpleField("serviceNb", serviceNb, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (offsets)
+    writeSimpleTypeArrayField("offsets", offsets, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (servicesData)
+    writeByteArrayField("servicesData", servicesData, writeByteArray(writeBuffer, 8));
+
+    writeBuffer.popContext("MultipleServiceResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    MultipleServiceResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Simple field (status)
+    lengthInBits += 8;
+
+    // Simple field (extStatus)
+    lengthInBits += 8;
+
+    // Simple field (serviceNb)
+    lengthInBits += 16;
+
+    // Array field
+    if (offsets != null) {
+      lengthInBits += 16 * offsets.size();
+    }
+
+    // Array field
+    if (servicesData != null) {
+      lengthInBits += 8 * servicesData.length;
+    }
+
+    return lengthInBits;
+  }
+
+  public static CipServiceBuilder staticParseCipServiceBuilder(
+      ReadBuffer readBuffer, Integer serviceLen) throws ParseException {
+    readBuffer.pullContext("MultipleServiceResponse");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x0);
+
+    short status = readSimpleField("status", readUnsignedShort(readBuffer, 8));
+
+    short extStatus = readSimpleField("extStatus", readUnsignedShort(readBuffer, 8));
+
+    int serviceNb = readSimpleField("serviceNb", readUnsignedInt(readBuffer, 16));
+
+    List<Integer> offsets =
+        readCountArrayField("offsets", readUnsignedInt(readBuffer, 16), serviceNb);
+
+    byte[] servicesData =
+        readBuffer.readByteArray(
+            "servicesData", Math.toIntExact(((serviceLen) - (6)) - (((2) * (serviceNb)))));
+
+    readBuffer.closeContext("MultipleServiceResponse");
+    // Create the instance
+    return new MultipleServiceResponseBuilderImpl(
+        status, extStatus, serviceNb, offsets, servicesData);
+  }
+
+  public static class MultipleServiceResponseBuilderImpl implements CipService.CipServiceBuilder {
+    private final short status;
+    private final short extStatus;
+    private final int serviceNb;
+    private final List<Integer> offsets;
+    private final byte[] servicesData;
+
+    public MultipleServiceResponseBuilderImpl(
+        short status, short extStatus, int serviceNb, List<Integer> offsets, byte[] servicesData) {
+      this.status = status;
+      this.extStatus = extStatus;
+      this.serviceNb = serviceNb;
+      this.offsets = offsets;
+      this.servicesData = servicesData;
+    }
+
+    public MultipleServiceResponse build() {
+      MultipleServiceResponse multipleServiceResponse =
+          new MultipleServiceResponse(status, extStatus, serviceNb, offsets, servicesData);
+      return multipleServiceResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof MultipleServiceResponse)) {
+      return false;
+    }
+    MultipleServiceResponse that = (MultipleServiceResponse) o;
+    return (getStatus() == that.getStatus())
+        && (getExtStatus() == that.getExtStatus())
+        && (getServiceNb() == that.getServiceNb())
+        && (getOffsets() == that.getOffsets())
+        && (getServicesData() == that.getServicesData())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getStatus(),
+        getExtStatus(),
+        getServiceNb(),
+        getOffsets(),
+        getServicesData());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/Services.java b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/Services.java
new file mode 100644
index 0000000000..d0c03e6eab
--- /dev/null
+++ b/plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/Services.java
@@ -0,0 +1,190 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.eip.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class Services implements Message {
+
+  // Properties.
+  protected final int serviceNb;
+  protected final List<Integer> offsets;
+  protected final List<CipService> services;
+
+  public Services(int serviceNb, List<Integer> offsets, List<CipService> services) {
+    super();
+    this.serviceNb = serviceNb;
+    this.offsets = offsets;
+    this.services = services;
+  }
+
+  public int getServiceNb() {
+    return serviceNb;
+  }
+
+  public List<Integer> getOffsets() {
+    return offsets;
+  }
+
+  public List<CipService> getServices() {
+    return services;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("Services");
+
+    // Simple Field (serviceNb)
+    writeSimpleField("serviceNb", serviceNb, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (offsets)
+    writeSimpleTypeArrayField("offsets", offsets, writeUnsignedInt(writeBuffer, 16));
+
+    // Array Field (services)
+    writeComplexTypeArrayField("services", services, writeBuffer);
+
+    writeBuffer.popContext("Services");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    Services _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (serviceNb)
+    lengthInBits += 16;
+
+    // Array field
+    if (offsets != null) {
+      lengthInBits += 16 * offsets.size();
+    }
+
+    // Array field
+    if (services != null) {
+      int i = 0;
+      for (CipService element : services) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= services.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static Services staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    if ((args == null) || (args.length != 1)) {
+      throw new PlcRuntimeException(
+          "Wrong number of arguments, expected 1, but got " + args.length);
+    }
+    Integer servicesLen;
+    if (args[0] instanceof Integer) {
+      servicesLen = (Integer) args[0];
+    } else if (args[0] instanceof String) {
+      servicesLen = Integer.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type Integer or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, servicesLen);
+  }
+
+  public static Services staticParse(ReadBuffer readBuffer, Integer servicesLen)
+      throws ParseException {
+    readBuffer.pullContext("Services");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int serviceNb = readSimpleField("serviceNb", readUnsignedInt(readBuffer, 16));
+
+    List<Integer> offsets =
+        readCountArrayField("offsets", readUnsignedInt(readBuffer, 16), serviceNb);
+
+    List<CipService> services =
+        readCountArrayField(
+            "services",
+            new DataReaderComplexDefault<>(
+                () -> CipService.staticParse(readBuffer, (int) ((servicesLen) / (serviceNb))),
+                readBuffer),
+            serviceNb);
+
+    readBuffer.closeContext("Services");
+    // Create the instance
+    Services _services;
+    _services = new Services(serviceNb, offsets, services);
+    return _services;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof Services)) {
+      return false;
+    }
+    Services that = (Services) o;
+    return (getServiceNb() == that.getServiceNb())
+        && (getOffsets() == that.getOffsets())
+        && (getServices() == that.getServices())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getServiceNb(), getOffsets(), getServices());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/protocol/EipProtocolLogic.java b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/protocol/EipProtocolLogic.java
index c150059cfc..d980541ab1 100644
--- a/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/protocol/EipProtocolLogic.java
+++ b/plc4j/drivers/eip/src/main/java/org/apache/plc4x/java/eip/readwrite/protocol/EipProtocolLogic.java
@@ -76,8 +76,9 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha
         EipConnectionRequest connectionRequest =
             new EipConnectionRequest(0L, 0L, emptySenderContext, 0L);
         context.sendRequest(connectionRequest)
-            .expectResponse(EipPacket.class, REQUEST_TIMEOUT).unwrap(p -> p)
-            .check(p -> p instanceof EipConnectionRequest)
+            .expectResponse(EipPacket.class, REQUEST_TIMEOUT)
+//            .check(p -> p instanceof EipConnectionRequest)
+//            .unwrap(p -> (EipConnectionRequest) p)
             .handle(p -> {
                 if (p.getStatus() == 0L) {
                     sessionHandle = p.getSessionHandle();
@@ -248,14 +249,16 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha
                 .expectResponse(EipPacket.class, REQUEST_TIMEOUT)
                 .onTimeout(future::completeExceptionally)
                 .onError((p, e) -> future.completeExceptionally(e))
-                .check(p -> p instanceof CipRRData)
-                .check(p -> p.getSessionHandle() == sessionHandle)
+                //.check(p -> p instanceof CipRRData)
+                //.check(p -> p.getSessionHandle() == sessionHandle)
                 //.check(p -> p.getSenderContext() == senderContext)
-                .unwrap(p -> (CipRRData) p)
-                .unwrap(p -> p.getExchange().getService()).check(p -> p instanceof CipReadResponse)
-                .unwrap(p -> (CipReadResponse) p)
+                //.unwrap(p -> (CipRRData) p)
+                //.unwrap(p -> p.getExchange().getService())
+                //.check(p -> p instanceof CipReadResponse)
+                //.unwrap(p -> (CipReadResponse) p)
                 .handle(p -> {
-                    future.complete(p);
+                    System.out.println(p);
+//                    future.complete(p);
                     // Finish the request-transaction.
                     transaction.endRequest();
                 }));
@@ -630,8 +633,14 @@ public class EipProtocolLogic extends Plc4xProtocolBase<EipPacket> implements Ha
 
     @Override
     public void close(ConversationContext<EipPacket> context) {
-        logger.debug("Sending UnregisterSession EIP Pakcet");
+        logger.debug("Sending UnregisterSession EIP Packet");
         context.sendRequest(new EipDisconnectRequest(sessionHandle, 0L, emptySenderContext, 0L)); //Unregister gets no response
-        logger.debug("Unregistred Session {}", sessionHandle);
+        logger.debug("Unregistered Session {}", sessionHandle);
     }
+
+    @Override
+    protected void decode(ConversationContext<EipPacket> context, EipPacket msg) throws Exception {
+        super.decode(context, msg);
+    }
+
 }
diff --git a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverIT.java
similarity index 90%
rename from plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
rename to plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverIT.java
index 143b3cca35..68ca7ee0b2 100644
--- a/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverTestsuite.java
+++ b/plc4j/drivers/eip/src/test/java/org/apache/plc4x/java/eip/readwrite/EIPDriverIT.java
@@ -20,9 +20,9 @@ package org.apache.plc4x.java.eip.readwrite;
 
 import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
 
-public class EIPDriverTestsuite extends DriverTestsuiteRunner {
+public class EIPDriverIT extends DriverTestsuiteRunner {
 
-    public EIPDriverTestsuite() {
+    public EIPDriverIT() {
         super("/protocols/eip/DriverTestsuite.xml");
     }
 
diff --git a/plc4j/drivers/eip/src/test/resources/logback-test.xml b/plc4j/drivers/eip/src/test/resources/logback-test.xml
index 2b9cea25dc..cc4250b212 100644
--- a/plc4j/drivers/eip/src/test/resources/logback-test.xml
+++ b/plc4j/drivers/eip/src/test/resources/logback-test.xml
@@ -29,7 +29,7 @@
     </encoder>
   </appender>
 
-  <root level="error">
+  <root level="info">
     <appender-ref ref="STDOUT" />
   </root>
 
diff --git a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
index 963fdb535e..f96c3f2543 100644
--- a/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
+++ b/plc4j/utils/test-utils/src/main/java/org/apache/plc4x/test/migration/MessageValidatorAndMigrator.java
@@ -153,7 +153,7 @@ public class MessageValidatorAndMigrator {
                     newXml = TestCasePatcher.indent(newXml, indent);
                     Pattern patternForReferenceXmlString = TestCasePatcher.getPatternForFragment(referenceXmlString);
                     if (!patternForReferenceXmlString.matcher(content).find()) {
-                        throw new RuntimeException("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\nAutomigration failed: Can't match content. Patching won't work..\nTry to copy the above xml manually. \n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+                        throw new RuntimeException("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\nAuto migration failed: Can't match content. Patching won't work..\nTry to copy the above xml manually. \n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
                     }
                     content = RegExUtils.replaceFirst(content, patternForReferenceXmlString, newXml + "\n");
                     try {
diff --git a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
index a78fc63408..98f44f1298 100644
--- a/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
+++ b/protocols/eip/src/test/resources/protocols/eip/DriverTestsuite.xml
@@ -32,7 +32,7 @@
     <outgoing-plc-message name="Send connection request">
       <EipPacket>
         <command dataType="uint" bitLength="16">101</command>
-        <len dataType="uint" bitLength="16">4</len>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
         <sessionHandle dataType="uint" bitLength="32">0</sessionHandle>
         <status dataType="uint" bitLength="32">0</status>
         <senderContext isList="true">
@@ -52,11 +52,11 @@
         </EipConnectionRequest>
       </EipPacket>
     </outgoing-plc-message>
-    <!-- The PLC will send the connection response with a sender context and session handle-->
+    <!-- The PLC will send the connection response with a sender context and session handle -->
     <incoming-plc-message name="Receive connection response">
       <EipPacket>
         <command dataType="uint" bitLength="16">101</command>
-        <len dataType="uint" bitLength="16">4</len>
+        <packetLength dataType="uint" bitLength="16">4</packetLength>
         <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
         <status dataType="uint" bitLength="32">0</status>
         <senderContext isList="true">
@@ -75,9 +75,9 @@
           <flags dataType="uint" bitLength="16">0</flags>
         </EipConnectionRequest>
       </EipPacket>
-
     </incoming-plc-message>
   </setup>
+
   <testcase>
     <name>Single element read request</name>
     <steps>
@@ -94,7 +94,7 @@
       <outgoing-plc-message name="Send CipReadRequest to PLC">
         <EipPacket>
           <command dataType="uint" bitLength="16">111</command>
-          <len dataType="uint" bitLength="16">40</len>
+          <packetLength dataType="uint" bitLength="16">40</packetLength>
           <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
           <status dataType="uint" bitLength="32">0</status>
           <senderContext isList="true">
@@ -152,7 +152,7 @@
       <incoming-plc-message name="Get CipReadResponse from PLC">
         <EipPacket>
           <command dataType="uint" bitLength="16">111</command>
-          <len dataType="uint" bitLength="16">26</len>
+          <packetLength dataType="uint" bitLength="16">26</packetLength>
           <sessionHandle dataType="uint" bitLength="32">1</sessionHandle>
           <status dataType="uint" bitLength="32">0</status>
           <senderContext isList="true">