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 2022/08/10 11:29:17 UTC

[plc4x] branch tmp/ads-symbol-discovery created (now f3760aa6e)

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

cdutz pushed a change to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git


      at f3760aa6e chore(ads): Tried fixing the go-build of the updated ADS protocol.

This branch includes the following new commits:

     new 7f1f52fd4 Prototype of ADS symbol scanner.
     new 72021595f Merge branch 'splatch/ads-symbol-discovery' into feature/ads-symbol-discovery
     new 4e640f3f0 chore(ads): Worked on the browse functionality
     new 95f18f557 chore(ads): Finished implementing a first version of the symbol-table and the datatype-table extraction
     new 19acbb9ed chore(ads): Extended the PLC4J API with a first draft of a Discovery and Browse-API
     new 90f9f20be chore(ads): Added back the previously deleted tests
     new f3760aa6e chore(ads): Tried fixing the go-build of the updated ADS protocol.

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[plc4x] 05/07: chore(ads): Extended the PLC4J API with a first draft of a Discovery and Browse-API

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 19acbb9ed02c8783f403ce2d4373050667cb00c9
Author: christoferdutz <ch...@c-ware.de>
AuthorDate: Wed Aug 10 08:49:33 2022 +0200

    chore(ads): Extended the PLC4J API with a first draft of a Discovery and Browse-API
---
 .../testing/protocols/ads/DriverTestsuite.xml      |   76 +-
 .../hello_world_plc4go_bacnet_discovery.go         |    2 +-
 .../discovery/hello_world_plc4go_knx_discovery.go  |    2 +-
 plc4go/internal/bacnetip/Discoverer.go             |    4 +-
 plc4go/internal/bacnetip/Driver.go                 |    2 +-
 plc4go/internal/knxnetip/Discoverer.go             |    2 +-
 plc4go/internal/knxnetip/Driver.go                 |    2 +-
 plc4go/internal/simulated/Driver.go                |    2 +-
 plc4go/internal/simulated/Driver_test.go           |    2 +-
 plc4go/internal/spi/PlcDiscoverer.go               |    2 +-
 plc4go/internal/spi/default/DefaultDriver.go       |    2 +-
 .../internal/spi/model/DefaultPlcDiscoveryEvent.go |   10 +-
 plc4go/pkg/api/driver.go                           |    2 +-
 plc4go/pkg/api/driverManager.go                    |    4 +-
 plc4go/pkg/api/model/plc_discovery.go              |    5 +-
 plc4go/protocols/ads/readwrite/ParserHelper.go     |    8 +
 plc4go/protocols/ads/readwrite/XmlParserHelper.go  |    8 +
 .../ads/readwrite/model/AdsDataTypeArrayInfo.go    |  210 ++
 .../ads/readwrite/model/AdsDataTypeTableEntry.go   |  724 +++++++
 .../model/AdsSignificantGroupAddresses.go          |  137 ++
 .../ads/readwrite/model/AdsSymbolTableEntry.go     |  896 +++++++++
 .../protocols/ads/readwrite/model/AdsTableSizes.go |  284 +++
 .../org/apache/plc4x/java/api/PlcConnection.java   |    4 +-
 .../plc4x/java/api/messages/PlcBrowseRequest.java  |    2 +-
 .../plc4x/java/api/messages/PlcDiscoveryItem.java  |    4 +-
 .../java/api/messages/PlcDiscoveryRequest.java     |    2 +
 .../java/api/metadata/PlcConnectionMetadata.java   |    4 +-
 .../org/apache/plc4x/java/ads/AdsPlcDriver.java    |   16 +
 .../plc4x/java/ads/discovery/AdsPlcDiscoverer.java |  223 ++-
 .../plc4x/java/ads/protocol/AdsProtocolLogic.java  |    8 +-
 .../apache/plc4x/java/cbus/RandomPackagesTest.java |  403 ----
 .../org/apache/plc4x/java/cbus/ReferenceTest.java  | 2052 --------------------
 .../plc4x/java/mock/connection/MockConnection.java |   33 +-
 .../apache/plc4x/java/opcua/OpcuaPlcDriver.java    |    7 +-
 .../profinet/discovery/ProfinetPlcDiscoverer.java  |    7 +
 .../simulated/connection/SimulatedConnection.java  |    2 +-
 .../pom.xml                                        |    9 +-
 .../helloplc4x/discoverandbrowse/HelloPlc4x.java   |   60 +
 .../src/main/resources/logback.xml                 |    5 +-
 .../pom.xml                                        |    8 +-
 .../java/examples/helloplc4x/read}/CliOptions.java |    2 +-
 .../java/examples/helloplc4x/read}/HelloPlc4x.java |    5 +-
 .../src/main/resources/logback.xml                 |    0
 .../pom.xml                                        |    8 +-
 .../examples/helloplc4x/subscribe}/CliOptions.java |    2 +-
 .../subscribe}/HelloPlc4xSubscription.java         |    2 +-
 .../src/main/resources/logback.xml                 |    2 +-
 plc4j/examples/hello-world-plc4x-write/pom.xml     |    2 +-
 plc4j/examples/pom.xml                             |    5 +-
 .../java/spi/connection/AbstractPlcConnection.java |   33 +-
 .../spi/connection/DefaultNettyPlcConnection.java  |    4 +-
 .../java/spi/connection/GeneratedDriverBase.java   |    6 +-
 ...ryRequest.java => DefaultPlcBrowseRequest.java} |   57 +-
 ...yRequest.java => DefaultPlcBrowseResponse.java} |   60 +-
 .../java/spi/messages/DefaultPlcDiscoveryItem.java |    7 +-
 .../spi/messages/DefaultPlcDiscoveryRequest.java   |   31 +-
 .../plc4x/java/spi/messages/PlcBrowser.java}       |   29 +-
 .../connectionpool2/CachedBrowseRequest.java}      |   24 +-
 .../CachedBrowseRequestBuilder.java}               |   25 +-
 .../utils/connectionpool2/CachedPlcConnection.java |   73 +
 .../connectionpool/PooledPlcDriverManagerTest.java |   15 +-
 .../java/opm/PlcEntityManagerComplexTest.java      |    6 +
 .../knxnetip/readwrite/model/KnxManufacturer.cs    |   19 +-
 .../plc4x/java/discovery/DiscoveryConnection.java  |   22 +-
 64 files changed, 2883 insertions(+), 2791 deletions(-)

diff --git a/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml b/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml
index fb0aa1c2f..70a6dd51a 100644
--- a/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml
+++ b/plc4go/assets/testing/protocols/ads/DriverTestsuite.xml
@@ -113,9 +113,9 @@
               <data>
                 <AdsData>
                   <AdsReadRequest>
-                    <indexGroup dataType="uint" bitLength="32">4040</indexGroup>
-                    <indexOffset dataType="uint" bitLength="32">8</indexOffset>
-                    <length dataType="uint" bitLength="32">1</length>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
+                    <indexOffset dataType="uint" bitLength="32">0</indexOffset>
+                    <length dataType="uint" bitLength="32">24</length>
                   </AdsReadRequest>
                 </AdsData>
               </data>
@@ -238,7 +238,7 @@
       <outgoing-plc-message name="Send Ads Read Request">
         <AmsTCPPacket>
           <reserved dataType="uint" bitLength="16">0</reserved>
-          <length dataType="uint" bitLength="32">72</length>
+          <length dataType="uint" bitLength="32">44</length>
           <userdata>
             <AmsPacket>
               <targetAmsNetId>
@@ -264,7 +264,7 @@
               </sourceAmsNetId>
               <sourceAmsPort dataType="uint" bitLength="16">48898</sourceAmsPort>
               <commandId>
-                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ_WRITE">9</CommandId>
+                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ">2</CommandId>
               </commandId>
               <state>
                 <State>
@@ -280,34 +280,16 @@
                   <reserved dataType="int" bitLength="7">0</reserved>
                 </State>
               </state>
-              <length dataType="uint" bitLength="32">40</length>
+              <length dataType="uint" bitLength="32">12</length>
               <errorCode dataType="uint" bitLength="32">0</errorCode>
               <invokeId dataType="uint" bitLength="32">1</invokeId>
               <data>
                 <AdsData>
-                  <AdsReadWriteRequest>
-                    <indexGroup dataType="uint" bitLength="32">61568</indexGroup>
-                    <indexOffset dataType="uint" bitLength="32">2</indexOffset>
-                    <readLength dataType="uint" bitLength="32">10</readLength>
-                    <writeLength dataType="uint" bitLength="32">24</writeLength>
-                    <items isList="true">
-                      <AdsMultiRequestItem>
-                        <AdsMultiRequestItemRead>
-                          <itemIndexGroup dataType="uint" bitLength="32">4040</itemIndexGroup>
-                          <itemIndexOffset dataType="uint" bitLength="32">8</itemIndexOffset>
-                          <itemReadLength dataType="uint" bitLength="32">1</itemReadLength>
-                        </AdsMultiRequestItemRead>
-                      </AdsMultiRequestItem>
-                      <AdsMultiRequestItem>
-                        <AdsMultiRequestItemRead>
-                          <itemIndexGroup dataType="uint" bitLength="32">4040</itemIndexGroup>
-                          <itemIndexOffset dataType="uint" bitLength="32">12</itemIndexOffset>
-                          <itemReadLength dataType="uint" bitLength="32">1</itemReadLength>
-                        </AdsMultiRequestItemRead>
-                      </AdsMultiRequestItem>
-                    </items>
-                    <data dataType="byte" bitLength="0">0x</data>
-                  </AdsReadWriteRequest>
+                  <AdsReadRequest>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
+                    <indexOffset dataType="uint" bitLength="32">0</indexOffset>
+                    <length dataType="uint" bitLength="32">24</length>
+                  </AdsReadRequest>
                 </AdsData>
               </data>
             </AmsPacket>
@@ -441,7 +423,7 @@
       <outgoing-plc-message name="Send Resolve Symbolic Address Request">
         <AmsTCPPacket>
           <reserved dataType="uint" bitLength="16">0</reserved>
-          <length dataType="uint" bitLength="32">74</length>
+          <length dataType="uint" bitLength="32">44</length>
           <userdata>
             <AmsPacket>
               <targetAmsNetId>
@@ -467,7 +449,7 @@
               </sourceAmsNetId>
               <sourceAmsPort dataType="uint" bitLength="16">48898</sourceAmsPort>
               <commandId>
-                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ_WRITE">9</CommandId>
+                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ">2</CommandId>
               </commandId>
               <state>
                 <State>
@@ -483,20 +465,16 @@
                   <reserved dataType="int" bitLength="7">0</reserved>
                 </State>
               </state>
-              <length dataType="uint" bitLength="32">42</length>
+              <length dataType="uint" bitLength="32">12</length>
               <errorCode dataType="uint" bitLength="32">0</errorCode>
               <invokeId dataType="uint" bitLength="32">1</invokeId>
               <data>
                 <AdsData>
-                  <AdsReadWriteRequest>
-                    <indexGroup dataType="uint" bitLength="32">61443</indexGroup>
+                  <AdsReadRequest>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
                     <indexOffset dataType="uint" bitLength="32">0</indexOffset>
-                    <readLength dataType="uint" bitLength="32">4</readLength>
-                    <writeLength dataType="uint" bitLength="32">26</writeLength>
-                    <items isList="true">
-                    </items>
-                    <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
-                  </AdsReadWriteRequest>
+                    <length dataType="uint" bitLength="32">24</length>
+                  </AdsReadRequest>
                 </AdsData>
               </data>
             </AmsPacket>
@@ -737,7 +715,7 @@
       <outgoing-plc-message name="Send Resolve Symbolic Address Request">
         <AmsTCPPacket>
           <reserved dataType="uint" bitLength="16">0</reserved>
-          <length dataType="uint" bitLength="32">74</length>
+          <length dataType="uint" bitLength="32">44</length>
           <userdata>
             <AmsPacket>
               <targetAmsNetId>
@@ -763,7 +741,7 @@
               </sourceAmsNetId>
               <sourceAmsPort dataType="uint" bitLength="16">48898</sourceAmsPort>
               <commandId>
-                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ_WRITE">9</CommandId>
+                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ">2</CommandId>
               </commandId>
               <state>
                 <State>
@@ -779,20 +757,16 @@
                   <reserved dataType="int" bitLength="7">0</reserved>
                 </State>
               </state>
-              <length dataType="uint" bitLength="32">42</length>
+              <length dataType="uint" bitLength="32">12</length>
               <errorCode dataType="uint" bitLength="32">0</errorCode>
               <invokeId dataType="uint" bitLength="32">1</invokeId>
               <data>
                 <AdsData>
-                  <AdsReadWriteRequest>
-                    <indexGroup dataType="uint" bitLength="32">61443</indexGroup>
+                  <AdsReadRequest>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
                     <indexOffset dataType="uint" bitLength="32">0</indexOffset>
-                    <readLength dataType="uint" bitLength="32">4</readLength>
-                    <writeLength dataType="uint" bitLength="32">26</writeLength>
-                    <items isList="true">
-                    </items>
-                    <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
-                  </AdsReadWriteRequest>
+                    <length dataType="uint" bitLength="32">24</length>
+                  </AdsReadRequest>
                 </AdsData>
               </data>
             </AmsPacket>
diff --git a/plc4go/examples/bacnet/discovery/hello_world_plc4go_bacnet_discovery.go b/plc4go/examples/bacnet/discovery/hello_world_plc4go_bacnet_discovery.go
index c0d4302eb..2f16ec288 100644
--- a/plc4go/examples/bacnet/discovery/hello_world_plc4go_bacnet_discovery.go
+++ b/plc4go/examples/bacnet/discovery/hello_world_plc4go_bacnet_discovery.go
@@ -39,7 +39,7 @@ func main() {
 	var connectionStrings []string
 	if len(os.Args) < 2 {
 		// Try to auto-find bacnet devices via broadcast-message discovery
-		if err := driverManager.Discover(func(event model.PlcDiscoveryEvent) {
+		if err := driverManager.Discover(func(event model.PlcDiscoveryItem) {
 			connStr := event.GetProtocolCode() + "://" + event.GetTransportUrl().Host
 			log.Info().Str("connection string", connStr).Stringer("event", event.(fmt.Stringer)).Msg("Found Bacnet Gateway")
 
diff --git a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
index 5febd5785..72e00d01c 100644
--- a/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
+++ b/plc4go/examples/knx/discovery/hello_world_plc4go_knx_discovery.go
@@ -40,7 +40,7 @@ func main() {
 	var connectionStrings []string
 	if len(os.Args) < 2 {
 		// Try to auto-find KNX gateways via broadcast-message discovery
-		_ = driverManager.Discover(func(event model.PlcDiscoveryEvent) {
+		_ = driverManager.Discover(func(event model.PlcDiscoveryItem) {
 			connStr := event.GetProtocolCode() + "://" + event.GetTransportUrl().Host
 			log.Info().Str("connection string", connStr).Msg("Found KNX Gateway")
 
diff --git a/plc4go/internal/bacnetip/Discoverer.go b/plc4go/internal/bacnetip/Discoverer.go
index 77abe6c8b..601bf7eb6 100644
--- a/plc4go/internal/bacnetip/Discoverer.go
+++ b/plc4go/internal/bacnetip/Discoverer.go
@@ -48,7 +48,7 @@ func NewDiscoverer() *Discoverer {
 	return &Discoverer{}
 }
 
-func (d *Discoverer) Discover(callback func(event apiModel.PlcDiscoveryEvent), discoveryOptions ...options.WithDiscoveryOption) error {
+func (d *Discoverer) Discover(callback func(event apiModel.PlcDiscoveryItem), discoveryOptions ...options.WithDiscoveryOption) error {
 	interfaces, err := extractInterfaces(discoveryOptions)
 	if err != nil {
 		return errors.Wrap(err, "error extracting interfaces")
@@ -226,7 +226,7 @@ func broadcastAndDiscover(ctx context.Context, communicationChannels []communica
 	return incomingBVLCChannel, nil
 }
 
-func handleIncomingBVLCs(ctx context.Context, callback func(event apiModel.PlcDiscoveryEvent), incomingBVLCChannel chan receivedBvlcMessage) {
+func handleIncomingBVLCs(ctx context.Context, callback func(event apiModel.PlcDiscoveryItem), incomingBVLCChannel chan receivedBvlcMessage) {
 	for {
 		select {
 		case receivedBvlc := <-incomingBVLCChannel:
diff --git a/plc4go/internal/bacnetip/Driver.go b/plc4go/internal/bacnetip/Driver.go
index 70efb1975..6528730fa 100644
--- a/plc4go/internal/bacnetip/Driver.go
+++ b/plc4go/internal/bacnetip/Driver.go
@@ -133,6 +133,6 @@ func (m *Driver) SupportsDiscovery() bool {
 	return true
 }
 
-func (m *Driver) Discover(callback func(event apiModel.PlcDiscoveryEvent), discoveryOptions ...options.WithDiscoveryOption) error {
+func (m *Driver) Discover(callback func(event apiModel.PlcDiscoveryItem), discoveryOptions ...options.WithDiscoveryOption) error {
 	return NewDiscoverer().Discover(callback, discoveryOptions...)
 }
diff --git a/plc4go/internal/knxnetip/Discoverer.go b/plc4go/internal/knxnetip/Discoverer.go
index 468e19ea3..9ca7ec8c8 100644
--- a/plc4go/internal/knxnetip/Discoverer.go
+++ b/plc4go/internal/knxnetip/Discoverer.go
@@ -44,7 +44,7 @@ func NewDiscoverer() *Discoverer {
 	return &Discoverer{}
 }
 
-func (d *Discoverer) Discover(callback func(event apiModel.PlcDiscoveryEvent), discoveryOptions ...options.WithDiscoveryOption) error {
+func (d *Discoverer) Discover(callback func(event apiModel.PlcDiscoveryItem), discoveryOptions ...options.WithDiscoveryOption) error {
 	udpTransport := udp.NewTransport()
 
 	// Create a connection string for the KNX broadcast discovery address.
diff --git a/plc4go/internal/knxnetip/Driver.go b/plc4go/internal/knxnetip/Driver.go
index c14a6feb8..3208ef444 100644
--- a/plc4go/internal/knxnetip/Driver.go
+++ b/plc4go/internal/knxnetip/Driver.go
@@ -77,6 +77,6 @@ func (m Driver) SupportsDiscovery() bool {
 	return true
 }
 
-func (m Driver) Discover(callback func(event apiModel.PlcDiscoveryEvent), discoveryOptions ...options.WithDiscoveryOption) error {
+func (m Driver) Discover(callback func(event apiModel.PlcDiscoveryItem), discoveryOptions ...options.WithDiscoveryOption) error {
 	return NewDiscoverer().Discover(callback, discoveryOptions...)
 }
diff --git a/plc4go/internal/simulated/Driver.go b/plc4go/internal/simulated/Driver.go
index 7e590fd4b..fb3bf6b4b 100644
--- a/plc4go/internal/simulated/Driver.go
+++ b/plc4go/internal/simulated/Driver.go
@@ -74,6 +74,6 @@ func (d *Driver) SupportsDiscovery() bool {
 	return false
 }
 
-func (d *Driver) Discover(_ func(event model.PlcDiscoveryEvent), _ ...options.WithDiscoveryOption) error {
+func (d *Driver) Discover(_ func(event model.PlcDiscoveryItem), _ ...options.WithDiscoveryOption) error {
 	return errors.New("unsupported operation")
 }
diff --git a/plc4go/internal/simulated/Driver_test.go b/plc4go/internal/simulated/Driver_test.go
index 63c608534..294d9e91e 100644
--- a/plc4go/internal/simulated/Driver_test.go
+++ b/plc4go/internal/simulated/Driver_test.go
@@ -73,7 +73,7 @@ func TestDriver_Discover(t *testing.T) {
 		valueHandler ValueHandler
 	}
 	type args struct {
-		callback         func(event model.PlcDiscoveryEvent)
+		callback         func(event model.PlcDiscoveryItem)
 		discoveryOptions []options.WithDiscoveryOption
 	}
 	tests := []struct {
diff --git a/plc4go/internal/spi/PlcDiscoverer.go b/plc4go/internal/spi/PlcDiscoverer.go
index b5a5dbfa8..520b388ed 100644
--- a/plc4go/internal/spi/PlcDiscoverer.go
+++ b/plc4go/internal/spi/PlcDiscoverer.go
@@ -25,5 +25,5 @@ import (
 )
 
 type PlcDiscoverer interface {
-	Discover(callback func(event model.PlcDiscoveryEvent), discoveryOptions ...options.WithDiscoveryOption) error
+	Discover(callback func(event model.PlcDiscoveryItem), discoveryOptions ...options.WithDiscoveryOption) error
 }
diff --git a/plc4go/internal/spi/default/DefaultDriver.go b/plc4go/internal/spi/default/DefaultDriver.go
index b41117516..8e57d35f4 100644
--- a/plc4go/internal/spi/default/DefaultDriver.go
+++ b/plc4go/internal/spi/default/DefaultDriver.go
@@ -87,7 +87,7 @@ func (d *defaultDriver) SupportsDiscovery() bool {
 	return false
 }
 
-func (d *defaultDriver) Discover(_ func(event apiModel.PlcDiscoveryEvent), _ ...options.WithDiscoveryOption) error {
+func (d *defaultDriver) Discover(_ func(event apiModel.PlcDiscoveryItem), _ ...options.WithDiscoveryOption) error {
 	panic("not available")
 }
 
diff --git a/plc4go/internal/spi/model/DefaultPlcDiscoveryEvent.go b/plc4go/internal/spi/model/DefaultPlcDiscoveryEvent.go
index aae283b01..78671c956 100644
--- a/plc4go/internal/spi/model/DefaultPlcDiscoveryEvent.go
+++ b/plc4go/internal/spi/model/DefaultPlcDiscoveryEvent.go
@@ -21,6 +21,7 @@ package model
 
 import (
 	"fmt"
+	"github.com/apache/plc4x/plc4go/pkg/api/values"
 	"net/url"
 )
 
@@ -30,6 +31,7 @@ type DefaultPlcDiscoveryEvent struct {
 	TransportUrl  url.URL
 	Options       map[string][]string
 	Name          string
+	Attributes    map[string]values.PlcValue
 }
 
 func (d *DefaultPlcDiscoveryEvent) GetProtocolCode() string {
@@ -52,7 +54,11 @@ func (d *DefaultPlcDiscoveryEvent) GetName() string {
 	return d.Name
 }
 
-func (d *DefaultPlcDiscoveryEvent) GetConnectionString() string {
+func (d *DefaultPlcDiscoveryEvent) GetAttributes() map[string]values.PlcValue {
+	return d.Attributes
+}
+
+func (d *DefaultPlcDiscoveryEvent) GetConnectionUrl() string {
 	if d.Options != nil {
 		panic("Not implemented")
 	}
@@ -60,5 +66,5 @@ func (d *DefaultPlcDiscoveryEvent) GetConnectionString() string {
 }
 
 func (d *DefaultPlcDiscoveryEvent) String() string {
-	return fmt.Sprintf("PlcDiscoveryEvent{Name:%s,%s}", d.Name, d.GetConnectionString())
+	return fmt.Sprintf("PlcDiscoveryEvent{Name:%s,%s}", d.Name, d.GetConnectionUrl())
 }
diff --git a/plc4go/pkg/api/driver.go b/plc4go/pkg/api/driver.go
index 2dd4553cf..38257599d 100644
--- a/plc4go/pkg/api/driver.go
+++ b/plc4go/pkg/api/driver.go
@@ -48,5 +48,5 @@ type PlcDriver interface {
 
 	// Discover TODO: document me
 	// FIXME: this leaks spi in the signature move to spi driver or create interfaces. Can also be done by moving spi in a proper module
-	Discover(callback func(event model.PlcDiscoveryEvent), discoveryOptions ...options.WithDiscoveryOption) error
+	Discover(callback func(event model.PlcDiscoveryItem), discoveryOptions ...options.WithDiscoveryOption) error
 }
diff --git a/plc4go/pkg/api/driverManager.go b/plc4go/pkg/api/driverManager.go
index 1d6bb8812..4b5c6ae26 100644
--- a/plc4go/pkg/api/driverManager.go
+++ b/plc4go/pkg/api/driverManager.go
@@ -41,7 +41,7 @@ type PlcDriverManager interface {
 	GetConnection(connectionString string) <-chan PlcConnectionConnectResult
 
 	// Discover Execute all available discovery methods on all available drivers using all transports
-	Discover(callback func(event model.PlcDiscoveryEvent), discoveryOptions ...WithDiscoveryOption) error
+	Discover(callback func(event model.PlcDiscoveryItem), discoveryOptions ...WithDiscoveryOption) error
 }
 
 func NewPlcDriverManager() PlcDriverManager {
@@ -282,7 +282,7 @@ func (m *plcDriverManger) GetConnection(connectionString string) <-chan PlcConne
 	return driver.GetConnection(transportUrl, m.transports, configOptions)
 }
 
-func (m *plcDriverManger) Discover(callback func(event model.PlcDiscoveryEvent), discoveryOptions ...WithDiscoveryOption) error {
+func (m *plcDriverManger) Discover(callback func(event model.PlcDiscoveryItem), discoveryOptions ...WithDiscoveryOption) error {
 	// Check if we've got at least one option to restrict to certain protocols only.
 	// If there is at least one, we only check that protocol, if there are none, all
 	// available protocols are checked.
diff --git a/plc4go/pkg/api/model/plc_discovery.go b/plc4go/pkg/api/model/plc_discovery.go
index 29dc7f740..7ff197305 100644
--- a/plc4go/pkg/api/model/plc_discovery.go
+++ b/plc4go/pkg/api/model/plc_discovery.go
@@ -20,13 +20,16 @@
 package model
 
 import (
+	"github.com/apache/plc4x/plc4go/pkg/api/values"
 	"net/url"
 )
 
-type PlcDiscoveryEvent interface {
+type PlcDiscoveryItem interface {
 	GetProtocolCode() string
 	GetTransportCode() string
 	GetTransportUrl() url.URL
 	GetOptions() map[string][]string
 	GetName() string
+	GetAttributes() map[string]values.PlcValue
+	GetConnectionUrl() string
 }
diff --git a/plc4go/protocols/ads/readwrite/ParserHelper.go b/plc4go/protocols/ads/readwrite/ParserHelper.go
index 802fd848c..86e18e668 100644
--- a/plc4go/protocols/ads/readwrite/ParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/ParserHelper.go
@@ -44,6 +44,8 @@ func (m AdsParserHelper) Parse(typeName string, arguments []string, io utils.Rea
 			return nil, errors.Wrap(err, "Error parsing")
 		}
 		return model.DataItemParse(io, dataFormatName, stringLength)
+	case "AdsTableSizes":
+		return model.AdsTableSizesParse(io)
 	case "AdsMultiRequestItem":
 		indexGroup, err := utils.StrToUint32(arguments[0])
 		if err != nil {
@@ -52,6 +54,8 @@ func (m AdsParserHelper) Parse(typeName string, arguments []string, io utils.Rea
 		return model.AdsMultiRequestItemParse(io, indexGroup)
 	case "AmsSerialAcknowledgeFrame":
 		return model.AmsSerialAcknowledgeFrameParse(io)
+	case "AdsDataTypeArrayInfo":
+		return model.AdsDataTypeArrayInfoParse(io)
 	case "AdsData":
 		commandId, _ := model.CommandIdByName(arguments[0])
 		response, err := utils.StrToBool(arguments[1])
@@ -59,6 +63,8 @@ func (m AdsParserHelper) Parse(typeName string, arguments []string, io utils.Rea
 			return nil, errors.Wrap(err, "Error parsing")
 		}
 		return model.AdsDataParse(io, commandId, response)
+	case "AdsDataTypeTableEntry":
+		return model.AdsDataTypeTableEntryParse(io)
 	case "AmsNetId":
 		return model.AmsNetIdParse(io)
 	case "AdsStampHeader":
@@ -69,6 +75,8 @@ func (m AdsParserHelper) Parse(typeName string, arguments []string, io utils.Rea
 		return model.AdsConstantsParse(io)
 	case "AdsNotificationSample":
 		return model.AdsNotificationSampleParse(io)
+	case "AdsSymbolTableEntry":
+		return model.AdsSymbolTableEntryParse(io)
 	case "AmsTCPPacket":
 		return model.AmsTCPPacketParse(io)
 	case "State":
diff --git a/plc4go/protocols/ads/readwrite/XmlParserHelper.go b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
index e09831b45..780d1836b 100644
--- a/plc4go/protocols/ads/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
@@ -53,6 +53,8 @@ func (m AdsXmlParserHelper) Parse(typeName string, xmlString string, parserArgum
 		}
 		stringLength := int32(parsedInt1)
 		return model.DataItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), dataFormatName, stringLength)
+	case "AdsTableSizes":
+		return model.AdsTableSizesParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "AdsMultiRequestItem":
 		parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 32)
 		if err != nil {
@@ -62,10 +64,14 @@ func (m AdsXmlParserHelper) Parse(typeName string, xmlString string, parserArgum
 		return model.AdsMultiRequestItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), indexGroup)
 	case "AmsSerialAcknowledgeFrame":
 		return model.AmsSerialAcknowledgeFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "AdsDataTypeArrayInfo":
+		return model.AdsDataTypeArrayInfoParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "AdsData":
 		commandId, _ := model.CommandIdByName(parserArguments[0])
 		response := parserArguments[1] == "true"
 		return model.AdsDataParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), commandId, response)
+	case "AdsDataTypeTableEntry":
+		return model.AdsDataTypeTableEntryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "AmsNetId":
 		return model.AmsNetIdParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "AdsStampHeader":
@@ -76,6 +82,8 @@ func (m AdsXmlParserHelper) Parse(typeName string, xmlString string, parserArgum
 		return model.AdsConstantsParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "AdsNotificationSample":
 		return model.AdsNotificationSampleParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+	case "AdsSymbolTableEntry":
+		return model.AdsSymbolTableEntryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "AmsTCPPacket":
 		return model.AmsTCPPacketParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "State":
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
new file mode 100644
index 000000000..9d997e1ba
--- /dev/null
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
@@ -0,0 +1,210 @@
+/*
+ * 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 (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// AdsDataTypeArrayInfo is the corresponding interface of AdsDataTypeArrayInfo
+type AdsDataTypeArrayInfo interface {
+	utils.LengthAware
+	utils.Serializable
+	// GetLowerBound returns LowerBound (property field)
+	GetLowerBound() uint32
+	// GetNumElements returns NumElements (property field)
+	GetNumElements() uint32
+	// GetUpperBound returns UpperBound (virtual field)
+	GetUpperBound() uint32
+}
+
+// AdsDataTypeArrayInfoExactly can be used when we want exactly this type and not a type which fulfills AdsDataTypeArrayInfo.
+// This is useful for switch cases.
+type AdsDataTypeArrayInfoExactly interface {
+	AdsDataTypeArrayInfo
+	isAdsDataTypeArrayInfo() bool
+}
+
+// _AdsDataTypeArrayInfo is the data-structure of this message
+type _AdsDataTypeArrayInfo struct {
+	LowerBound  uint32
+	NumElements uint32
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_AdsDataTypeArrayInfo) GetLowerBound() uint32 {
+	return m.LowerBound
+}
+
+func (m *_AdsDataTypeArrayInfo) GetNumElements() uint32 {
+	return m.NumElements
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for virtual fields.
+///////////////////////
+
+func (m *_AdsDataTypeArrayInfo) GetUpperBound() uint32 {
+	return uint32(uint32(m.GetLowerBound()) + uint32(m.GetNumElements()))
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewAdsDataTypeArrayInfo factory function for _AdsDataTypeArrayInfo
+func NewAdsDataTypeArrayInfo(lowerBound uint32, numElements uint32) *_AdsDataTypeArrayInfo {
+	return &_AdsDataTypeArrayInfo{LowerBound: lowerBound, NumElements: numElements}
+}
+
+// Deprecated: use the interface for direct cast
+func CastAdsDataTypeArrayInfo(structType interface{}) AdsDataTypeArrayInfo {
+	if casted, ok := structType.(AdsDataTypeArrayInfo); ok {
+		return casted
+	}
+	if casted, ok := structType.(*AdsDataTypeArrayInfo); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_AdsDataTypeArrayInfo) GetTypeName() string {
+	return "AdsDataTypeArrayInfo"
+}
+
+func (m *_AdsDataTypeArrayInfo) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_AdsDataTypeArrayInfo) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (lowerBound)
+	lengthInBits += 32
+
+	// Simple field (numElements)
+	lengthInBits += 32
+
+	// A virtual field doesn't have any in- or output.
+
+	return lengthInBits
+}
+
+func (m *_AdsDataTypeArrayInfo) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func AdsDataTypeArrayInfoParse(readBuffer utils.ReadBuffer) (AdsDataTypeArrayInfo, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("AdsDataTypeArrayInfo"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for AdsDataTypeArrayInfo")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	// Simple Field (lowerBound)
+	_lowerBound, _lowerBoundErr := readBuffer.ReadUint32("lowerBound", 32)
+	if _lowerBoundErr != nil {
+		return nil, errors.Wrap(_lowerBoundErr, "Error parsing 'lowerBound' field of AdsDataTypeArrayInfo")
+	}
+	lowerBound := _lowerBound
+
+	// Simple Field (numElements)
+	_numElements, _numElementsErr := readBuffer.ReadUint32("numElements", 32)
+	if _numElementsErr != nil {
+		return nil, errors.Wrap(_numElementsErr, "Error parsing 'numElements' field of AdsDataTypeArrayInfo")
+	}
+	numElements := _numElements
+
+	// Virtual field
+	_upperBound := uint32(lowerBound) + uint32(numElements)
+	upperBound := uint32(_upperBound)
+	_ = upperBound
+
+	if closeErr := readBuffer.CloseContext("AdsDataTypeArrayInfo"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for AdsDataTypeArrayInfo")
+	}
+
+	// Create the instance
+	return &_AdsDataTypeArrayInfo{
+		LowerBound:  lowerBound,
+		NumElements: numElements,
+	}, nil
+}
+
+func (m *_AdsDataTypeArrayInfo) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	if pushErr := writeBuffer.PushContext("AdsDataTypeArrayInfo"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for AdsDataTypeArrayInfo")
+	}
+
+	// Simple Field (lowerBound)
+	lowerBound := uint32(m.GetLowerBound())
+	_lowerBoundErr := writeBuffer.WriteUint32("lowerBound", 32, (lowerBound))
+	if _lowerBoundErr != nil {
+		return errors.Wrap(_lowerBoundErr, "Error serializing 'lowerBound' field")
+	}
+
+	// Simple Field (numElements)
+	numElements := uint32(m.GetNumElements())
+	_numElementsErr := writeBuffer.WriteUint32("numElements", 32, (numElements))
+	if _numElementsErr != nil {
+		return errors.Wrap(_numElementsErr, "Error serializing 'numElements' field")
+	}
+	// Virtual field
+	if _upperBoundErr := writeBuffer.WriteVirtual("upperBound", m.GetUpperBound()); _upperBoundErr != nil {
+		return errors.Wrap(_upperBoundErr, "Error serializing 'upperBound' field")
+	}
+
+	if popErr := writeBuffer.PopContext("AdsDataTypeArrayInfo"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for AdsDataTypeArrayInfo")
+	}
+	return nil
+}
+
+func (m *_AdsDataTypeArrayInfo) isAdsDataTypeArrayInfo() bool {
+	return true
+}
+
+func (m *_AdsDataTypeArrayInfo) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
new file mode 100644
index 000000000..aa8c945e8
--- /dev/null
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
@@ -0,0 +1,724 @@
+/*
+ * 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 (
+	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// Constant values.
+const AdsDataTypeTableEntry_NAMETERMINATOR uint8 = 0x00
+const AdsDataTypeTableEntry_TYPENAMETERMINATOR uint8 = 0x00
+const AdsDataTypeTableEntry_COMMENTTERMINATOR uint8 = 0x00
+
+// AdsDataTypeTableEntry is the corresponding interface of AdsDataTypeTableEntry
+type AdsDataTypeTableEntry interface {
+	utils.LengthAware
+	utils.Serializable
+	// GetEntryLength returns EntryLength (property field)
+	GetEntryLength() uint32
+	// GetVersion returns Version (property field)
+	GetVersion() uint32
+	// GetHashValue returns HashValue (property field)
+	GetHashValue() uint32
+	// GetTypeHashValue returns TypeHashValue (property field)
+	GetTypeHashValue() uint32
+	// GetSize returns Size (property field)
+	GetSize() uint32
+	// GetOffs returns Offs (property field)
+	GetOffs() uint32
+	// GetDataType returns DataType (property field)
+	GetDataType() uint32
+	// GetFlags returns Flags (property field)
+	GetFlags() uint32
+	// GetArrayDimensions returns ArrayDimensions (property field)
+	GetArrayDimensions() uint16
+	// GetNumChildren returns NumChildren (property field)
+	GetNumChildren() uint16
+	// GetName returns Name (property field)
+	GetName() string
+	// GetTypeName returns TypeName (property field)
+	GetTypeName() string
+	// GetComment returns Comment (property field)
+	GetComment() string
+	// GetArrayInfo returns ArrayInfo (property field)
+	GetArrayInfo() []AdsDataTypeArrayInfo
+	// GetChildren returns Children (property field)
+	GetChildren() []AdsDataTypeTableEntry
+	// GetRest returns Rest (property field)
+	GetRest() []byte
+}
+
+// AdsDataTypeTableEntryExactly can be used when we want exactly this type and not a type which fulfills AdsDataTypeTableEntry.
+// This is useful for switch cases.
+type AdsDataTypeTableEntryExactly interface {
+	AdsDataTypeTableEntry
+	isAdsDataTypeTableEntry() bool
+}
+
+// _AdsDataTypeTableEntry is the data-structure of this message
+type _AdsDataTypeTableEntry struct {
+	EntryLength     uint32
+	Version         uint32
+	HashValue       uint32
+	TypeHashValue   uint32
+	Size            uint32
+	Offs            uint32
+	DataType        uint32
+	Flags           uint32
+	ArrayDimensions uint16
+	NumChildren     uint16
+	Name            string
+	TypeName        string
+	Comment         string
+	ArrayInfo       []AdsDataTypeArrayInfo
+	Children        []AdsDataTypeTableEntry
+	Rest            []byte
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_AdsDataTypeTableEntry) GetEntryLength() uint32 {
+	return m.EntryLength
+}
+
+func (m *_AdsDataTypeTableEntry) GetVersion() uint32 {
+	return m.Version
+}
+
+func (m *_AdsDataTypeTableEntry) GetHashValue() uint32 {
+	return m.HashValue
+}
+
+func (m *_AdsDataTypeTableEntry) GetTypeHashValue() uint32 {
+	return m.TypeHashValue
+}
+
+func (m *_AdsDataTypeTableEntry) GetSize() uint32 {
+	return m.Size
+}
+
+func (m *_AdsDataTypeTableEntry) GetOffs() uint32 {
+	return m.Offs
+}
+
+func (m *_AdsDataTypeTableEntry) GetDataType() uint32 {
+	return m.DataType
+}
+
+func (m *_AdsDataTypeTableEntry) GetFlags() uint32 {
+	return m.Flags
+}
+
+func (m *_AdsDataTypeTableEntry) GetArrayDimensions() uint16 {
+	return m.ArrayDimensions
+}
+
+func (m *_AdsDataTypeTableEntry) GetNumChildren() uint16 {
+	return m.NumChildren
+}
+
+func (m *_AdsDataTypeTableEntry) GetName() string {
+	return m.Name
+}
+
+func (m *_AdsDataTypeTableEntry) GetTypeName() string {
+	return m.TypeName
+}
+
+func (m *_AdsDataTypeTableEntry) GetComment() string {
+	return m.Comment
+}
+
+func (m *_AdsDataTypeTableEntry) GetArrayInfo() []AdsDataTypeArrayInfo {
+	return m.ArrayInfo
+}
+
+func (m *_AdsDataTypeTableEntry) GetChildren() []AdsDataTypeTableEntry {
+	return m.Children
+}
+
+func (m *_AdsDataTypeTableEntry) GetRest() []byte {
+	return m.Rest
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for const fields.
+///////////////////////
+
+func (m *_AdsDataTypeTableEntry) GetNameTerminator() uint8 {
+	return AdsDataTypeTableEntry_NAMETERMINATOR
+}
+
+func (m *_AdsDataTypeTableEntry) GetTypeNameTerminator() uint8 {
+	return AdsDataTypeTableEntry_TYPENAMETERMINATOR
+}
+
+func (m *_AdsDataTypeTableEntry) GetCommentTerminator() uint8 {
+	return AdsDataTypeTableEntry_COMMENTTERMINATOR
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewAdsDataTypeTableEntry factory function for _AdsDataTypeTableEntry
+func NewAdsDataTypeTableEntry(entryLength uint32, version uint32, hashValue uint32, typeHashValue uint32, size uint32, offs uint32, dataType uint32, flags uint32, arrayDimensions uint16, numChildren uint16, name string, typeName string, comment string, arrayInfo []AdsDataTypeArrayInfo, children []AdsDataTypeTableEntry, rest []byte) *_AdsDataTypeTableEntry {
+	return &_AdsDataTypeTableEntry{EntryLength: entryLength, Version: version, HashValue: hashValue, TypeHashValue: typeHashValue, Size: size, Offs: offs, DataType: dataType, Flags: flags, ArrayDimensions: arrayDimensions, NumChildren: numChildren, Name: name, TypeName: typeName, Comment: comment, ArrayInfo: arrayInfo, Children: children, Rest: rest}
+}
+
+// Deprecated: use the interface for direct cast
+func CastAdsDataTypeTableEntry(structType interface{}) AdsDataTypeTableEntry {
+	if casted, ok := structType.(AdsDataTypeTableEntry); ok {
+		return casted
+	}
+	if casted, ok := structType.(*AdsDataTypeTableEntry); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_AdsDataTypeTableEntry) GetTypeName() string {
+	return "AdsDataTypeTableEntry"
+}
+
+func (m *_AdsDataTypeTableEntry) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_AdsDataTypeTableEntry) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (entryLength)
+	lengthInBits += 32
+
+	// Simple field (version)
+	lengthInBits += 32
+
+	// Simple field (hashValue)
+	lengthInBits += 32
+
+	// Simple field (typeHashValue)
+	lengthInBits += 32
+
+	// Simple field (size)
+	lengthInBits += 32
+
+	// Simple field (offs)
+	lengthInBits += 32
+
+	// Simple field (dataType)
+	lengthInBits += 32
+
+	// Simple field (flags)
+	lengthInBits += 32
+
+	// Implicit Field (nameLength)
+	lengthInBits += 16
+
+	// Implicit Field (typeNameLength)
+	lengthInBits += 16
+
+	// Implicit Field (commentLength)
+	lengthInBits += 16
+
+	// Simple field (arrayDimensions)
+	lengthInBits += 16
+
+	// Simple field (numChildren)
+	lengthInBits += 16
+
+	// Simple field (name)
+	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetName())) * int32(int32(8)))
+
+	// Const Field (nameTerminator)
+	lengthInBits += 8
+
+	// Simple field (typeName)
+	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetTypeName())) * int32(int32(8)))
+
+	// Const Field (typeNameTerminator)
+	lengthInBits += 8
+
+	// Simple field (comment)
+	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetComment())) * int32(int32(8)))
+
+	// Const Field (commentTerminator)
+	lengthInBits += 8
+
+	// Array field
+	if len(m.ArrayInfo) > 0 {
+		for i, element := range m.ArrayInfo {
+			last := i == len(m.ArrayInfo)-1
+			lengthInBits += element.(interface{ GetLengthInBitsConditional(bool) uint16 }).GetLengthInBitsConditional(last)
+		}
+	}
+
+	// Array field
+	if len(m.Children) > 0 {
+		for i, element := range m.Children {
+			last := i == len(m.Children)-1
+			lengthInBits += element.(interface{ GetLengthInBitsConditional(bool) uint16 }).GetLengthInBitsConditional(last)
+		}
+	}
+
+	// Array field
+	if len(m.Rest) > 0 {
+		lengthInBits += 8 * uint16(len(m.Rest))
+	}
+
+	return lengthInBits
+}
+
+func (m *_AdsDataTypeTableEntry) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEntry, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("AdsDataTypeTableEntry"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for AdsDataTypeTableEntry")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+	var startPos = positionAware.GetPos()
+	var curPos uint16
+
+	// Simple Field (entryLength)
+	_entryLength, _entryLengthErr := readBuffer.ReadUint32("entryLength", 32)
+	if _entryLengthErr != nil {
+		return nil, errors.Wrap(_entryLengthErr, "Error parsing 'entryLength' field of AdsDataTypeTableEntry")
+	}
+	entryLength := _entryLength
+
+	// Simple Field (version)
+	_version, _versionErr := readBuffer.ReadUint32("version", 32)
+	if _versionErr != nil {
+		return nil, errors.Wrap(_versionErr, "Error parsing 'version' field of AdsDataTypeTableEntry")
+	}
+	version := _version
+
+	// Simple Field (hashValue)
+	_hashValue, _hashValueErr := readBuffer.ReadUint32("hashValue", 32)
+	if _hashValueErr != nil {
+		return nil, errors.Wrap(_hashValueErr, "Error parsing 'hashValue' field of AdsDataTypeTableEntry")
+	}
+	hashValue := _hashValue
+
+	// Simple Field (typeHashValue)
+	_typeHashValue, _typeHashValueErr := readBuffer.ReadUint32("typeHashValue", 32)
+	if _typeHashValueErr != nil {
+		return nil, errors.Wrap(_typeHashValueErr, "Error parsing 'typeHashValue' field of AdsDataTypeTableEntry")
+	}
+	typeHashValue := _typeHashValue
+
+	// Simple Field (size)
+	_size, _sizeErr := readBuffer.ReadUint32("size", 32)
+	if _sizeErr != nil {
+		return nil, errors.Wrap(_sizeErr, "Error parsing 'size' field of AdsDataTypeTableEntry")
+	}
+	size := _size
+
+	// Simple Field (offs)
+	_offs, _offsErr := readBuffer.ReadUint32("offs", 32)
+	if _offsErr != nil {
+		return nil, errors.Wrap(_offsErr, "Error parsing 'offs' field of AdsDataTypeTableEntry")
+	}
+	offs := _offs
+
+	// Simple Field (dataType)
+	_dataType, _dataTypeErr := readBuffer.ReadUint32("dataType", 32)
+	if _dataTypeErr != nil {
+		return nil, errors.Wrap(_dataTypeErr, "Error parsing 'dataType' field of AdsDataTypeTableEntry")
+	}
+	dataType := _dataType
+
+	// Simple Field (flags)
+	_flags, _flagsErr := readBuffer.ReadUint32("flags", 32)
+	if _flagsErr != nil {
+		return nil, errors.Wrap(_flagsErr, "Error parsing 'flags' field of AdsDataTypeTableEntry")
+	}
+	flags := _flags
+
+	// Implicit Field (nameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+	nameLength, _nameLengthErr := readBuffer.ReadUint16("nameLength", 16)
+	_ = nameLength
+	if _nameLengthErr != nil {
+		return nil, errors.Wrap(_nameLengthErr, "Error parsing 'nameLength' field of AdsDataTypeTableEntry")
+	}
+
+	// Implicit Field (typeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+	typeNameLength, _typeNameLengthErr := readBuffer.ReadUint16("typeNameLength", 16)
+	_ = typeNameLength
+	if _typeNameLengthErr != nil {
+		return nil, errors.Wrap(_typeNameLengthErr, "Error parsing 'typeNameLength' field of AdsDataTypeTableEntry")
+	}
+
+	// Implicit Field (commentLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+	commentLength, _commentLengthErr := readBuffer.ReadUint16("commentLength", 16)
+	_ = commentLength
+	if _commentLengthErr != nil {
+		return nil, errors.Wrap(_commentLengthErr, "Error parsing 'commentLength' field of AdsDataTypeTableEntry")
+	}
+
+	// Simple Field (arrayDimensions)
+	_arrayDimensions, _arrayDimensionsErr := readBuffer.ReadUint16("arrayDimensions", 16)
+	if _arrayDimensionsErr != nil {
+		return nil, errors.Wrap(_arrayDimensionsErr, "Error parsing 'arrayDimensions' field of AdsDataTypeTableEntry")
+	}
+	arrayDimensions := _arrayDimensions
+
+	// Simple Field (numChildren)
+	_numChildren, _numChildrenErr := readBuffer.ReadUint16("numChildren", 16)
+	if _numChildrenErr != nil {
+		return nil, errors.Wrap(_numChildrenErr, "Error parsing 'numChildren' field of AdsDataTypeTableEntry")
+	}
+	numChildren := _numChildren
+
+	// Simple Field (name)
+	_name, _nameErr := readBuffer.ReadString("name", uint32((nameLength)*(8)))
+	if _nameErr != nil {
+		return nil, errors.Wrap(_nameErr, "Error parsing 'name' field of AdsDataTypeTableEntry")
+	}
+	name := _name
+
+	// Const Field (nameTerminator)
+	nameTerminator, _nameTerminatorErr := readBuffer.ReadUint8("nameTerminator", 8)
+	if _nameTerminatorErr != nil {
+		return nil, errors.Wrap(_nameTerminatorErr, "Error parsing 'nameTerminator' field of AdsDataTypeTableEntry")
+	}
+	if nameTerminator != AdsDataTypeTableEntry_NAMETERMINATOR {
+		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsDataTypeTableEntry_NAMETERMINATOR) + " but got " + fmt.Sprintf("%d", nameTerminator))
+	}
+
+	// Simple Field (typeName)
+	_typeName, _typeNameErr := readBuffer.ReadString("typeName", uint32((typeNameLength)*(8)))
+	if _typeNameErr != nil {
+		return nil, errors.Wrap(_typeNameErr, "Error parsing 'typeName' field of AdsDataTypeTableEntry")
+	}
+	typeName := _typeName
+
+	// Const Field (typeNameTerminator)
+	typeNameTerminator, _typeNameTerminatorErr := readBuffer.ReadUint8("typeNameTerminator", 8)
+	if _typeNameTerminatorErr != nil {
+		return nil, errors.Wrap(_typeNameTerminatorErr, "Error parsing 'typeNameTerminator' field of AdsDataTypeTableEntry")
+	}
+	if typeNameTerminator != AdsDataTypeTableEntry_TYPENAMETERMINATOR {
+		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsDataTypeTableEntry_TYPENAMETERMINATOR) + " but got " + fmt.Sprintf("%d", typeNameTerminator))
+	}
+
+	// Simple Field (comment)
+	_comment, _commentErr := readBuffer.ReadString("comment", uint32((commentLength)*(8)))
+	if _commentErr != nil {
+		return nil, errors.Wrap(_commentErr, "Error parsing 'comment' field of AdsDataTypeTableEntry")
+	}
+	comment := _comment
+
+	// Const Field (commentTerminator)
+	commentTerminator, _commentTerminatorErr := readBuffer.ReadUint8("commentTerminator", 8)
+	if _commentTerminatorErr != nil {
+		return nil, errors.Wrap(_commentTerminatorErr, "Error parsing 'commentTerminator' field of AdsDataTypeTableEntry")
+	}
+	if commentTerminator != AdsDataTypeTableEntry_COMMENTTERMINATOR {
+		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsDataTypeTableEntry_COMMENTTERMINATOR) + " but got " + fmt.Sprintf("%d", commentTerminator))
+	}
+
+	// Array field (arrayInfo)
+	if pullErr := readBuffer.PullContext("arrayInfo", utils.WithRenderAsList(true)); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for arrayInfo")
+	}
+	// Count array
+	arrayInfo := make([]AdsDataTypeArrayInfo, arrayDimensions)
+	// This happens when the size is set conditional to 0
+	if len(arrayInfo) == 0 {
+		arrayInfo = nil
+	}
+	{
+		for curItem := uint16(0); curItem < uint16(arrayDimensions); curItem++ {
+			_item, _err := AdsDataTypeArrayInfoParse(readBuffer)
+			if _err != nil {
+				return nil, errors.Wrap(_err, "Error parsing 'arrayInfo' field of AdsDataTypeTableEntry")
+			}
+			arrayInfo[curItem] = _item.(AdsDataTypeArrayInfo)
+		}
+	}
+	if closeErr := readBuffer.CloseContext("arrayInfo", utils.WithRenderAsList(true)); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for arrayInfo")
+	}
+
+	// Array field (children)
+	if pullErr := readBuffer.PullContext("children", utils.WithRenderAsList(true)); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for children")
+	}
+	// Count array
+	children := make([]AdsDataTypeTableEntry, numChildren)
+	// This happens when the size is set conditional to 0
+	if len(children) == 0 {
+		children = nil
+	}
+	{
+		for curItem := uint16(0); curItem < uint16(numChildren); curItem++ {
+			_item, _err := AdsDataTypeTableEntryParse(readBuffer)
+			if _err != nil {
+				return nil, errors.Wrap(_err, "Error parsing 'children' field of AdsDataTypeTableEntry")
+			}
+			children[curItem] = _item.(AdsDataTypeTableEntry)
+		}
+	}
+	if closeErr := readBuffer.CloseContext("children", utils.WithRenderAsList(true)); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for children")
+	}
+	// Byte Array field (rest)
+	numberOfBytesrest := int(uint16(entryLength) - uint16(curPos))
+	rest, _readArrayErr := readBuffer.ReadByteArray("rest", numberOfBytesrest)
+	if _readArrayErr != nil {
+		return nil, errors.Wrap(_readArrayErr, "Error parsing 'rest' field of AdsDataTypeTableEntry")
+	}
+
+	if closeErr := readBuffer.CloseContext("AdsDataTypeTableEntry"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for AdsDataTypeTableEntry")
+	}
+
+	// Create the instance
+	return &_AdsDataTypeTableEntry{
+		EntryLength:     entryLength,
+		Version:         version,
+		HashValue:       hashValue,
+		TypeHashValue:   typeHashValue,
+		Size:            size,
+		Offs:            offs,
+		DataType:        dataType,
+		Flags:           flags,
+		ArrayDimensions: arrayDimensions,
+		NumChildren:     numChildren,
+		Name:            name,
+		TypeName:        typeName,
+		Comment:         comment,
+		ArrayInfo:       arrayInfo,
+		Children:        children,
+		Rest:            rest,
+	}, nil
+}
+
+func (m *_AdsDataTypeTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	if pushErr := writeBuffer.PushContext("AdsDataTypeTableEntry"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for AdsDataTypeTableEntry")
+	}
+
+	// Simple Field (entryLength)
+	entryLength := uint32(m.GetEntryLength())
+	_entryLengthErr := writeBuffer.WriteUint32("entryLength", 32, (entryLength))
+	if _entryLengthErr != nil {
+		return errors.Wrap(_entryLengthErr, "Error serializing 'entryLength' field")
+	}
+
+	// Simple Field (version)
+	version := uint32(m.GetVersion())
+	_versionErr := writeBuffer.WriteUint32("version", 32, (version))
+	if _versionErr != nil {
+		return errors.Wrap(_versionErr, "Error serializing 'version' field")
+	}
+
+	// Simple Field (hashValue)
+	hashValue := uint32(m.GetHashValue())
+	_hashValueErr := writeBuffer.WriteUint32("hashValue", 32, (hashValue))
+	if _hashValueErr != nil {
+		return errors.Wrap(_hashValueErr, "Error serializing 'hashValue' field")
+	}
+
+	// Simple Field (typeHashValue)
+	typeHashValue := uint32(m.GetTypeHashValue())
+	_typeHashValueErr := writeBuffer.WriteUint32("typeHashValue", 32, (typeHashValue))
+	if _typeHashValueErr != nil {
+		return errors.Wrap(_typeHashValueErr, "Error serializing 'typeHashValue' field")
+	}
+
+	// Simple Field (size)
+	size := uint32(m.GetSize())
+	_sizeErr := writeBuffer.WriteUint32("size", 32, (size))
+	if _sizeErr != nil {
+		return errors.Wrap(_sizeErr, "Error serializing 'size' field")
+	}
+
+	// Simple Field (offs)
+	offs := uint32(m.GetOffs())
+	_offsErr := writeBuffer.WriteUint32("offs", 32, (offs))
+	if _offsErr != nil {
+		return errors.Wrap(_offsErr, "Error serializing 'offs' field")
+	}
+
+	// Simple Field (dataType)
+	dataType := uint32(m.GetDataType())
+	_dataTypeErr := writeBuffer.WriteUint32("dataType", 32, (dataType))
+	if _dataTypeErr != nil {
+		return errors.Wrap(_dataTypeErr, "Error serializing 'dataType' field")
+	}
+
+	// Simple Field (flags)
+	flags := uint32(m.GetFlags())
+	_flagsErr := writeBuffer.WriteUint32("flags", 32, (flags))
+	if _flagsErr != nil {
+		return errors.Wrap(_flagsErr, "Error serializing 'flags' field")
+	}
+
+	// Implicit Field (nameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	nameLength := uint16(GetSTR_LEN()(m.GetName()))
+	_nameLengthErr := writeBuffer.WriteUint16("nameLength", 16, (nameLength))
+	if _nameLengthErr != nil {
+		return errors.Wrap(_nameLengthErr, "Error serializing 'nameLength' field")
+	}
+
+	// Implicit Field (typeNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	typeNameLength := uint16(GetSTR_LEN()(m.GetTypeName()))
+	_typeNameLengthErr := writeBuffer.WriteUint16("typeNameLength", 16, (typeNameLength))
+	if _typeNameLengthErr != nil {
+		return errors.Wrap(_typeNameLengthErr, "Error serializing 'typeNameLength' field")
+	}
+
+	// Implicit Field (commentLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	commentLength := uint16(GetSTR_LEN()(m.GetComment()))
+	_commentLengthErr := writeBuffer.WriteUint16("commentLength", 16, (commentLength))
+	if _commentLengthErr != nil {
+		return errors.Wrap(_commentLengthErr, "Error serializing 'commentLength' field")
+	}
+
+	// Simple Field (arrayDimensions)
+	arrayDimensions := uint16(m.GetArrayDimensions())
+	_arrayDimensionsErr := writeBuffer.WriteUint16("arrayDimensions", 16, (arrayDimensions))
+	if _arrayDimensionsErr != nil {
+		return errors.Wrap(_arrayDimensionsErr, "Error serializing 'arrayDimensions' field")
+	}
+
+	// Simple Field (numChildren)
+	numChildren := uint16(m.GetNumChildren())
+	_numChildrenErr := writeBuffer.WriteUint16("numChildren", 16, (numChildren))
+	if _numChildrenErr != nil {
+		return errors.Wrap(_numChildrenErr, "Error serializing 'numChildren' field")
+	}
+
+	// Simple Field (name)
+	name := string(m.GetName())
+	_nameErr := writeBuffer.WriteString("name", uint32((GetSTR_LEN()(m.GetName()))*(8)), "UTF-8", (name))
+	if _nameErr != nil {
+		return errors.Wrap(_nameErr, "Error serializing 'name' field")
+	}
+
+	// Const Field (nameTerminator)
+	_nameTerminatorErr := writeBuffer.WriteUint8("nameTerminator", 8, 0x00)
+	if _nameTerminatorErr != nil {
+		return errors.Wrap(_nameTerminatorErr, "Error serializing 'nameTerminator' field")
+	}
+
+	// Simple Field (typeName)
+	typeName := string(m.GetTypeName())
+	_typeNameErr := writeBuffer.WriteString("typeName", uint32((GetSTR_LEN()(m.GetTypeName()))*(8)), "UTF-8", (typeName))
+	if _typeNameErr != nil {
+		return errors.Wrap(_typeNameErr, "Error serializing 'typeName' field")
+	}
+
+	// Const Field (typeNameTerminator)
+	_typeNameTerminatorErr := writeBuffer.WriteUint8("typeNameTerminator", 8, 0x00)
+	if _typeNameTerminatorErr != nil {
+		return errors.Wrap(_typeNameTerminatorErr, "Error serializing 'typeNameTerminator' field")
+	}
+
+	// Simple Field (comment)
+	comment := string(m.GetComment())
+	_commentErr := writeBuffer.WriteString("comment", uint32((GetSTR_LEN()(m.GetComment()))*(8)), "UTF-8", (comment))
+	if _commentErr != nil {
+		return errors.Wrap(_commentErr, "Error serializing 'comment' field")
+	}
+
+	// Const Field (commentTerminator)
+	_commentTerminatorErr := writeBuffer.WriteUint8("commentTerminator", 8, 0x00)
+	if _commentTerminatorErr != nil {
+		return errors.Wrap(_commentTerminatorErr, "Error serializing 'commentTerminator' field")
+	}
+
+	// Array Field (arrayInfo)
+	if pushErr := writeBuffer.PushContext("arrayInfo", utils.WithRenderAsList(true)); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for arrayInfo")
+	}
+	for _, _element := range m.GetArrayInfo() {
+		_elementErr := writeBuffer.WriteSerializable(_element)
+		if _elementErr != nil {
+			return errors.Wrap(_elementErr, "Error serializing 'arrayInfo' field")
+		}
+	}
+	if popErr := writeBuffer.PopContext("arrayInfo", utils.WithRenderAsList(true)); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for arrayInfo")
+	}
+
+	// Array Field (children)
+	if pushErr := writeBuffer.PushContext("children", utils.WithRenderAsList(true)); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for children")
+	}
+	for _, _element := range m.GetChildren() {
+		_elementErr := writeBuffer.WriteSerializable(_element)
+		if _elementErr != nil {
+			return errors.Wrap(_elementErr, "Error serializing 'children' field")
+		}
+	}
+	if popErr := writeBuffer.PopContext("children", utils.WithRenderAsList(true)); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for children")
+	}
+
+	// Array Field (rest)
+	// Byte Array field (rest)
+	if err := writeBuffer.WriteByteArray("rest", m.GetRest()); err != nil {
+		return errors.Wrap(err, "Error serializing 'rest' field")
+	}
+
+	if popErr := writeBuffer.PopContext("AdsDataTypeTableEntry"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for AdsDataTypeTableEntry")
+	}
+	return nil
+}
+
+func (m *_AdsDataTypeTableEntry) isAdsDataTypeTableEntry() bool {
+	return true
+}
+
+func (m *_AdsDataTypeTableEntry) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsSignificantGroupAddresses.go b/plc4go/protocols/ads/readwrite/model/AdsSignificantGroupAddresses.go
new file mode 100644
index 000000000..8f70a6bba
--- /dev/null
+++ b/plc4go/protocols/ads/readwrite/model/AdsSignificantGroupAddresses.go
@@ -0,0 +1,137 @@
+/*
+ * 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 (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// AdsSignificantGroupAddresses is an enum
+type AdsSignificantGroupAddresses uint32
+
+type IAdsSignificantGroupAddresses interface {
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	AdsSignificantGroupAddresses_SYMBOL_TABLE    AdsSignificantGroupAddresses = 0x0000F00B
+	AdsSignificantGroupAddresses_DATA_TYPE_TABLE AdsSignificantGroupAddresses = 0x0000F00E
+	AdsSignificantGroupAddresses_TABLE_SIZES     AdsSignificantGroupAddresses = 0x0000F00F
+)
+
+var AdsSignificantGroupAddressesValues []AdsSignificantGroupAddresses
+
+func init() {
+	_ = errors.New
+	AdsSignificantGroupAddressesValues = []AdsSignificantGroupAddresses{
+		AdsSignificantGroupAddresses_SYMBOL_TABLE,
+		AdsSignificantGroupAddresses_DATA_TYPE_TABLE,
+		AdsSignificantGroupAddresses_TABLE_SIZES,
+	}
+}
+
+func AdsSignificantGroupAddressesByValue(value uint32) (enum AdsSignificantGroupAddresses, ok bool) {
+	switch value {
+	case 0x0000F00B:
+		return AdsSignificantGroupAddresses_SYMBOL_TABLE, true
+	case 0x0000F00E:
+		return AdsSignificantGroupAddresses_DATA_TYPE_TABLE, true
+	case 0x0000F00F:
+		return AdsSignificantGroupAddresses_TABLE_SIZES, true
+	}
+	return 0, false
+}
+
+func AdsSignificantGroupAddressesByName(value string) (enum AdsSignificantGroupAddresses, ok bool) {
+	switch value {
+	case "SYMBOL_TABLE":
+		return AdsSignificantGroupAddresses_SYMBOL_TABLE, true
+	case "DATA_TYPE_TABLE":
+		return AdsSignificantGroupAddresses_DATA_TYPE_TABLE, true
+	case "TABLE_SIZES":
+		return AdsSignificantGroupAddresses_TABLE_SIZES, true
+	}
+	return 0, false
+}
+
+func AdsSignificantGroupAddressesKnows(value uint32) bool {
+	for _, typeValue := range AdsSignificantGroupAddressesValues {
+		if uint32(typeValue) == value {
+			return true
+		}
+	}
+	return false
+}
+
+func CastAdsSignificantGroupAddresses(structType interface{}) AdsSignificantGroupAddresses {
+	castFunc := func(typ interface{}) AdsSignificantGroupAddresses {
+		if sAdsSignificantGroupAddresses, ok := typ.(AdsSignificantGroupAddresses); ok {
+			return sAdsSignificantGroupAddresses
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m AdsSignificantGroupAddresses) GetLengthInBits() uint16 {
+	return 32
+}
+
+func (m AdsSignificantGroupAddresses) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func AdsSignificantGroupAddressesParse(readBuffer utils.ReadBuffer) (AdsSignificantGroupAddresses, error) {
+	val, err := readBuffer.ReadUint32("AdsSignificantGroupAddresses", 32)
+	if err != nil {
+		return 0, errors.Wrap(err, "error reading AdsSignificantGroupAddresses")
+	}
+	if enum, ok := AdsSignificantGroupAddressesByValue(val); !ok {
+		log.Debug().Msgf("no value %x found for RequestType", val)
+		return AdsSignificantGroupAddresses(val), nil
+	} else {
+		return enum, nil
+	}
+}
+
+func (e AdsSignificantGroupAddresses) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint32("AdsSignificantGroupAddresses", 32, uint32(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
+}
+
+// PLC4XEnumName returns the name that is used in code to identify this enum
+func (e AdsSignificantGroupAddresses) PLC4XEnumName() string {
+	switch e {
+	case AdsSignificantGroupAddresses_SYMBOL_TABLE:
+		return "SYMBOL_TABLE"
+	case AdsSignificantGroupAddresses_DATA_TYPE_TABLE:
+		return "DATA_TYPE_TABLE"
+	case AdsSignificantGroupAddresses_TABLE_SIZES:
+		return "TABLE_SIZES"
+	}
+	return ""
+}
+
+func (e AdsSignificantGroupAddresses) String() string {
+	return e.PLC4XEnumName()
+}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
new file mode 100644
index 000000000..6c4a3920a
--- /dev/null
+++ b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
@@ -0,0 +1,896 @@
+/*
+ * 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 (
+	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// Constant values.
+const AdsSymbolTableEntry_NAMETERMINATOR uint8 = 0x00
+const AdsSymbolTableEntry_TYPENAMETERMINATOR uint8 = 0x00
+const AdsSymbolTableEntry_COMMENTTERMINATOR uint8 = 0x00
+
+// AdsSymbolTableEntry is the corresponding interface of AdsSymbolTableEntry
+type AdsSymbolTableEntry interface {
+	utils.LengthAware
+	utils.Serializable
+	// GetEntryLength returns EntryLength (property field)
+	GetEntryLength() uint32
+	// GetGroup returns Group (property field)
+	GetGroup() uint32
+	// GetOffset returns Offset (property field)
+	GetOffset() uint32
+	// GetSize returns Size (property field)
+	GetSize() uint32
+	// GetDataType returns DataType (property field)
+	GetDataType() uint32
+	// GetFlagMethodDeref returns FlagMethodDeref (property field)
+	GetFlagMethodDeref() bool
+	// GetFlagItfMethodAccess returns FlagItfMethodAccess (property field)
+	GetFlagItfMethodAccess() bool
+	// GetFlagReadOnly returns FlagReadOnly (property field)
+	GetFlagReadOnly() bool
+	// GetFlagTComInterfacePointer returns FlagTComInterfacePointer (property field)
+	GetFlagTComInterfacePointer() bool
+	// GetFlagTypeGuid returns FlagTypeGuid (property field)
+	GetFlagTypeGuid() bool
+	// GetFlagReferenceTo returns FlagReferenceTo (property field)
+	GetFlagReferenceTo() bool
+	// GetFlagBitValue returns FlagBitValue (property field)
+	GetFlagBitValue() bool
+	// GetFlagPersistent returns FlagPersistent (property field)
+	GetFlagPersistent() bool
+	// GetFlagExtendedFlags returns FlagExtendedFlags (property field)
+	GetFlagExtendedFlags() bool
+	// GetFlagInitOnReset returns FlagInitOnReset (property field)
+	GetFlagInitOnReset() bool
+	// GetFlagStatic returns FlagStatic (property field)
+	GetFlagStatic() bool
+	// GetFlagAttributes returns FlagAttributes (property field)
+	GetFlagAttributes() bool
+	// GetFlagContextMask returns FlagContextMask (property field)
+	GetFlagContextMask() bool
+	// GetName returns Name (property field)
+	GetName() string
+	// GetTypeName returns TypeName (property field)
+	GetTypeName() string
+	// GetComment returns Comment (property field)
+	GetComment() string
+	// GetRest returns Rest (property field)
+	GetRest() []byte
+}
+
+// AdsSymbolTableEntryExactly can be used when we want exactly this type and not a type which fulfills AdsSymbolTableEntry.
+// This is useful for switch cases.
+type AdsSymbolTableEntryExactly interface {
+	AdsSymbolTableEntry
+	isAdsSymbolTableEntry() bool
+}
+
+// _AdsSymbolTableEntry is the data-structure of this message
+type _AdsSymbolTableEntry struct {
+	EntryLength              uint32
+	Group                    uint32
+	Offset                   uint32
+	Size                     uint32
+	DataType                 uint32
+	FlagMethodDeref          bool
+	FlagItfMethodAccess      bool
+	FlagReadOnly             bool
+	FlagTComInterfacePointer bool
+	FlagTypeGuid             bool
+	FlagReferenceTo          bool
+	FlagBitValue             bool
+	FlagPersistent           bool
+	FlagExtendedFlags        bool
+	FlagInitOnReset          bool
+	FlagStatic               bool
+	FlagAttributes           bool
+	FlagContextMask          bool
+	Name                     string
+	TypeName                 string
+	Comment                  string
+	Rest                     []byte
+	// Reserved Fields
+	reservedField0 *uint8
+	reservedField1 *uint16
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_AdsSymbolTableEntry) GetEntryLength() uint32 {
+	return m.EntryLength
+}
+
+func (m *_AdsSymbolTableEntry) GetGroup() uint32 {
+	return m.Group
+}
+
+func (m *_AdsSymbolTableEntry) GetOffset() uint32 {
+	return m.Offset
+}
+
+func (m *_AdsSymbolTableEntry) GetSize() uint32 {
+	return m.Size
+}
+
+func (m *_AdsSymbolTableEntry) GetDataType() uint32 {
+	return m.DataType
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagMethodDeref() bool {
+	return m.FlagMethodDeref
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagItfMethodAccess() bool {
+	return m.FlagItfMethodAccess
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagReadOnly() bool {
+	return m.FlagReadOnly
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagTComInterfacePointer() bool {
+	return m.FlagTComInterfacePointer
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagTypeGuid() bool {
+	return m.FlagTypeGuid
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagReferenceTo() bool {
+	return m.FlagReferenceTo
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagBitValue() bool {
+	return m.FlagBitValue
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagPersistent() bool {
+	return m.FlagPersistent
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagExtendedFlags() bool {
+	return m.FlagExtendedFlags
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagInitOnReset() bool {
+	return m.FlagInitOnReset
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagStatic() bool {
+	return m.FlagStatic
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagAttributes() bool {
+	return m.FlagAttributes
+}
+
+func (m *_AdsSymbolTableEntry) GetFlagContextMask() bool {
+	return m.FlagContextMask
+}
+
+func (m *_AdsSymbolTableEntry) GetName() string {
+	return m.Name
+}
+
+func (m *_AdsSymbolTableEntry) GetTypeName() string {
+	return m.TypeName
+}
+
+func (m *_AdsSymbolTableEntry) GetComment() string {
+	return m.Comment
+}
+
+func (m *_AdsSymbolTableEntry) GetRest() []byte {
+	return m.Rest
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for const fields.
+///////////////////////
+
+func (m *_AdsSymbolTableEntry) GetNameTerminator() uint8 {
+	return AdsSymbolTableEntry_NAMETERMINATOR
+}
+
+func (m *_AdsSymbolTableEntry) GetTypeNameTerminator() uint8 {
+	return AdsSymbolTableEntry_TYPENAMETERMINATOR
+}
+
+func (m *_AdsSymbolTableEntry) GetCommentTerminator() uint8 {
+	return AdsSymbolTableEntry_COMMENTTERMINATOR
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewAdsSymbolTableEntry factory function for _AdsSymbolTableEntry
+func NewAdsSymbolTableEntry(entryLength uint32, group uint32, offset uint32, size uint32, dataType uint32, flagMethodDeref bool, flagItfMethodAccess bool, flagReadOnly bool, flagTComInterfacePointer bool, flagTypeGuid bool, flagReferenceTo bool, flagBitValue bool, flagPersistent bool, flagExtendedFlags bool, flagInitOnReset bool, flagStatic bool, flagAttributes bool, flagContextMask bool, name string, typeName string, comment string, rest []byte) *_AdsSymbolTableEntry {
+	return &_AdsSymbolTableEntry{EntryLength: entryLength, Group: group, Offset: offset, Size: size, DataType: dataType, FlagMethodDeref: flagMethodDeref, FlagItfMethodAccess: flagItfMethodAccess, FlagReadOnly: flagReadOnly, FlagTComInterfacePointer: flagTComInterfacePointer, FlagTypeGuid: flagTypeGuid, FlagReferenceTo: flagReferenceTo, FlagBitValue: flagBitValue, FlagPersistent: flagPersistent, FlagExtendedFlags: flagExtendedFlags, FlagInitOnReset: flagInitOnReset, FlagStatic: flagStatic,  [...]
+}
+
+// Deprecated: use the interface for direct cast
+func CastAdsSymbolTableEntry(structType interface{}) AdsSymbolTableEntry {
+	if casted, ok := structType.(AdsSymbolTableEntry); ok {
+		return casted
+	}
+	if casted, ok := structType.(*AdsSymbolTableEntry); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_AdsSymbolTableEntry) GetTypeName() string {
+	return "AdsSymbolTableEntry"
+}
+
+func (m *_AdsSymbolTableEntry) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_AdsSymbolTableEntry) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (entryLength)
+	lengthInBits += 32
+
+	// Simple field (group)
+	lengthInBits += 32
+
+	// Simple field (offset)
+	lengthInBits += 32
+
+	// Simple field (size)
+	lengthInBits += 32
+
+	// Simple field (dataType)
+	lengthInBits += 32
+
+	// Simple field (flagMethodDeref)
+	lengthInBits += 1
+
+	// Simple field (flagItfMethodAccess)
+	lengthInBits += 1
+
+	// Simple field (flagReadOnly)
+	lengthInBits += 1
+
+	// Simple field (flagTComInterfacePointer)
+	lengthInBits += 1
+
+	// Simple field (flagTypeGuid)
+	lengthInBits += 1
+
+	// Simple field (flagReferenceTo)
+	lengthInBits += 1
+
+	// Simple field (flagBitValue)
+	lengthInBits += 1
+
+	// Simple field (flagPersistent)
+	lengthInBits += 1
+
+	// Reserved Field (reserved)
+	lengthInBits += 3
+
+	// Simple field (flagExtendedFlags)
+	lengthInBits += 1
+
+	// Simple field (flagInitOnReset)
+	lengthInBits += 1
+
+	// Simple field (flagStatic)
+	lengthInBits += 1
+
+	// Simple field (flagAttributes)
+	lengthInBits += 1
+
+	// Simple field (flagContextMask)
+	lengthInBits += 1
+
+	// Reserved Field (reserved)
+	lengthInBits += 16
+
+	// Implicit Field (nameLength)
+	lengthInBits += 16
+
+	// Implicit Field (typeNameLength)
+	lengthInBits += 16
+
+	// Implicit Field (commentLength)
+	lengthInBits += 16
+
+	// Simple field (name)
+	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetName())) * int32(int32(8)))
+
+	// Const Field (nameTerminator)
+	lengthInBits += 8
+
+	// Simple field (typeName)
+	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetTypeName())) * int32(int32(8)))
+
+	// Const Field (typeNameTerminator)
+	lengthInBits += 8
+
+	// Simple field (comment)
+	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetComment())) * int32(int32(8)))
+
+	// Const Field (commentTerminator)
+	lengthInBits += 8
+
+	// Array field
+	if len(m.Rest) > 0 {
+		lengthInBits += 8 * uint16(len(m.Rest))
+	}
+
+	return lengthInBits
+}
+
+func (m *_AdsSymbolTableEntry) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("AdsSymbolTableEntry"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for AdsSymbolTableEntry")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+	var startPos = positionAware.GetPos()
+	var curPos uint16
+
+	// Simple Field (entryLength)
+	_entryLength, _entryLengthErr := readBuffer.ReadUint32("entryLength", 32)
+	if _entryLengthErr != nil {
+		return nil, errors.Wrap(_entryLengthErr, "Error parsing 'entryLength' field of AdsSymbolTableEntry")
+	}
+	entryLength := _entryLength
+
+	// Simple Field (group)
+	_group, _groupErr := readBuffer.ReadUint32("group", 32)
+	if _groupErr != nil {
+		return nil, errors.Wrap(_groupErr, "Error parsing 'group' field of AdsSymbolTableEntry")
+	}
+	group := _group
+
+	// Simple Field (offset)
+	_offset, _offsetErr := readBuffer.ReadUint32("offset", 32)
+	if _offsetErr != nil {
+		return nil, errors.Wrap(_offsetErr, "Error parsing 'offset' field of AdsSymbolTableEntry")
+	}
+	offset := _offset
+
+	// Simple Field (size)
+	_size, _sizeErr := readBuffer.ReadUint32("size", 32)
+	if _sizeErr != nil {
+		return nil, errors.Wrap(_sizeErr, "Error parsing 'size' field of AdsSymbolTableEntry")
+	}
+	size := _size
+
+	// Simple Field (dataType)
+	_dataType, _dataTypeErr := readBuffer.ReadUint32("dataType", 32)
+	if _dataTypeErr != nil {
+		return nil, errors.Wrap(_dataTypeErr, "Error parsing 'dataType' field of AdsSymbolTableEntry")
+	}
+	dataType := _dataType
+
+	// Simple Field (flagMethodDeref)
+	_flagMethodDeref, _flagMethodDerefErr := readBuffer.ReadBit("flagMethodDeref")
+	if _flagMethodDerefErr != nil {
+		return nil, errors.Wrap(_flagMethodDerefErr, "Error parsing 'flagMethodDeref' field of AdsSymbolTableEntry")
+	}
+	flagMethodDeref := _flagMethodDeref
+
+	// Simple Field (flagItfMethodAccess)
+	_flagItfMethodAccess, _flagItfMethodAccessErr := readBuffer.ReadBit("flagItfMethodAccess")
+	if _flagItfMethodAccessErr != nil {
+		return nil, errors.Wrap(_flagItfMethodAccessErr, "Error parsing 'flagItfMethodAccess' field of AdsSymbolTableEntry")
+	}
+	flagItfMethodAccess := _flagItfMethodAccess
+
+	// Simple Field (flagReadOnly)
+	_flagReadOnly, _flagReadOnlyErr := readBuffer.ReadBit("flagReadOnly")
+	if _flagReadOnlyErr != nil {
+		return nil, errors.Wrap(_flagReadOnlyErr, "Error parsing 'flagReadOnly' field of AdsSymbolTableEntry")
+	}
+	flagReadOnly := _flagReadOnly
+
+	// Simple Field (flagTComInterfacePointer)
+	_flagTComInterfacePointer, _flagTComInterfacePointerErr := readBuffer.ReadBit("flagTComInterfacePointer")
+	if _flagTComInterfacePointerErr != nil {
+		return nil, errors.Wrap(_flagTComInterfacePointerErr, "Error parsing 'flagTComInterfacePointer' field of AdsSymbolTableEntry")
+	}
+	flagTComInterfacePointer := _flagTComInterfacePointer
+
+	// Simple Field (flagTypeGuid)
+	_flagTypeGuid, _flagTypeGuidErr := readBuffer.ReadBit("flagTypeGuid")
+	if _flagTypeGuidErr != nil {
+		return nil, errors.Wrap(_flagTypeGuidErr, "Error parsing 'flagTypeGuid' field of AdsSymbolTableEntry")
+	}
+	flagTypeGuid := _flagTypeGuid
+
+	// Simple Field (flagReferenceTo)
+	_flagReferenceTo, _flagReferenceToErr := readBuffer.ReadBit("flagReferenceTo")
+	if _flagReferenceToErr != nil {
+		return nil, errors.Wrap(_flagReferenceToErr, "Error parsing 'flagReferenceTo' field of AdsSymbolTableEntry")
+	}
+	flagReferenceTo := _flagReferenceTo
+
+	// Simple Field (flagBitValue)
+	_flagBitValue, _flagBitValueErr := readBuffer.ReadBit("flagBitValue")
+	if _flagBitValueErr != nil {
+		return nil, errors.Wrap(_flagBitValueErr, "Error parsing 'flagBitValue' field of AdsSymbolTableEntry")
+	}
+	flagBitValue := _flagBitValue
+
+	// Simple Field (flagPersistent)
+	_flagPersistent, _flagPersistentErr := readBuffer.ReadBit("flagPersistent")
+	if _flagPersistentErr != nil {
+		return nil, errors.Wrap(_flagPersistentErr, "Error parsing 'flagPersistent' field of AdsSymbolTableEntry")
+	}
+	flagPersistent := _flagPersistent
+
+	var reservedField0 *uint8
+	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+	{
+		reserved, _err := readBuffer.ReadUint8("reserved", 3)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'reserved' field of AdsSymbolTableEntry")
+		}
+		if reserved != uint8(0x00) {
+			log.Info().Fields(map[string]interface{}{
+				"expected value": uint8(0x00),
+				"got value":      reserved,
+			}).Msg("Got unexpected response for reserved field.")
+			// We save the value, so it can be re-serialized
+			reservedField0 = &reserved
+		}
+	}
+
+	// Simple Field (flagExtendedFlags)
+	_flagExtendedFlags, _flagExtendedFlagsErr := readBuffer.ReadBit("flagExtendedFlags")
+	if _flagExtendedFlagsErr != nil {
+		return nil, errors.Wrap(_flagExtendedFlagsErr, "Error parsing 'flagExtendedFlags' field of AdsSymbolTableEntry")
+	}
+	flagExtendedFlags := _flagExtendedFlags
+
+	// Simple Field (flagInitOnReset)
+	_flagInitOnReset, _flagInitOnResetErr := readBuffer.ReadBit("flagInitOnReset")
+	if _flagInitOnResetErr != nil {
+		return nil, errors.Wrap(_flagInitOnResetErr, "Error parsing 'flagInitOnReset' field of AdsSymbolTableEntry")
+	}
+	flagInitOnReset := _flagInitOnReset
+
+	// Simple Field (flagStatic)
+	_flagStatic, _flagStaticErr := readBuffer.ReadBit("flagStatic")
+	if _flagStaticErr != nil {
+		return nil, errors.Wrap(_flagStaticErr, "Error parsing 'flagStatic' field of AdsSymbolTableEntry")
+	}
+	flagStatic := _flagStatic
+
+	// Simple Field (flagAttributes)
+	_flagAttributes, _flagAttributesErr := readBuffer.ReadBit("flagAttributes")
+	if _flagAttributesErr != nil {
+		return nil, errors.Wrap(_flagAttributesErr, "Error parsing 'flagAttributes' field of AdsSymbolTableEntry")
+	}
+	flagAttributes := _flagAttributes
+
+	// Simple Field (flagContextMask)
+	_flagContextMask, _flagContextMaskErr := readBuffer.ReadBit("flagContextMask")
+	if _flagContextMaskErr != nil {
+		return nil, errors.Wrap(_flagContextMaskErr, "Error parsing 'flagContextMask' field of AdsSymbolTableEntry")
+	}
+	flagContextMask := _flagContextMask
+
+	var reservedField1 *uint16
+	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+	{
+		reserved, _err := readBuffer.ReadUint16("reserved", 16)
+		if _err != nil {
+			return nil, errors.Wrap(_err, "Error parsing 'reserved' field of AdsSymbolTableEntry")
+		}
+		if reserved != uint16(0x0000) {
+			log.Info().Fields(map[string]interface{}{
+				"expected value": uint16(0x0000),
+				"got value":      reserved,
+			}).Msg("Got unexpected response for reserved field.")
+			// We save the value, so it can be re-serialized
+			reservedField1 = &reserved
+		}
+	}
+
+	// Implicit Field (nameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+	nameLength, _nameLengthErr := readBuffer.ReadUint16("nameLength", 16)
+	_ = nameLength
+	if _nameLengthErr != nil {
+		return nil, errors.Wrap(_nameLengthErr, "Error parsing 'nameLength' field of AdsSymbolTableEntry")
+	}
+
+	// Implicit Field (typeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+	typeNameLength, _typeNameLengthErr := readBuffer.ReadUint16("typeNameLength", 16)
+	_ = typeNameLength
+	if _typeNameLengthErr != nil {
+		return nil, errors.Wrap(_typeNameLengthErr, "Error parsing 'typeNameLength' field of AdsSymbolTableEntry")
+	}
+
+	// Implicit Field (commentLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+	commentLength, _commentLengthErr := readBuffer.ReadUint16("commentLength", 16)
+	_ = commentLength
+	if _commentLengthErr != nil {
+		return nil, errors.Wrap(_commentLengthErr, "Error parsing 'commentLength' field of AdsSymbolTableEntry")
+	}
+
+	// Simple Field (name)
+	_name, _nameErr := readBuffer.ReadString("name", uint32((nameLength)*(8)))
+	if _nameErr != nil {
+		return nil, errors.Wrap(_nameErr, "Error parsing 'name' field of AdsSymbolTableEntry")
+	}
+	name := _name
+
+	// Const Field (nameTerminator)
+	nameTerminator, _nameTerminatorErr := readBuffer.ReadUint8("nameTerminator", 8)
+	if _nameTerminatorErr != nil {
+		return nil, errors.Wrap(_nameTerminatorErr, "Error parsing 'nameTerminator' field of AdsSymbolTableEntry")
+	}
+	if nameTerminator != AdsSymbolTableEntry_NAMETERMINATOR {
+		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsSymbolTableEntry_NAMETERMINATOR) + " but got " + fmt.Sprintf("%d", nameTerminator))
+	}
+
+	// Simple Field (typeName)
+	_typeName, _typeNameErr := readBuffer.ReadString("typeName", uint32((typeNameLength)*(8)))
+	if _typeNameErr != nil {
+		return nil, errors.Wrap(_typeNameErr, "Error parsing 'typeName' field of AdsSymbolTableEntry")
+	}
+	typeName := _typeName
+
+	// Const Field (typeNameTerminator)
+	typeNameTerminator, _typeNameTerminatorErr := readBuffer.ReadUint8("typeNameTerminator", 8)
+	if _typeNameTerminatorErr != nil {
+		return nil, errors.Wrap(_typeNameTerminatorErr, "Error parsing 'typeNameTerminator' field of AdsSymbolTableEntry")
+	}
+	if typeNameTerminator != AdsSymbolTableEntry_TYPENAMETERMINATOR {
+		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsSymbolTableEntry_TYPENAMETERMINATOR) + " but got " + fmt.Sprintf("%d", typeNameTerminator))
+	}
+
+	// Simple Field (comment)
+	_comment, _commentErr := readBuffer.ReadString("comment", uint32((commentLength)*(8)))
+	if _commentErr != nil {
+		return nil, errors.Wrap(_commentErr, "Error parsing 'comment' field of AdsSymbolTableEntry")
+	}
+	comment := _comment
+
+	// Const Field (commentTerminator)
+	commentTerminator, _commentTerminatorErr := readBuffer.ReadUint8("commentTerminator", 8)
+	if _commentTerminatorErr != nil {
+		return nil, errors.Wrap(_commentTerminatorErr, "Error parsing 'commentTerminator' field of AdsSymbolTableEntry")
+	}
+	if commentTerminator != AdsSymbolTableEntry_COMMENTTERMINATOR {
+		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsSymbolTableEntry_COMMENTTERMINATOR) + " but got " + fmt.Sprintf("%d", commentTerminator))
+	}
+	// Byte Array field (rest)
+	numberOfBytesrest := int(uint16(entryLength) - uint16(curPos))
+	rest, _readArrayErr := readBuffer.ReadByteArray("rest", numberOfBytesrest)
+	if _readArrayErr != nil {
+		return nil, errors.Wrap(_readArrayErr, "Error parsing 'rest' field of AdsSymbolTableEntry")
+	}
+
+	if closeErr := readBuffer.CloseContext("AdsSymbolTableEntry"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for AdsSymbolTableEntry")
+	}
+
+	// Create the instance
+	return &_AdsSymbolTableEntry{
+		EntryLength:              entryLength,
+		Group:                    group,
+		Offset:                   offset,
+		Size:                     size,
+		DataType:                 dataType,
+		FlagMethodDeref:          flagMethodDeref,
+		FlagItfMethodAccess:      flagItfMethodAccess,
+		FlagReadOnly:             flagReadOnly,
+		FlagTComInterfacePointer: flagTComInterfacePointer,
+		FlagTypeGuid:             flagTypeGuid,
+		FlagReferenceTo:          flagReferenceTo,
+		FlagBitValue:             flagBitValue,
+		FlagPersistent:           flagPersistent,
+		FlagExtendedFlags:        flagExtendedFlags,
+		FlagInitOnReset:          flagInitOnReset,
+		FlagStatic:               flagStatic,
+		FlagAttributes:           flagAttributes,
+		FlagContextMask:          flagContextMask,
+		Name:                     name,
+		TypeName:                 typeName,
+		Comment:                  comment,
+		Rest:                     rest,
+		reservedField0:           reservedField0,
+		reservedField1:           reservedField1,
+	}, nil
+}
+
+func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	if pushErr := writeBuffer.PushContext("AdsSymbolTableEntry"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for AdsSymbolTableEntry")
+	}
+
+	// Simple Field (entryLength)
+	entryLength := uint32(m.GetEntryLength())
+	_entryLengthErr := writeBuffer.WriteUint32("entryLength", 32, (entryLength))
+	if _entryLengthErr != nil {
+		return errors.Wrap(_entryLengthErr, "Error serializing 'entryLength' field")
+	}
+
+	// Simple Field (group)
+	group := uint32(m.GetGroup())
+	_groupErr := writeBuffer.WriteUint32("group", 32, (group))
+	if _groupErr != nil {
+		return errors.Wrap(_groupErr, "Error serializing 'group' field")
+	}
+
+	// Simple Field (offset)
+	offset := uint32(m.GetOffset())
+	_offsetErr := writeBuffer.WriteUint32("offset", 32, (offset))
+	if _offsetErr != nil {
+		return errors.Wrap(_offsetErr, "Error serializing 'offset' field")
+	}
+
+	// Simple Field (size)
+	size := uint32(m.GetSize())
+	_sizeErr := writeBuffer.WriteUint32("size", 32, (size))
+	if _sizeErr != nil {
+		return errors.Wrap(_sizeErr, "Error serializing 'size' field")
+	}
+
+	// Simple Field (dataType)
+	dataType := uint32(m.GetDataType())
+	_dataTypeErr := writeBuffer.WriteUint32("dataType", 32, (dataType))
+	if _dataTypeErr != nil {
+		return errors.Wrap(_dataTypeErr, "Error serializing 'dataType' field")
+	}
+
+	// Simple Field (flagMethodDeref)
+	flagMethodDeref := bool(m.GetFlagMethodDeref())
+	_flagMethodDerefErr := writeBuffer.WriteBit("flagMethodDeref", (flagMethodDeref))
+	if _flagMethodDerefErr != nil {
+		return errors.Wrap(_flagMethodDerefErr, "Error serializing 'flagMethodDeref' field")
+	}
+
+	// Simple Field (flagItfMethodAccess)
+	flagItfMethodAccess := bool(m.GetFlagItfMethodAccess())
+	_flagItfMethodAccessErr := writeBuffer.WriteBit("flagItfMethodAccess", (flagItfMethodAccess))
+	if _flagItfMethodAccessErr != nil {
+		return errors.Wrap(_flagItfMethodAccessErr, "Error serializing 'flagItfMethodAccess' field")
+	}
+
+	// Simple Field (flagReadOnly)
+	flagReadOnly := bool(m.GetFlagReadOnly())
+	_flagReadOnlyErr := writeBuffer.WriteBit("flagReadOnly", (flagReadOnly))
+	if _flagReadOnlyErr != nil {
+		return errors.Wrap(_flagReadOnlyErr, "Error serializing 'flagReadOnly' field")
+	}
+
+	// Simple Field (flagTComInterfacePointer)
+	flagTComInterfacePointer := bool(m.GetFlagTComInterfacePointer())
+	_flagTComInterfacePointerErr := writeBuffer.WriteBit("flagTComInterfacePointer", (flagTComInterfacePointer))
+	if _flagTComInterfacePointerErr != nil {
+		return errors.Wrap(_flagTComInterfacePointerErr, "Error serializing 'flagTComInterfacePointer' field")
+	}
+
+	// Simple Field (flagTypeGuid)
+	flagTypeGuid := bool(m.GetFlagTypeGuid())
+	_flagTypeGuidErr := writeBuffer.WriteBit("flagTypeGuid", (flagTypeGuid))
+	if _flagTypeGuidErr != nil {
+		return errors.Wrap(_flagTypeGuidErr, "Error serializing 'flagTypeGuid' field")
+	}
+
+	// Simple Field (flagReferenceTo)
+	flagReferenceTo := bool(m.GetFlagReferenceTo())
+	_flagReferenceToErr := writeBuffer.WriteBit("flagReferenceTo", (flagReferenceTo))
+	if _flagReferenceToErr != nil {
+		return errors.Wrap(_flagReferenceToErr, "Error serializing 'flagReferenceTo' field")
+	}
+
+	// Simple Field (flagBitValue)
+	flagBitValue := bool(m.GetFlagBitValue())
+	_flagBitValueErr := writeBuffer.WriteBit("flagBitValue", (flagBitValue))
+	if _flagBitValueErr != nil {
+		return errors.Wrap(_flagBitValueErr, "Error serializing 'flagBitValue' field")
+	}
+
+	// Simple Field (flagPersistent)
+	flagPersistent := bool(m.GetFlagPersistent())
+	_flagPersistentErr := writeBuffer.WriteBit("flagPersistent", (flagPersistent))
+	if _flagPersistentErr != nil {
+		return errors.Wrap(_flagPersistentErr, "Error serializing 'flagPersistent' field")
+	}
+
+	// Reserved Field (reserved)
+	{
+		var reserved uint8 = uint8(0x00)
+		if m.reservedField0 != nil {
+			log.Info().Fields(map[string]interface{}{
+				"expected value": uint8(0x00),
+				"got value":      reserved,
+			}).Msg("Overriding reserved field with unexpected value.")
+			reserved = *m.reservedField0
+		}
+		_err := writeBuffer.WriteUint8("reserved", 3, reserved)
+		if _err != nil {
+			return errors.Wrap(_err, "Error serializing 'reserved' field")
+		}
+	}
+
+	// Simple Field (flagExtendedFlags)
+	flagExtendedFlags := bool(m.GetFlagExtendedFlags())
+	_flagExtendedFlagsErr := writeBuffer.WriteBit("flagExtendedFlags", (flagExtendedFlags))
+	if _flagExtendedFlagsErr != nil {
+		return errors.Wrap(_flagExtendedFlagsErr, "Error serializing 'flagExtendedFlags' field")
+	}
+
+	// Simple Field (flagInitOnReset)
+	flagInitOnReset := bool(m.GetFlagInitOnReset())
+	_flagInitOnResetErr := writeBuffer.WriteBit("flagInitOnReset", (flagInitOnReset))
+	if _flagInitOnResetErr != nil {
+		return errors.Wrap(_flagInitOnResetErr, "Error serializing 'flagInitOnReset' field")
+	}
+
+	// Simple Field (flagStatic)
+	flagStatic := bool(m.GetFlagStatic())
+	_flagStaticErr := writeBuffer.WriteBit("flagStatic", (flagStatic))
+	if _flagStaticErr != nil {
+		return errors.Wrap(_flagStaticErr, "Error serializing 'flagStatic' field")
+	}
+
+	// Simple Field (flagAttributes)
+	flagAttributes := bool(m.GetFlagAttributes())
+	_flagAttributesErr := writeBuffer.WriteBit("flagAttributes", (flagAttributes))
+	if _flagAttributesErr != nil {
+		return errors.Wrap(_flagAttributesErr, "Error serializing 'flagAttributes' field")
+	}
+
+	// Simple Field (flagContextMask)
+	flagContextMask := bool(m.GetFlagContextMask())
+	_flagContextMaskErr := writeBuffer.WriteBit("flagContextMask", (flagContextMask))
+	if _flagContextMaskErr != nil {
+		return errors.Wrap(_flagContextMaskErr, "Error serializing 'flagContextMask' field")
+	}
+
+	// Reserved Field (reserved)
+	{
+		var reserved uint16 = uint16(0x0000)
+		if m.reservedField1 != nil {
+			log.Info().Fields(map[string]interface{}{
+				"expected value": uint16(0x0000),
+				"got value":      reserved,
+			}).Msg("Overriding reserved field with unexpected value.")
+			reserved = *m.reservedField1
+		}
+		_err := writeBuffer.WriteUint16("reserved", 16, reserved)
+		if _err != nil {
+			return errors.Wrap(_err, "Error serializing 'reserved' field")
+		}
+	}
+
+	// Implicit Field (nameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	nameLength := uint16(GetSTR_LEN()(m.GetName()))
+	_nameLengthErr := writeBuffer.WriteUint16("nameLength", 16, (nameLength))
+	if _nameLengthErr != nil {
+		return errors.Wrap(_nameLengthErr, "Error serializing 'nameLength' field")
+	}
+
+	// Implicit Field (typeNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	typeNameLength := uint16(GetSTR_LEN()(m.GetTypeName()))
+	_typeNameLengthErr := writeBuffer.WriteUint16("typeNameLength", 16, (typeNameLength))
+	if _typeNameLengthErr != nil {
+		return errors.Wrap(_typeNameLengthErr, "Error serializing 'typeNameLength' field")
+	}
+
+	// Implicit Field (commentLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	commentLength := uint16(GetSTR_LEN()(m.GetComment()))
+	_commentLengthErr := writeBuffer.WriteUint16("commentLength", 16, (commentLength))
+	if _commentLengthErr != nil {
+		return errors.Wrap(_commentLengthErr, "Error serializing 'commentLength' field")
+	}
+
+	// Simple Field (name)
+	name := string(m.GetName())
+	_nameErr := writeBuffer.WriteString("name", uint32((GetSTR_LEN()(m.GetName()))*(8)), "UTF-8", (name))
+	if _nameErr != nil {
+		return errors.Wrap(_nameErr, "Error serializing 'name' field")
+	}
+
+	// Const Field (nameTerminator)
+	_nameTerminatorErr := writeBuffer.WriteUint8("nameTerminator", 8, 0x00)
+	if _nameTerminatorErr != nil {
+		return errors.Wrap(_nameTerminatorErr, "Error serializing 'nameTerminator' field")
+	}
+
+	// Simple Field (typeName)
+	typeName := string(m.GetTypeName())
+	_typeNameErr := writeBuffer.WriteString("typeName", uint32((GetSTR_LEN()(m.GetTypeName()))*(8)), "UTF-8", (typeName))
+	if _typeNameErr != nil {
+		return errors.Wrap(_typeNameErr, "Error serializing 'typeName' field")
+	}
+
+	// Const Field (typeNameTerminator)
+	_typeNameTerminatorErr := writeBuffer.WriteUint8("typeNameTerminator", 8, 0x00)
+	if _typeNameTerminatorErr != nil {
+		return errors.Wrap(_typeNameTerminatorErr, "Error serializing 'typeNameTerminator' field")
+	}
+
+	// Simple Field (comment)
+	comment := string(m.GetComment())
+	_commentErr := writeBuffer.WriteString("comment", uint32((GetSTR_LEN()(m.GetComment()))*(8)), "UTF-8", (comment))
+	if _commentErr != nil {
+		return errors.Wrap(_commentErr, "Error serializing 'comment' field")
+	}
+
+	// Const Field (commentTerminator)
+	_commentTerminatorErr := writeBuffer.WriteUint8("commentTerminator", 8, 0x00)
+	if _commentTerminatorErr != nil {
+		return errors.Wrap(_commentTerminatorErr, "Error serializing 'commentTerminator' field")
+	}
+
+	// Array Field (rest)
+	// Byte Array field (rest)
+	if err := writeBuffer.WriteByteArray("rest", m.GetRest()); err != nil {
+		return errors.Wrap(err, "Error serializing 'rest' field")
+	}
+
+	if popErr := writeBuffer.PopContext("AdsSymbolTableEntry"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for AdsSymbolTableEntry")
+	}
+	return nil
+}
+
+func (m *_AdsSymbolTableEntry) isAdsSymbolTableEntry() bool {
+	return true
+}
+
+func (m *_AdsSymbolTableEntry) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go b/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
new file mode 100644
index 000000000..ebd3d2b1a
--- /dev/null
+++ b/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
@@ -0,0 +1,284 @@
+/*
+ * 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 (
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
+	"github.com/pkg/errors"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// AdsTableSizes is the corresponding interface of AdsTableSizes
+type AdsTableSizes interface {
+	utils.LengthAware
+	utils.Serializable
+	// GetSymbolCount returns SymbolCount (property field)
+	GetSymbolCount() uint32
+	// GetSymbolLength returns SymbolLength (property field)
+	GetSymbolLength() uint32
+	// GetDataTypeCount returns DataTypeCount (property field)
+	GetDataTypeCount() uint32
+	// GetDataTypeLength returns DataTypeLength (property field)
+	GetDataTypeLength() uint32
+	// GetExtraCount returns ExtraCount (property field)
+	GetExtraCount() uint32
+	// GetExtraLength returns ExtraLength (property field)
+	GetExtraLength() uint32
+}
+
+// AdsTableSizesExactly can be used when we want exactly this type and not a type which fulfills AdsTableSizes.
+// This is useful for switch cases.
+type AdsTableSizesExactly interface {
+	AdsTableSizes
+	isAdsTableSizes() bool
+}
+
+// _AdsTableSizes is the data-structure of this message
+type _AdsTableSizes struct {
+	SymbolCount    uint32
+	SymbolLength   uint32
+	DataTypeCount  uint32
+	DataTypeLength uint32
+	ExtraCount     uint32
+	ExtraLength    uint32
+}
+
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+/////////////////////// Accessors for property fields.
+///////////////////////
+
+func (m *_AdsTableSizes) GetSymbolCount() uint32 {
+	return m.SymbolCount
+}
+
+func (m *_AdsTableSizes) GetSymbolLength() uint32 {
+	return m.SymbolLength
+}
+
+func (m *_AdsTableSizes) GetDataTypeCount() uint32 {
+	return m.DataTypeCount
+}
+
+func (m *_AdsTableSizes) GetDataTypeLength() uint32 {
+	return m.DataTypeLength
+}
+
+func (m *_AdsTableSizes) GetExtraCount() uint32 {
+	return m.ExtraCount
+}
+
+func (m *_AdsTableSizes) GetExtraLength() uint32 {
+	return m.ExtraLength
+}
+
+///////////////////////
+///////////////////////
+///////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////
+
+// NewAdsTableSizes factory function for _AdsTableSizes
+func NewAdsTableSizes(symbolCount uint32, symbolLength uint32, dataTypeCount uint32, dataTypeLength uint32, extraCount uint32, extraLength uint32) *_AdsTableSizes {
+	return &_AdsTableSizes{SymbolCount: symbolCount, SymbolLength: symbolLength, DataTypeCount: dataTypeCount, DataTypeLength: dataTypeLength, ExtraCount: extraCount, ExtraLength: extraLength}
+}
+
+// Deprecated: use the interface for direct cast
+func CastAdsTableSizes(structType interface{}) AdsTableSizes {
+	if casted, ok := structType.(AdsTableSizes); ok {
+		return casted
+	}
+	if casted, ok := structType.(*AdsTableSizes); ok {
+		return *casted
+	}
+	return nil
+}
+
+func (m *_AdsTableSizes) GetTypeName() string {
+	return "AdsTableSizes"
+}
+
+func (m *_AdsTableSizes) GetLengthInBits() uint16 {
+	return m.GetLengthInBitsConditional(false)
+}
+
+func (m *_AdsTableSizes) GetLengthInBitsConditional(lastItem bool) uint16 {
+	lengthInBits := uint16(0)
+
+	// Simple field (symbolCount)
+	lengthInBits += 32
+
+	// Simple field (symbolLength)
+	lengthInBits += 32
+
+	// Simple field (dataTypeCount)
+	lengthInBits += 32
+
+	// Simple field (dataTypeLength)
+	lengthInBits += 32
+
+	// Simple field (extraCount)
+	lengthInBits += 32
+
+	// Simple field (extraLength)
+	lengthInBits += 32
+
+	return lengthInBits
+}
+
+func (m *_AdsTableSizes) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func AdsTableSizesParse(readBuffer utils.ReadBuffer) (AdsTableSizes, error) {
+	positionAware := readBuffer
+	_ = positionAware
+	if pullErr := readBuffer.PullContext("AdsTableSizes"); pullErr != nil {
+		return nil, errors.Wrap(pullErr, "Error pulling for AdsTableSizes")
+	}
+	currentPos := positionAware.GetPos()
+	_ = currentPos
+
+	// Simple Field (symbolCount)
+	_symbolCount, _symbolCountErr := readBuffer.ReadUint32("symbolCount", 32)
+	if _symbolCountErr != nil {
+		return nil, errors.Wrap(_symbolCountErr, "Error parsing 'symbolCount' field of AdsTableSizes")
+	}
+	symbolCount := _symbolCount
+
+	// Simple Field (symbolLength)
+	_symbolLength, _symbolLengthErr := readBuffer.ReadUint32("symbolLength", 32)
+	if _symbolLengthErr != nil {
+		return nil, errors.Wrap(_symbolLengthErr, "Error parsing 'symbolLength' field of AdsTableSizes")
+	}
+	symbolLength := _symbolLength
+
+	// Simple Field (dataTypeCount)
+	_dataTypeCount, _dataTypeCountErr := readBuffer.ReadUint32("dataTypeCount", 32)
+	if _dataTypeCountErr != nil {
+		return nil, errors.Wrap(_dataTypeCountErr, "Error parsing 'dataTypeCount' field of AdsTableSizes")
+	}
+	dataTypeCount := _dataTypeCount
+
+	// Simple Field (dataTypeLength)
+	_dataTypeLength, _dataTypeLengthErr := readBuffer.ReadUint32("dataTypeLength", 32)
+	if _dataTypeLengthErr != nil {
+		return nil, errors.Wrap(_dataTypeLengthErr, "Error parsing 'dataTypeLength' field of AdsTableSizes")
+	}
+	dataTypeLength := _dataTypeLength
+
+	// Simple Field (extraCount)
+	_extraCount, _extraCountErr := readBuffer.ReadUint32("extraCount", 32)
+	if _extraCountErr != nil {
+		return nil, errors.Wrap(_extraCountErr, "Error parsing 'extraCount' field of AdsTableSizes")
+	}
+	extraCount := _extraCount
+
+	// Simple Field (extraLength)
+	_extraLength, _extraLengthErr := readBuffer.ReadUint32("extraLength", 32)
+	if _extraLengthErr != nil {
+		return nil, errors.Wrap(_extraLengthErr, "Error parsing 'extraLength' field of AdsTableSizes")
+	}
+	extraLength := _extraLength
+
+	if closeErr := readBuffer.CloseContext("AdsTableSizes"); closeErr != nil {
+		return nil, errors.Wrap(closeErr, "Error closing for AdsTableSizes")
+	}
+
+	// Create the instance
+	return &_AdsTableSizes{
+		SymbolCount:    symbolCount,
+		SymbolLength:   symbolLength,
+		DataTypeCount:  dataTypeCount,
+		DataTypeLength: dataTypeLength,
+		ExtraCount:     extraCount,
+		ExtraLength:    extraLength,
+	}, nil
+}
+
+func (m *_AdsTableSizes) Serialize(writeBuffer utils.WriteBuffer) error {
+	positionAware := writeBuffer
+	_ = positionAware
+	if pushErr := writeBuffer.PushContext("AdsTableSizes"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for AdsTableSizes")
+	}
+
+	// Simple Field (symbolCount)
+	symbolCount := uint32(m.GetSymbolCount())
+	_symbolCountErr := writeBuffer.WriteUint32("symbolCount", 32, (symbolCount))
+	if _symbolCountErr != nil {
+		return errors.Wrap(_symbolCountErr, "Error serializing 'symbolCount' field")
+	}
+
+	// Simple Field (symbolLength)
+	symbolLength := uint32(m.GetSymbolLength())
+	_symbolLengthErr := writeBuffer.WriteUint32("symbolLength", 32, (symbolLength))
+	if _symbolLengthErr != nil {
+		return errors.Wrap(_symbolLengthErr, "Error serializing 'symbolLength' field")
+	}
+
+	// Simple Field (dataTypeCount)
+	dataTypeCount := uint32(m.GetDataTypeCount())
+	_dataTypeCountErr := writeBuffer.WriteUint32("dataTypeCount", 32, (dataTypeCount))
+	if _dataTypeCountErr != nil {
+		return errors.Wrap(_dataTypeCountErr, "Error serializing 'dataTypeCount' field")
+	}
+
+	// Simple Field (dataTypeLength)
+	dataTypeLength := uint32(m.GetDataTypeLength())
+	_dataTypeLengthErr := writeBuffer.WriteUint32("dataTypeLength", 32, (dataTypeLength))
+	if _dataTypeLengthErr != nil {
+		return errors.Wrap(_dataTypeLengthErr, "Error serializing 'dataTypeLength' field")
+	}
+
+	// Simple Field (extraCount)
+	extraCount := uint32(m.GetExtraCount())
+	_extraCountErr := writeBuffer.WriteUint32("extraCount", 32, (extraCount))
+	if _extraCountErr != nil {
+		return errors.Wrap(_extraCountErr, "Error serializing 'extraCount' field")
+	}
+
+	// Simple Field (extraLength)
+	extraLength := uint32(m.GetExtraLength())
+	_extraLengthErr := writeBuffer.WriteUint32("extraLength", 32, (extraLength))
+	if _extraLengthErr != nil {
+		return errors.Wrap(_extraLengthErr, "Error serializing 'extraLength' field")
+	}
+
+	if popErr := writeBuffer.PopContext("AdsTableSizes"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for AdsTableSizes")
+	}
+	return nil
+}
+
+func (m *_AdsTableSizes) isAdsTableSizes() bool {
+	return true
+}
+
+func (m *_AdsTableSizes) String() string {
+	if m == nil {
+		return "<nil>"
+	}
+	writeBuffer := utils.NewBoxedWriteBufferWithOptions(true, true)
+	if err := writeBuffer.WriteSerializable(m); err != nil {
+		return err.Error()
+	}
+	return writeBuffer.GetBox().String()
+}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
index 0a67d12f5..9ae7b44c8 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
@@ -101,8 +101,6 @@ public interface PlcConnection extends AutoCloseable {
      * @return browse request builder.
      * @throws PlcUnsupportedOperationException if the connection does not support browsing
      */
-    default PlcBrowseRequest.Builder browseRequestBuilder() {
-        throw new PlcNotImplementedException("Not implemented for this connection / driver");
-    }
+    PlcBrowseRequest.Builder browseRequestBuilder();
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
index 2e19ea89f..ccd35fe0a 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
@@ -29,7 +29,7 @@ public interface PlcBrowseRequest extends PlcRequest {
         @Override
         PlcBrowseRequest build();
 
-        PlcReadRequest.Builder addItem(String name, String fieldQuery);
+        Builder addQuery(String name, String query);
 
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryItem.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryItem.java
index 363fd27d5..a2373235e 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryItem.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryItem.java
@@ -18,6 +18,8 @@
  */
 package org.apache.plc4x.java.api.messages;
 
+import org.apache.plc4x.java.api.value.PlcValue;
+
 import java.util.Map;
 
 public interface PlcDiscoveryItem {
@@ -50,7 +52,7 @@ public interface PlcDiscoveryItem {
     /**
      * @return returns a map of all additional attributes assigned to this item (Usually additional information, which is not directly needed for connecting, such as Versions, Names, Supported features etc.)
      */
-    Map<String, String> getAttributes();
+    Map<String, PlcValue> getAttributes();
 
     /**
      * @return returns a plc4x connection string that can be used in any PLC4X driver to connect to the given device (Generally just a concatenation of the other parts of this object)
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryRequest.java
index 213825097..cdeb2f3d3 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcDiscoveryRequest.java
@@ -31,6 +31,8 @@ public interface PlcDiscoveryRequest extends PlcRequest {
         @Override
         PlcDiscoveryRequest build();
 
+        Builder addQuery(String name, String query);
+
     }
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java
index 68c520521..f0f6a5146 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java
@@ -42,8 +42,6 @@ public interface PlcConnectionMetadata {
     /**
      * Indicates that the connection supports browsing.
      */
-    default boolean canBrowse() {
-        return false;
-    }
+    boolean canBrowse();
 
 }
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java
index 44f338796..7404ce1e2 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/AdsPlcDriver.java
@@ -25,6 +25,7 @@ import org.apache.plc4x.java.ads.field.AdsFieldHandler;
 import org.apache.plc4x.java.ads.protocol.AdsProtocolLogic;
 import org.apache.plc4x.java.ads.readwrite.AmsTCPPacket;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest;
+import org.apache.plc4x.java.api.metadata.PlcDriverMetadata;
 import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryRequest;
 import org.apache.plc4x.java.spi.values.IEC61131ValueHandler;
 import org.apache.plc4x.java.api.value.PlcValueHandler;
@@ -73,6 +74,11 @@ public class AdsPlcDriver extends GeneratedDriverBase<AmsTCPPacket> {
         return true;
     }
 
+    @Override
+    protected boolean canBrowse() {
+        return true;
+    }
+
     @Override
     protected Class<? extends Configuration> getConfigurationType() {
         return AdsConfiguration.class;
@@ -93,6 +99,16 @@ public class AdsPlcDriver extends GeneratedDriverBase<AmsTCPPacket> {
         return new IEC61131ValueHandler();
     }
 
+    @Override
+    public PlcDriverMetadata getMetadata() {
+        return new PlcDriverMetadata() {
+            @Override
+            public boolean canDiscover() {
+                return true;
+            }
+        };
+    }
+
     /**
      * This protocol doesn't have a disconnect procedure, so there is no need to wait for a login to finish.
      * @return false
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/discovery/AdsPlcDiscoverer.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/discovery/AdsPlcDiscoverer.java
index 841ea6ad5..0ff0a38e5 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/discovery/AdsPlcDiscoverer.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/discovery/AdsPlcDiscoverer.java
@@ -25,10 +25,12 @@ import org.apache.plc4x.java.api.messages.PlcDiscoveryItemHandler;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.generation.*;
 import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryItem;
 import org.apache.plc4x.java.spi.messages.DefaultPlcDiscoveryResponse;
 import org.apache.plc4x.java.spi.messages.PlcDiscoverer;
+import org.apache.plc4x.java.spi.values.PlcSTRING;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -53,6 +55,7 @@ public class AdsPlcDiscoverer implements PlcDiscoverer {
         Queue<PlcDiscoveryItem> values = new ConcurrentLinkedQueue<>();
 
         // Send out a discovery request to every non-loopback device with IPv4 address.
+        List<DatagramSocket> openSockets = new ArrayList<>();
         try {
             for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
                 if (!networkInterface.isLoopback()) {
@@ -60,116 +63,128 @@ public class AdsPlcDiscoverer implements PlcDiscoverer {
                         if (interfaceAddress.getAddress() instanceof Inet4Address) {
                             Inet4Address inet4Address = (Inet4Address) interfaceAddress.getAddress();
                             // Open a listening socket on the AMS discovery default port for taking in responses.
-                            try (DatagramSocket adsDiscoverySocket = new DatagramSocket(AdsDiscoveryConstants.ADSDISCOVERYUDPDEFAULTPORT, inet4Address)) {
-                                adsDiscoverySocket.setBroadcast(true);
-                                // Start listening for incoming messages.
-                                Thread thread = new Thread(() -> {
-                                    try {
-                                        while (true) {
-                                            // Wait for an incoming packet.
-                                            byte[] buffer = new byte[512];
-                                            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
-                                            adsDiscoverySocket.receive(packet);
-
-                                            InetAddress plcAddress = packet.getAddress();
-                                            ReadBuffer readBuffer = new ReadBufferByteBased(packet.getData(), ByteOrder.LITTLE_ENDIAN);
-                                            AdsDiscovery adsDiscoveryResponse = AdsDiscovery.staticParse(readBuffer);
-
-                                            // Check if this is actually a discovery response.
-                                            if ((adsDiscoveryResponse.getRequestId() == 0) &&
-                                                (adsDiscoveryResponse.getPortNumber() == AdsPortNumbers.SYSTEM_SERVICE) &&
-                                                    (adsDiscoveryResponse.getOperation() == Operation.DISCOVERY_RESPONSE)) {
-
-                                                AmsNetId remoteAmsNetId = adsDiscoveryResponse.getAmsNetId();
-                                                AdsDiscoveryBlockHostName hostNameBlock = null;
-                                                AdsDiscoveryBlockOsData osDataBlock = null;
-                                                AdsDiscoveryBlockVersion versionBlock = null;
-                                                AdsDiscoveryBlockFingerprint fingerprintBlock = null;
-                                                for (AdsDiscoveryBlock block : adsDiscoveryResponse.getBlocks()) {
-                                                    switch (block.getBlockType()) {
-                                                        case HOST_NAME:
-                                                            hostNameBlock = (AdsDiscoveryBlockHostName) block;
-                                                            break;
-                                                        case OS_DATA:
-                                                            osDataBlock = (AdsDiscoveryBlockOsData) block;
-                                                            break;
-                                                        case VERSION:
-                                                            versionBlock = (AdsDiscoveryBlockVersion) block;
-                                                            break;
-                                                        case FINGERPRINT:
-                                                            fingerprintBlock = (AdsDiscoveryBlockFingerprint) block;
-                                                            break;
-                                                        default:
-                                                            logger.info(String.format("Unexpected block type: %s", block.getBlockType().toString()));
-                                                    }
+                            DatagramSocket adsDiscoverySocket = new DatagramSocket(AdsDiscoveryConstants.ADSDISCOVERYUDPDEFAULTPORT, inet4Address);
+                            adsDiscoverySocket.setBroadcast(true);
+
+                            openSockets.add(adsDiscoverySocket);
+
+                            // Start listening for incoming messages.
+                            Thread thread = new Thread(() -> {
+                                try {
+                                    while (true) {
+                                        // Wait for an incoming packet.
+                                        byte[] buffer = new byte[512];
+                                        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
+                                        adsDiscoverySocket.receive(packet);
+
+                                        InetAddress plcAddress = packet.getAddress();
+                                        ReadBuffer readBuffer = new ReadBufferByteBased(packet.getData(), ByteOrder.LITTLE_ENDIAN);
+                                        AdsDiscovery adsDiscoveryResponse = AdsDiscovery.staticParse(readBuffer);
+
+                                        // Check if this is actually a discovery response.
+                                        if ((adsDiscoveryResponse.getRequestId() == 0) &&
+                                            (adsDiscoveryResponse.getPortNumber() == AdsPortNumbers.SYSTEM_SERVICE) &&
+                                            (adsDiscoveryResponse.getOperation() == Operation.DISCOVERY_RESPONSE)) {
+
+                                            AmsNetId remoteAmsNetId = adsDiscoveryResponse.getAmsNetId();
+                                            AdsDiscoveryBlockHostName hostNameBlock = null;
+                                            AdsDiscoveryBlockOsData osDataBlock = null;
+                                            AdsDiscoveryBlockVersion versionBlock = null;
+                                            AdsDiscoveryBlockFingerprint fingerprintBlock = null;
+                                            for (AdsDiscoveryBlock block : adsDiscoveryResponse.getBlocks()) {
+                                                switch (block.getBlockType()) {
+                                                    case HOST_NAME:
+                                                        hostNameBlock = (AdsDiscoveryBlockHostName) block;
+                                                        break;
+                                                    case OS_DATA:
+                                                        osDataBlock = (AdsDiscoveryBlockOsData) block;
+                                                        break;
+                                                    case VERSION:
+                                                        versionBlock = (AdsDiscoveryBlockVersion) block;
+                                                        break;
+                                                    case FINGERPRINT:
+                                                        fingerprintBlock = (AdsDiscoveryBlockFingerprint) block;
+                                                        break;
+                                                    default:
+                                                        logger.info(String.format("Unexpected block type: %s", block.getBlockType().toString()));
+                                                }
+                                            }
+
+                                            if (hostNameBlock != null) {
+                                                Map<String, String> options = new HashMap<>();
+                                                options.put("sourceAmsNetId", "65534");
+                                                options.put("sourceAmsPort", inet4Address.getHostAddress() + ".1.1");
+                                                options.put("targetAmsNetId", remoteAmsNetId.getOctet1() + "." + remoteAmsNetId.getOctet2() + "." + remoteAmsNetId.getOctet3() + "." + remoteAmsNetId.getOctet4() + "." + remoteAmsNetId.getOctet5() + "." + remoteAmsNetId.getOctet6());
+                                                // TODO: Check if this is legit, or if we can get the information from somewhere.
+                                                options.put("targetAmsPort", "851");
+
+                                                Map<String, PlcValue> attributes = new HashMap<>();
+                                                attributes.put("hostName", new PlcSTRING(hostNameBlock.getHostName().getText()));
+                                                if (versionBlock != null) {
+                                                    byte[] versionData = versionBlock.getVersionData();
+                                                    int patchVersion = ((int) versionData[3] & 0xFF) << 8 | ((int) versionData[2] & 0xFF);
+                                                    attributes.put("twinCatVersion", new PlcSTRING(String.format("%d.%d.%d", (short) versionData[0] & 0xFF, (short) versionData[1] & 0xFF, patchVersion)));
                                                 }
+                                                if (fingerprintBlock != null) {
+                                                    attributes.put("fingerprint", new PlcSTRING(new String(fingerprintBlock.getData())));
+                                                }
+                                                // TODO: Find out how to handle the OS Data
+
+                                                // Add an entry to the results.
+                                                PlcDiscoveryItem plcDiscoveryItem = new DefaultPlcDiscoveryItem(
+                                                    "ads", "tcp",
+                                                    plcAddress.getHostAddress() + ":" + AdsConstants.ADSTCPDEFAULTPORT,
+                                                    options, hostNameBlock.getHostName().getText(), attributes);
 
-                                                if (hostNameBlock != null) {
-                                                    Map<String, String> options = new HashMap<>();
-                                                    options.put("sourceAmsNetId", "65534");
-                                                    options.put("sourceAmsPort", inet4Address.getHostAddress() + ".1.1");
-                                                    options.put("targetAmsNetId", remoteAmsNetId.getOctet1() + "." + remoteAmsNetId.getOctet2() + "." + remoteAmsNetId.getOctet3() + "." + remoteAmsNetId.getOctet4() + "." + remoteAmsNetId.getOctet5() + "." + remoteAmsNetId.getOctet6());
-                                                    // TODO: Check if this is legit, or if we can get the information from somewhere.
-                                                    options.put("targetAmsPort", "851");
-
-                                                    Map<String, String> attributes = new HashMap<>();
-                                                    attributes.put("hostName", hostNameBlock.getHostName().getText());
-                                                    if(versionBlock != null) {
-                                                        byte[] versionData = versionBlock.getVersionData();
-                                                        int patchVersion = ((int) versionData[3] & 0xFF) << 8 | ((int) versionData[2] & 0xFF);
-                                                        attributes.put("twinCatVersion", String.format("%d.%d.%d", (short) versionData[0] & 0xFF, (short) versionData[1] & 0xFF, patchVersion));
-                                                    }
-                                                    if(fingerprintBlock != null) {
-                                                        attributes.put("fingerprint", new String(fingerprintBlock.getData()));
-                                                    }
-                                                    // TODO: Find out how to handle the OS Data
-
-                                                    // Add an entry to the results.
-                                                    PlcDiscoveryItem plcDiscoveryItem = new DefaultPlcDiscoveryItem(
-                                                        "ads", "tcp",
-                                                        plcAddress.getHostAddress() + ":" + AdsConstants.ADSTCPDEFAULTPORT,
-                                                        options, hostNameBlock.getHostName().getText(), attributes);
-
-                                                    // If we've got an explicit handler, pass the new item to that.
-                                                    if (handler != null) {
-                                                        handler.handle(plcDiscoveryItem);
-                                                    }
-
-                                                    // Simply add the item to the list.
-                                                    values.add(plcDiscoveryItem);
+                                                // If we've got an explicit handler, pass the new item to that.
+                                                if (handler != null) {
+                                                    handler.handle(plcDiscoveryItem);
                                                 }
+
+                                                // Simply add the item to the list.
+                                                values.add(plcDiscoveryItem);
                                             }
                                         }
-                                    } catch (IOException e) {
-                                        logger.error("Error reading ADS discovery response", e);
-                                    } catch (ParseException e) {
-                                        logger.error("Error parsing ADS discovery response", e);
                                     }
-                                });
-                                thread.start();
-
-                                // Send the discovery request.
-                                try {
-                                    // Create the discovery request message for this device.
-                                    AmsNetId amsNetId = new AmsNetId(inet4Address.getAddress()[0], inet4Address.getAddress()[1], inet4Address.getAddress()[2], inet4Address.getAddress()[3], (byte) 1, (byte) 1);
-                                    AdsDiscovery discoveryRequestMessage = new AdsDiscovery(0, Operation.DISCOVERY_REQUEST, amsNetId, AdsPortNumbers.SYSTEM_SERVICE, Collections.emptyList());
-
-                                    // Serialize the message.
-                                    WriteBufferByteBased writeBuffer = new WriteBufferByteBased(discoveryRequestMessage.getLengthInBytes(), ByteOrder.LITTLE_ENDIAN);
-                                    discoveryRequestMessage.serialize(writeBuffer);
-
-                                    // Get the broadcast address for this interface.
-                                    InetAddress broadcastAddress = interfaceAddress.getBroadcast();
-
-                                    // Create the UDP packet to the broadcast address.
-                                    DatagramPacket discoveryRequestPacket = new DatagramPacket(writeBuffer.getBytes(), writeBuffer.getBytes().length, broadcastAddress, AdsDiscoveryConstants.ADSDISCOVERYUDPDEFAULTPORT);
-                                    adsDiscoverySocket.send(discoveryRequestPacket);
-                                } catch (SerializationException e) {
-                                    logger.error("Error serializing ADS discovery request", e);
+                                } catch (SocketException e) {
+                                    // If we're closing the socket at the end, a "Socket closed"
+                                    // exception is thrown.
+                                    if(!"Socket closed".equals(e.getMessage())) {
+                                        logger.error("Error receiving ADS discovery response", e);
+                                    }
                                 } catch (IOException e) {
-                                    logger.error("Error sending ADS discover request", e);
+                                    logger.error("Error reading ADS discovery response", e);
+                                } catch (ParseException e) {
+                                    logger.error("Error parsing ADS discovery response", e);
                                 }
-                            } catch (SocketException e) {
+                            });
+                            thread.start();
+
+                            // Send the discovery request.
+                            try {
+                                // Create the discovery request message for this device.
+                                AmsNetId amsNetId = new AmsNetId(inet4Address.getAddress()[0], inet4Address.getAddress()[1], inet4Address.getAddress()[2], inet4Address.getAddress()[3], (byte) 1, (byte) 1);
+                                AdsDiscovery discoveryRequestMessage = new AdsDiscovery(0, Operation.DISCOVERY_REQUEST, amsNetId, AdsPortNumbers.SYSTEM_SERVICE, Collections.emptyList());
+
+                                // Serialize the message.
+                                WriteBufferByteBased writeBuffer = new WriteBufferByteBased(discoveryRequestMessage.getLengthInBytes(), ByteOrder.LITTLE_ENDIAN);
+                                discoveryRequestMessage.serialize(writeBuffer);
+
+                                // Get the broadcast address for this interface.
+                                InetAddress broadcastAddress = interfaceAddress.getBroadcast();
+
+                                // Create the UDP packet to the broadcast address.
+                                DatagramPacket discoveryRequestPacket = new DatagramPacket(writeBuffer.getBytes(), writeBuffer.getBytes().length, broadcastAddress, AdsDiscoveryConstants.ADSDISCOVERYUDPDEFAULTPORT);
+                                adsDiscoverySocket.send(discoveryRequestPacket);
+                            } catch (SerializationException e) {
+                                logger.error("Error serializing ADS discovery request", e);
+                            } catch (IOException e) {
+                                logger.error("Error sending ADS discover request", e);
+                            }
+
+                            try {
+                                Thread.sleep(3000);
+                            } catch (InterruptedException e) {
                                 throw new RuntimeException(e);
                             }
                         }
@@ -178,6 +193,10 @@ public class AdsPlcDiscoverer implements PlcDiscoverer {
             }
         } catch (SocketException e) {
             throw new RuntimeException(e);
+        } finally {
+            for (DatagramSocket openSocket : openSockets) {
+                openSocket.close();
+            }
         }
 
         // Create a timer that completes the future after a given time with all the responses it found till then.
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index 9641148d2..14a55710a 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -56,7 +56,7 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements HasConfiguration<AdsConfiguration>, PlcSubscriber {
+public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements HasConfiguration<AdsConfiguration>, PlcSubscriber, PlcBrowser {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AdsProtocolLogic.class);
 
@@ -191,6 +191,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
             if(throwable != null) {
                 LOGGER.error("Error fetching symbol and datatype table sizes");
             } else {
+                // TODO: Link the datatypes to the symbols.
                 for (AdsSymbolTableEntry symbol : symbols) {
                     System.out.println(symbol.getName());
                 }
@@ -208,6 +209,11 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
         // TODO: Here we have to clean up all of the handles this connection acquired.
     }
 
+    @Override
+    public CompletableFuture<PlcBrowseResponse> browse(PlcBrowseRequest browseRequest) {
+        return null;
+    }
+
     @Override
     public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
         // Get all ADS addresses in their resolved state.
diff --git a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/RandomPackagesTest.java b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/RandomPackagesTest.java
deleted file mode 100644
index ab42558ad..000000000
--- a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/RandomPackagesTest.java
+++ /dev/null
@@ -1,403 +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.
- */
-package org.apache.plc4x.java.cbus;
-
-import org.apache.plc4x.java.cbus.readwrite.*;
-import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import java.nio.charset.StandardCharsets;
-
-import static org.apache.plc4x.java.cbus.Util.assertMessageMatches;
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class RandomPackagesTest {
-
-    public static final CBusOptions C_BUS_OPTIONS_WITH_SRCHK = new CBusOptions(false, false, false, false, false, false, false, false, true);
-    RequestContext requestContext;
-    CBusOptions cBusOptions;
-
-    @BeforeEach
-    void setUp() {
-        requestContext = new RequestContext(false);
-        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
-    }
-
-    @Disabled
-    @Test
-    void whatEverThisIs() throws Exception {
-        byte[] bytes = "\\3436303230303231303167\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void deviceManagementInstruction() throws Exception {
-        byte[] bytes = "@1A2001\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void setLight() throws Exception {
-        byte[] bytes = "\\0538000100g\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void identifyResponse() throws Exception {
-        byte[] bytes = "g.890150435F434E49454421\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        // We know we send an identify command so we set the cal flag
-        requestContext = new RequestContext(false);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void someResponse() throws Exception {
-        byte[] bytes = "nl.8220025C\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        requestContext = new RequestContext(false);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void someOtherResponse() throws Exception {
-        byte[] bytes = "\\0538000100g\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-
-    @Test
-    void identifyRequest2() throws Exception {
-        byte[] bytes = "21021A2102i\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void identifyResponse2() throws Exception {
-        byte[] bytes = "i.8902352E342E3030202010\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        // We know we send an identify command so we set the cal flag
-        requestContext = new RequestContext(false);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void recall() throws Exception {
-        byte[] bytes = "@1A2001\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void identifyTypeReply() throws Exception {
-        byte[] bytes = "h.890150435F434E49454421\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        requestContext = new RequestContext(false);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void write30to9755() throws Exception {
-        byte[] bytes = "A3309755s\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void strangeNotYetParsableCommandResponse() throws Exception {
-        byte[] bytes = "s.860202003230977D\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        requestContext = new RequestContext(false);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void statusRequestBinaryState() throws Exception {
-        byte[] bytes = "\\05FF00FAFF00v\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Disabled
-    @Test
-    void wat() throws Exception {
-        byte[] bytes = "D8FF0024000002000000000000000008000000000000000000\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        requestContext = new RequestContext(false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void WriteCommand() throws Exception {
-        byte[] bytes = "\\46310900A400410600r\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void statusReply() throws Exception {
-        byte[] bytes = "D8FF5800000000000000000000000000000000000000000000D1\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        requestContext = new RequestContext(false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void identifyUnitSummary() throws Exception {
-        byte[] bytes = "2110\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void identifyUnitSummaryResponse() throws Exception {
-        byte[] bytes = "o.8510020000FF6A\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        requestContext = new RequestContext(true);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void hvacAndCoolingSAL() throws Exception {
-        byte[] bytes = "0531AC0079042F0401430316000011\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        requestContext = new RequestContext(false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Disabled("apparently something is broken, the second cal data can't be parsed")
-    @Test
-    void calIdentifyReplyAndAnotherCal() throws Exception {
-        byte[] bytes = "h.860102008902312E362E30302020832138FFAE\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        requestContext = new RequestContext(false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void routedAcknowledge() throws Exception {
-        byte[] bytes = "r.8631020100320041D3\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        requestContext = new RequestContext(false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void gavValuesCurrentReply() throws Exception {
-        byte[] bytes = "w.860C02008A08000000C8000000000012\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        requestContext = new RequestContext(false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void SetHvacLevel() throws Exception {
-        byte[] bytes = "0531AC0036040108FF0000DC\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        requestContext = new RequestContext(false);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void salHvac() throws Exception {
-        byte[] bytes = "0531AC0036040142037F001F\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        requestContext = new RequestContext(false);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Disabled("Not clear yet what this is")
-    @Test
-    void closestFitIsAStatusRequestButWeDonTHaveAnyBytesBeforeThat() throws Exception {
-        byte[] bytes = "FAFF00r\r".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void ownSal() throws Exception {
-        byte[] bytes = "003809AF10\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void powerUpNotification() throws Exception {
-        byte[] bytes = "++\r\n".getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void incmoingMMI() throws Exception {
-        byte[] bytes = ("86040200F940380001000000000000000008000000000000000000000000FA\r\n").getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-    @Test
-    void justAnError() throws Exception {
-        byte[] bytes = ("!").getBytes(StandardCharsets.UTF_8);
-        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-        assertThat(msg).isNotNull();
-        System.out.println(msg);
-
-        assertMessageMatches(bytes, msg);
-    }
-
-}
diff --git a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java
deleted file mode 100644
index 3e626678b..000000000
--- a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java
+++ /dev/null
@@ -1,2052 +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.
- */
-package org.apache.plc4x.java.cbus;
-
-import org.apache.commons.codec.binary.Hex;
-import org.apache.plc4x.java.cbus.readwrite.*;
-import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-
-import java.nio.charset.StandardCharsets;
-
-import static org.apache.plc4x.java.cbus.Util.assertMessageMatches;
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class ReferenceTest {
-
-    public static final CBusOptions C_BUS_OPTIONS_WITH_SRCHK = new CBusOptions(false, false, false, false, false, false, false, false, true);
-
-    RequestContext requestContext;
-    CBusOptions cBusOptions;
-
-    @BeforeEach
-    void setUp() {
-        requestContext = new RequestContext(false);
-        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/C-Bus%20Interface%20Requirements.pdf
-    @Nested
-    class InterfaceRequirementsTest {
-
-        // 8.2
-        @Nested
-        class Level1InterfaceImplementationRequirements {
-
-            // 8.2.4
-            @Nested
-            class SerialInterfaceInitialisation {
-
-                @Test
-                void Step_1_Reset() throws Exception {
-                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_2_SetInterfaceOptions3() throws Exception {
-                    byte[] bytes = "@A3420002\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_3_SetInterfaceOptions1_PUN() throws Exception {
-                    byte[] bytes = "@A3410058\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_4_SetInterfaceOptions1() throws Exception {
-                    byte[] bytes = "@A3300058\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-
-            // 8.2.5
-            @Nested
-            class ConfirmationOfTransmission {
-                @Test
-                void SomeCommand() throws Exception {
-                    byte[] bytes = "\\0538000121A1g\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void success() throws Exception {
-                    byte[] bytes = "g.".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void checksumFailure() throws Exception {
-                    byte[] bytes = "g!".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void tooManyRetransmissions() throws Exception {
-                    byte[] bytes = "g#".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void corruptionInTransmission() throws Exception {
-                    byte[] bytes = "g$".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void noSystemClock() throws Exception {
-                    byte[] bytes = "g%".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-        }
-
-        // 8.3
-        @Nested
-        class Level2InterfaceImplementationRequirements {
-
-            // 8.3.4
-            @Nested
-            class SerialInterfaceInitialisation {
-                @Test
-                void Step_1_Reset() throws Exception {
-                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_2_AnyApplicationFilter() throws Exception {
-                    byte[] bytes = "@A3210038\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_3_SetInterfaceOptions3() throws Exception {
-                    byte[] bytes = "@A3420002\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_4_SetInterfaceOptions1_PUN() throws Exception {
-                    byte[] bytes = "@A3410059\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_5_SetInterfaceOptions1() throws Exception {
-                    byte[] bytes = "@A3300059\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-
-            // 8.3.5
-            @Nested
-            class ProgrammingTheSerialInterfaceToFilterSALMessageTraffic {
-
-                @Test
-                void Step_1_SelectOnlyLighting() throws Exception {
-                    byte[] bytes = "@A3210038\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_2_SelectHeatingAsSecondApplication() throws Exception {
-                    byte[] bytes = "@A3220088\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-        }
-
-        // 8.4
-        @Nested
-        class Level3InterfaceImplementationRequirements {
-            // No specific tests
-        }
-
-        // 8.5
-        @Nested
-        class Level4InterfaceImplementationRequirements {
-
-            // 8.5.4
-            @Nested
-            class SerialInterfaceInitialisation {
-                @Test
-                void Step_1_Reset() throws Exception {
-                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_2_AnyApplicationFilter() throws Exception {
-                    byte[] bytes = "@A3210038\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_3_SetInterfaceOptions3() throws Exception {
-                    byte[] bytes = "@A342000A\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_4_SetInterfaceOptions1_PUN() throws Exception {
-                    byte[] bytes = "@A3410079\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Step_5_SetInterfaceOptions1() throws Exception {
-                    byte[] bytes = "@A3300079\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-        }
-
-        // 8.6
-        @Nested
-        class Level5InterfaceImplementationRequirements {
-            // No specific tests
-        }
-
-        // 8.7
-        @Nested
-        class Level6InterfaceImplementationRequirements {
-            // No specific tests
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Serial%20Interface%20User%20Guide.pdf
-    @Nested
-    class SerialInterfaceGuideTest {
-
-        // 3.4
-        @Nested
-        class Header {
-            @Test
-            void Point_point_multipoint_lowest_priority_class() throws Exception {
-                byte[] bytes = new byte[]{0x03};
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusHeader msg = CBusHeader.staticParse(readBufferByteBased);
-                assertThat(msg).isNotNull();
-
-                System.out.println(msg);
-            }
-
-            @Test
-            void Point_multipoint_lowest_priority_class() throws Exception {
-                byte[] bytes = new byte[]{0x05};
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusHeader msg = CBusHeader.staticParse(readBufferByteBased);
-                assertThat(msg).isNotNull();
-
-                System.out.println(msg);
-            }
-
-            @Test
-            void Point_point_lowest_priority_class() throws Exception {
-                byte[] bytes = new byte[]{0x06};
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusHeader msg = CBusHeader.staticParse(readBufferByteBased);
-                assertThat(msg).isNotNull();
-
-                System.out.println(msg);
-            }
-
-        }
-
-        // 4
-        @Nested
-        class SerialInterface {
-
-            // 4.2.3
-            @Test
-            void reset() throws Exception {
-                byte[] bytes = "~\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-
-                System.out.println(msg);
-            }
-
-            @Disabled("not implemented yet")
-            // 4.2.4
-            @Test
-            void cancel() throws Exception {
-                byte[] bytes = "AB0123?9876\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-
-                System.out.println(msg);
-            }
-
-            // 4.2.5
-            @Test
-            void smartConnectShortcut() throws Exception {
-                byte[] bytes = "\r|\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-
-                System.out.println(msg);
-            }
-
-            @Disabled("not implemented yet")
-            // 4.2.4
-            @Test
-            void confirmation() throws Exception {
-                // If you follow the spec a confirmation can occur at any place... seems strange
-                byte[] bytes = "AB0123n9876\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-
-                System.out.println(msg);
-            }
-
-            // 4.2.7
-            @Test
-            void directCommandAccess1() throws Exception {
-                byte[] bytes = "@2102\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 4.2.7
-            @Test
-            void directCommandAccess2() throws Exception {
-                // TODO: this should be the same as the @above but that is not yet implemented
-                byte[] bytes = "~2102\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-        }
-
-
-        // 4.2.9.1
-        @Nested
-        class PointToPointCommands {
-            @Test
-            void pointToPointCommandDirect() throws Exception {
-                byte[] bytes = "\\0603002102D4\r".getBytes(StandardCharsets.UTF_8);
-                cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void pointToPointCommandBridged() throws Exception {
-                byte[] bytes = "\\06420903210289\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-
-        // 4.2.9.2
-        @Nested
-        class PointToMultiPointCommands {
-            @Test
-            void pointToMultiPointCommandDirect() throws Exception {
-                byte[] bytes = "\\0538000108BA\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void pointToMultiPointCommandBridged() throws Exception {
-                byte[] bytes = "\\05FF007A38004A\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 4.2.9.3
-        @Nested
-        class PointToPointToMultoPointCommands {
-            @Test
-            void pointToPointToMultiPointCommand2() throws Exception {
-                byte[] bytes = "\\03420938010871\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 4.3.3.1
-        @Nested
-        class _CALReply {
-            @Test
-            void calRequest() throws Exception {
-                byte[] bytes = "\\0605002102\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void calReplyNormal() throws Exception {
-                byte[] bytes = "8902312E322E363620200A\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                requestContext = new RequestContext(false);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void calReplySmart() throws Exception {
-                // TODO: seems like the checksum is wrong here???
-                //byte[] bytes = "860593008902312E322E363620207F\r\n".getBytes(StandardCharsets.UTF_8);
-                byte[] bytes = "860593008902312E322E36362020EC\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                requestContext = new RequestContext(false);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 4.3.3.2
-        @Nested
-        class _MonitoredSAL {
-            @Test
-            void monitoredSal() throws Exception {
-                byte[] bytes = "0503380079083F\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 4.3.3.3
-        @Nested
-        class Confirmation {
-            @Test
-            void successful() throws Exception {
-                byte[] bytes = "g.".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void toManyRetransmissions() throws Exception {
-                byte[] bytes = "g#".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void corruption() throws Exception {
-                byte[] bytes = "g$".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void desync() throws Exception {
-                byte[] bytes = "g%".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void tooLong() throws Exception {
-                byte[] bytes = "g'".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 7.3
-        @Test
-        void StandardFormatStatusReply1() throws Exception {
-            byte[] bytes = "D8380068AA0140550550001000000014000000000000000000CF\r\n".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            requestContext = new RequestContext(true);
-            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        @Test
-        void StandardFormatStatusReply2() throws Exception {
-            byte[] bytes = "D838580000000000000000000000000000000000000000000098\r\n".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            requestContext = new RequestContext(true);
-            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        @Test
-        void StandardFormatStatusReply3() throws Exception {
-            byte[] bytes = "D638B000000000FF00000000000000000000000000000043\r\n".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            requestContext = new RequestContext(true);
-            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        // 7.4
-        @Test
-        void ExtendedFormatStatusReply1() throws Exception {
-            byte[] bytes = "F9073800AAAA000095990000000055550000000000005555555548\r\n".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            requestContext = new RequestContext(true);
-            cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        @Test
-        void ExtendedFormatStatusReply2() throws Exception {
-            byte[] bytes = "F907380B0000000000005555000000000000000000000000000013\r\n".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            requestContext = new RequestContext(true);
-            cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        @Test
-        void ExtendedFormatStatusReply3() throws Exception {
-            byte[] bytes = "F70738160000000000000000000000000000000000000000B4\r\n".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            requestContext = new RequestContext(true);
-            cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        // 9.1
-        @Nested
-        class PointToMultiPointCommandsIntoLocalCBusNetwork {
-            @Test
-            void LightningOff() throws Exception {
-                byte[] bytes = "\\0538000114AE\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void LightningStatus() throws Exception {
-                byte[] bytes = "\\05FF007A38004A\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void LightningStatusReply1() throws Exception {
-                byte[] bytes = "D83800A8AA02000000000000000000000000000000000000009C\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                requestContext = new RequestContext(true);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void LightningStatusReply2() throws Exception {
-                byte[] bytes = "D838580000000000000000000000000000000000000000000098\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void LightningStatusReply3() throws Exception {
-                byte[] bytes = "D638B0000000000000000000000000000000000000000042\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void LightningStatusReply4() throws Exception {
-                // TODO: the command header seems wrong as it is missing a byte
-                //byte[] bytes = "86999900F8003800A8AA0200000000000000000000000000000000000000C4\r\n".getBytes(StandardCharsets.UTF_8);
-                byte[] bytes = "86999900F9003800A8AA0200000000000000000000000000000000000000C3\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-
-            @Test
-            void LightningStatusReply5() throws Exception {
-                // TODO: the command header seems wrong as it is missing a byte
-                // byte[] bytes = "86999900F800385800000000000000000000000000000000000000000000C0\r\n".getBytes(StandardCharsets.UTF_8);
-                byte[] bytes = "86999900F900385800000000000000000000000000000000000000000000BF\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void LightningStatusReply6() throws Exception {
-                // TODO: wrong checksum in this example???
-                // TODO: the command header seems wrong as it is missing a byte
-                //byte[] bytes = "86999900F60038B000000000000000000000000000000000000000008F\r\n".getBytes(StandardCharsets.UTF_8);
-                byte[] bytes = "86999900F70038B0000000000000000000000000000000000000000069\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 9.2
-        @Nested
-        class PointToPointCommandsIntoLocalCBusNetwork {
-            @Test
-            void RecallCurrentValueOfParameter0x30onUnit0x04() throws Exception {
-                // TODO: the section describes that on non smart mode the message doesn't have the last CR
-                byte[] bytes = "\\0604001A3001AB\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // TODO: due the usage of reserved we lose bits here so we need to fix that
-            @Disabled("TODO: due the usage of reserved we lose bits here so we need to fix that")
-            @Test
-            void Reply() throws Exception {
-                byte[] bytes = "8604990082300328\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-        }
-
-        // 9.3
-        @Nested
-        class PointToMultiPointCommandsIntoaRemoteCBusNetwork {
-            @Test
-            void IssueLightningOf() throws Exception {
-                // TODO: the section describes that on non smart mode the message doesn't have the last CR
-                byte[] bytes = "\\03421B53643801149C\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Disabled("the transformation from point to point to multipoint message is not yet implemented as described in 8.4... not sure if we will ever implement that")
-            @Test
-            void Reply() throws Exception {
-                byte[] bytes = Hex.decodeHex("0565380354432101148E");
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusCommand msg = CBusCommand.staticParse(readBufferByteBased, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-        }
-
-        // 9.4
-        @Test
-        void SwitchMode() throws Exception {
-            byte[] bytes = "~@A3300019\r".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-            assertMessageMatches(bytes, msg);
-        }
-
-        // 9.5
-        @Test
-        void MultipleCommands() throws Exception {
-            byte[] bytes = "\\05380001210122012301240A25010A2601D4\r".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        // 10.2.1
-        @Test
-        void testParameterSet() throws Exception {
-            byte[] bytes = "@A3470011\r".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        // 10.2.1
-        @Test
-        void testParameterSetObsolete() throws Exception {
-            byte[] bytes = "A3470011\r".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/C-Bus%20Quick%20Start%20Guide.pdf
-    @Nested
-    class CBusQuickStartGuideTest {
-
-        // 4.3
-        @Test
-        void checksums() throws Exception {
-            byte[] bytes = "\\0538007988C2g\r".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        //5.2
-        @Nested
-        class PCI_Setup {
-
-            // 5.2.1
-            @Nested
-            class MMIMessagesNotRequired {
-
-                @Test
-                void init() throws Exception {
-                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void writeSomething() throws Exception {
-                    byte[] bytes = "A3210038g\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void writeSomethingResponse() throws Exception {
-                    byte[] bytes = "g.322100AD\r\n".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-                    requestContext = new RequestContext(false);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void writeSomething2() throws Exception {
-                    byte[] bytes = "A3420002g\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void writeSomethingResponse2() throws Exception {
-                    byte[] bytes = "g.3242008C\r\n".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    requestContext = new RequestContext(false);
-                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void writeSomething3() throws Exception {
-                    byte[] bytes = "A3300059g\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void writeSomethingResponse3() throws Exception {
-                    byte[] bytes = "g.8600000032300018\r\n".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-
-            // 5.2.2
-            @Test
-            void MMIMessagesRequired() throws Exception {
-                byte[] bytes = "A3300079g\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 6
-        @Nested
-        class TransmittingCBusLightingControlCommands {
-            // 6.1
-            @Test
-            void TransmitAnONCommand() throws Exception {
-                byte[] bytes = "\\053800790842u\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 6.2
-            @Test
-            void TransmitAnOFFCommand() throws Exception {
-                byte[] bytes = "\\0538000108BAu\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 6.3
-            @Test
-            void TransmitAnRampToLevelCommand() throws Exception {
-                byte[] bytes = "\\0538005A08550Cu\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 7
-        @Nested
-        class ReceivingCBusLightingControlCommands {
-            // 7.1
-            @Test
-            void ReceiveAnONCommand() throws Exception {
-                byte[] bytes = "05003800790842\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 7.1
-            @Test
-            void ReceiveAnONCommandAlternative() throws Exception {
-                byte[] bytes = "0500380100790841\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 7.2
-            @Test
-            void ReceiveAnOFFCommand() throws Exception {
-                byte[] bytes = "050038000108BA\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 7.2
-            @Test
-            void ReceiveAnOFFCommandAlternative() throws Exception {
-                byte[] bytes = "05003801000108B9\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 7.3
-            @Test
-            void ReceiveAnRampToLevelCommand() throws Exception {
-                byte[] bytes = "050038005A08550C\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 7.3
-            @Test
-            void ReceiveAnRampToLevelCommandAlternative() throws Exception {
-                byte[] bytes = "05003801005A08550B\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Disabled("Needs to be implemented")
-            // 7.4
-            @Nested
-            class ReceivingOtherCommands {
-                @Test
-                void Case1() throws Exception {
-                    // Test with nn not 00 or 01... they should be discarded
-                    byte[] bytes = "05ss38nn....zz\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Case2() throws Exception {
-                    // Test with nn not 00 or 01... they should be discarded
-                    byte[] bytes = "05ss3800cc....zz\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Case2Alternative() throws Exception {
-                    // Test with nn not 00 or 01... they should be discarded
-                    byte[] bytes = "05ss380100cc....zz\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-
-        }
-
-        // 8
-        @Nested
-        class InterpretingTheMmi {
-            @Test
-            void BigMMI1() throws Exception {
-                byte[] bytes = "D8380068AA0140550550001000000014000000000000000000CF\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void BigMMI2() throws Exception {
-                byte[] bytes = "D838580000000000000000000000000000000000000000000098\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void BigMMI3() throws Exception {
-                byte[] bytes = "D638B000000000FF00000000000000000000000000000043\r\n".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-
-        // 9
-        @Nested
-        class Example {
-            @Nested
-            class ControlExamples {
-                @Test
-                void turnOnLight() throws Exception {
-                    byte[] bytes = "\\053800792129g\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void turnOffLight() throws Exception {
-                    byte[] bytes = "\\0538000121A1g\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void rampLight() throws Exception {
-                    byte[] bytes = "\\0538000A217F19g\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-
-            @Nested
-            class MontiorExamples {
-                @Test
-                void onCommand() throws Exception {
-                    byte[] bytes = "050B380079201F\r\n".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void offCommand() throws Exception {
-                    byte[] bytes = "050B3800012097\r\n".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Ramp() throws Exception {
-                    byte[] bytes = "050B38000220484E\r\n".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2002%20-%20C-Bus%20Lighting%20Application.pdf
-    @Nested
-    class LightningApplicationsTest {
-
-        // 2.9.6.4.4 Command Sequence
-        @Nested
-        class CommandSquence {
-
-            @Test
-            void StartDynamicIcon() throws Exception {
-                byte[] bytes = "\\053800A412080020\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void IconBitmap() throws Exception {
-                byte[] bytes = "\\053800A412080021\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void CompleteDynamicIcon() throws Exception {
-                byte[] bytes = "\\053800A412080022\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Nested
-            class ChineseTable {
-
-                @Test
-                void StartDynamicIcon() throws Exception {
-                    byte[] bytes = "\\053800A401080020\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void IconHeader() throws Exception {
-                    byte[] bytes = "\\053800A80104CA00130C0600\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void AppendDynamicIcon() throws Exception {
-                    byte[] bytes = "\\053800A401080021\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void WriteIconBitmapData1() throws Exception {
-                    byte[] bytes = "\\053800A80104AAF05500FF50\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void WriteIconBitmapData2() throws Exception {
-                    byte[] bytes = "\\053800A801040000F0F00F00\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void useDynamicIcon() throws Exception {
-                    byte[] bytes = "\\053800A401080022\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void displayIcon() throws Exception {
-                    byte[] bytes = "\\053800A60102CA010013\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-            }
-        }
-
-        // 2.11 Examples
-        @Nested
-        class Examples {
-            @Test
-            void switchElectricalLoads() throws Exception {
-                byte[] bytes = "\\0538007993B7\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void switchElectricalLoadsBridged() throws Exception {
-                byte[] bytes = "\\0356093879935A\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2005%20-%20C-Bus%20Security%20Application.pdf
-    @Nested
-    class SecurityApplicationsTest {
-
-        //5.11.1
-        @Nested
-        class SecuritySystemEmitsAlarmOn {
-            @Test
-            void AlarmOnWrongPrio() throws Exception {
-                byte[] bytes = "\\05D00079832F\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void AlarmOn() throws Exception {
-                byte[] bytes = "\\85D0007983AF\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-        }
-
-        //5.11.2
-        @Test
-        void Zone3Unsealed() throws Exception {
-            byte[] bytes = "\\05D0000A860398\r".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        //5.11.3
-        @Test
-        void ZoneName() throws Exception {
-            byte[] bytes = "\\05D000AD8D034B49544348452E2020202088\r".getBytes(StandardCharsets.UTF_8);
-            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-            assertThat(msg).isNotNull();
-            System.out.println(msg);
-
-            assertMessageMatches(bytes, msg);
-        }
-
-        // 5.11.4
-        @Nested
-        class DeviceRequestsSecuritySystemtoArm {
-
-            @Test
-            void ArmSecurity() throws Exception {
-                byte[] bytes = "\\05D0000AA2FF80\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void ArmSecurityRemote() throws Exception {
-                byte[] bytes = "\\039209D00AA2FFE7\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-    }
-
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2006%20-%20C-Bus%20Metering%20Application.pdf
-    @Nested
-    class MeteringApplicationsTest {
-
-        //6.11.1
-        @Nested
-        class DeviceRequestsMeteringApplicationtoMeasureElectricity {
-            @Test
-            void LocalMeasurement() throws Exception {
-                byte[] bytes = "\\05D100090120\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void RemoteMeasurement() throws Exception {
-                byte[] bytes = "\\035609D10901C3\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-        }
-
-        //6.11.2
-        @Nested
-        class MeterMeasurementDevicesendsElectricityUse {
-            @Test
-            void LocalMeasurement() throws Exception {
-                byte[] bytes = "\\05D1000D810000DBF8C9\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void RemoteMeasurement() throws Exception {
-                byte[] bytes = "\\033709D10D810000DBF88B\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2007%20-%20C-Bus%20Trigger%20Control%20Application.pdf
-    @Nested
-    class TriggerControlApplicationsTest {
-
-        //7.12
-        @Nested
-        class Examples {
-            @Test
-            void LocalTrigger() throws Exception {
-                byte[] bytes = "\\05CA0002250109\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void RemoteTrigger() throws Exception {
-                byte[] bytes = "\\035609CA022501AC\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2008%20-%20C-Bus%20Enable%20Control%20Application.pdf
-    @Nested
-    class EnableControlApplicationsTest {
-
-        //8.11
-        @Nested
-        class Examples {
-            @Test
-            void LocalTrigger() throws Exception {
-                byte[] bytes = "\\05CB0002378275\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void RemoteTrigger() throws Exception {
-                // TODO: seems like the checksum is wrong here again...
-                //byte[] bytes = "\\035609CB02378216\r".getBytes(StandardCharsets.UTF_8);
-                byte[] bytes = "\\035609CB02378218\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2009%20-%20C-Bus%20Temperature%20Broadcast%20Application.pdf
-    @Nested
-    class TemperatureBroadcastApplicationsTest {
-
-        //9.11
-        @Nested
-        class Examples {
-
-            @Test
-            void temperatureBroadcast() throws Exception {
-                byte[] bytes = "\\051900020564\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2010%20-%20C-Bus%20Ventilation%20Application.pdf
-    @Nested
-    class VentilationApplicationTest {
-        // TODO: no tests described here but it should work by adjusting the values from Lightning...
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2009%20-%20C-Bus%20Temperature%20Control%20Application.pdf
-    @Nested
-    class AccessControlApplicationsTest {
-
-        //9.11
-        @Nested
-        class Examples {
-
-            @Test
-            void validAccessRequest() throws Exception {
-                byte[] bytes = "\\05D500A4010300017D\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void closeAccessPoint() throws Exception {
-                byte[] bytes = "\\05D5000201FF24\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void lockAccessPoint() throws Exception {
-                byte[] bytes = "\\05D5000AFFFF1E\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void lockAccessPointRemote() throws Exception {
-                byte[] bytes = "\\039209D50AFFFF85\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2021%20-%20C-Bus%20Media%20Transport%20Control%20Application.pdf
-    @Nested
-    class MediaTransportControlApplicationsTest {
-        // TODO: no tests described here
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2023%20-%20C-Bus%20Clock%20and%20Timekeeping%20Application.pdf
-    @Nested
-    class ClockAndTimekeeping {
-
-        //23.13
-        @Nested
-        class Examples {
-
-            @Test
-            void outputATimeCommand() throws Exception {
-                byte[] bytes = "\\05DF000D010A2B1700C2\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void outputADateCommand() throws Exception {
-                byte[] bytes = "\\05DF000E0207D502190411\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Disabled("This example just seems plain wrong... First of all there is no command for 0x10 defined and the argument which should be it 0x11 requires a argument of 0x03... So either documenation wrong or the example")
-            @Test
-            void outputARequestRefreshCommand() throws Exception {
-                byte[] bytes = "\\05DF00100C\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void outputARequestRefreshCommandFixedQuestionMark() throws Exception {
-                byte[] bytes = "\\05DF001103\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2024%20-%20C-Bus%20Telephony%20Application.pdf
-    @Nested
-    class Telephony {
-
-        //24.11
-        @Nested
-        class Examples {
-
-            @Test
-            void LineOnHook() throws Exception {
-                byte[] bytes = "\\05E000090111\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Disabled("Again it seems as this command is just wrong... there is no command definition for 2C")
-            @Test
-            void LineOffHook() throws Exception {
-                byte[] bytes = "\\05E0002C020230333935323734333231FD\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            @Test
-            void LineOffHookFixedQuestionMark() throws Exception {
-                byte[] bytes = "\\05E000AC02013033393532373433323168\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-        }
-    }
-
-    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2034%20-%20C-Bus%20Error%20Reporting%20Application.pdf
-    @Nested
-    class ErrorReporting {
-
-        //34.13
-        @Nested
-        class Examples {
-
-            // 34.13.1
-            @Test
-            void AllOk() throws Exception {
-                byte[] bytes = "\\05CE0015FF20DE0000\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-            // 34.13.2
-            @Test
-            void MinorFailure() throws Exception {
-                byte[] bytes = "\\05CE0015882A6721B4\r".getBytes(StandardCharsets.UTF_8);
-                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                assertThat(msg).isNotNull();
-                System.out.println(msg);
-
-                assertMessageMatches(bytes, msg);
-            }
-
-
-            // 34.13.3
-            @Nested
-            class GeneralFailureWhichGetsAcknowledged {
-                @Test
-                void Reporting() throws Exception {
-                    byte[] bytes = "\\05CE00159023426633\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void Acknowledge() throws Exception {
-                    byte[] bytes = "\\05CE00259033426633\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-
-            @Nested
-            class LatchedExtremeFailureWhichGetsCleared {
-                @Test
-                void mostRecent() throws Exception {
-                    byte[] bytes = "\\05CE001569E1FE0100\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void mostSevere() throws Exception {
-                    byte[] bytes = "\\05CE001569CCFE0102\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void clearMostSevere() throws Exception {
-                    byte[] bytes = "\\05CE003569C9FE0102\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-
-                @Test
-                void newError() throws Exception {
-                    byte[] bytes = "\\05CE001569E9FE0100\r".getBytes(StandardCharsets.UTF_8);
-                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
-                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
-                    assertThat(msg).isNotNull();
-                    System.out.println(msg);
-
-                    assertMessageMatches(bytes, msg);
-                }
-            }
-        }
-    }
-}
diff --git a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/connection/MockConnection.java b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/connection/MockConnection.java
index db91dfd7a..a9aa23825 100644
--- a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/connection/MockConnection.java
+++ b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/connection/MockConnection.java
@@ -30,17 +30,7 @@ import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.mock.field.MockField;
 import org.apache.plc4x.java.mock.field.MockFieldHandler;
 import org.apache.plc4x.java.mock.field.MockValueHandler;
-import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse;
-import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionResponse;
-import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionResponse;
-import org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcWriteResponse;
-import org.apache.plc4x.java.spi.messages.PlcReader;
-import org.apache.plc4x.java.spi.messages.PlcSubscriber;
-import org.apache.plc4x.java.spi.messages.PlcWriter;
+import org.apache.plc4x.java.spi.messages.*;
 import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,7 +42,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
-public class MockConnection implements PlcConnection, PlcReader, PlcWriter, PlcSubscriber {
+public class MockConnection implements PlcConnection, PlcReader, PlcWriter, PlcSubscriber, PlcBrowser {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(MockConnection.class);
 
@@ -112,9 +102,28 @@ public class MockConnection implements PlcConnection, PlcReader, PlcWriter, PlcS
             public boolean canSubscribe() {
                 return true;
             }
+
+            @Override
+            public boolean canBrowse() {
+                return true;
+            }
         };
     }
 
+    @Override
+    public PlcBrowseRequest.Builder browseRequestBuilder() {
+        return new DefaultPlcBrowseRequest.Builder(this);
+    }
+
+    @Override
+    public CompletableFuture<PlcBrowseResponse> browse(PlcBrowseRequest browseRequest) {
+        return CompletableFuture.supplyAsync(() -> {
+            Validate.notNull(device, "No device is set in the mock connection!");
+            LOGGER.debug("Sending browse request to MockDevice");
+            return new DefaultPlcBrowseResponse(browseRequest);
+        });
+    }
+
     @Override
     public PlcReadRequest.Builder readRequestBuilder() {
         return new DefaultPlcReadRequest.Builder(this, new MockFieldHandler());
diff --git a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
index 324125a5a..ad0f4f08b 100644
--- a/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
+++ b/plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/OpcuaPlcDriver.java
@@ -103,6 +103,11 @@ public class OpcuaPlcDriver extends GeneratedDriverBase<OpcuaAPU> {
         return true;
     }
 
+    @Override
+    protected boolean canBrowse() {
+        return false;
+    }
+
     @Override
     protected OpcuaOptimizer getOptimizer() {
         return new OpcuaOptimizer();
@@ -223,7 +228,7 @@ public class OpcuaPlcDriver extends GeneratedDriverBase<OpcuaAPU> {
         }
 
         return new DefaultNettyPlcConnection(
-            canRead(), canWrite(), canSubscribe(),
+            canRead(), canWrite(), canSubscribe(), canBrowse(),
             getFieldHandler(),
             getValueHandler(),
             configuration,
diff --git a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java
index 246b53c6f..8df6bca59 100644
--- a/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java
+++ b/plc4j/drivers/profinet/src/main/java/org/apache/plc4x/java/profinet/discovery/ProfinetPlcDiscoverer.java
@@ -74,6 +74,13 @@ public class ProfinetPlcDiscoverer implements PlcDiscoverer {
         List<PlcDiscoveryItem> values = new ArrayList<>();
         try {
             for (PcapNetworkInterface dev : Pcaps.findAllDevs()) {
+                // It turned out on some MAC network devices without any ip addresses
+                // the compiling of the filter expression was causing errors. As
+                // currently there was no other way to detect this, this check seems
+                // to be sufficient.
+                if(dev.getAddresses().size() == 0) {
+                    continue;
+                }
                 if (!dev.isLoopBack()) {
                     for (LinkLayerAddress linkLayerAddress : dev.getLinkLayerAddresses()) {
                         org.pcap4j.util.MacAddress macAddress = (org.pcap4j.util.MacAddress) linkLayerAddress;
diff --git a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java
index ac33c9e86..c580aea2c 100644
--- a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedConnection.java
@@ -78,7 +78,7 @@ public class SimulatedConnection extends AbstractPlcConnection implements PlcRea
     private final Map<Integer, Consumer<PlcSubscriptionEvent>> consumerIdMap = new ConcurrentHashMap<>();
 
     public SimulatedConnection(SimulatedDevice device) {
-        super(true, true, true, new SimulatedFieldHandler(), new IEC61131ValueHandler(), null);
+        super(true, true, true, false, new SimulatedFieldHandler(), new IEC61131ValueHandler(), null);
         this.device = device;
     }
 
diff --git a/plc4j/examples/hello-world-plc4x-subscription/pom.xml b/plc4j/examples/hello-world-plc4x-discover-and-browse/pom.xml
similarity index 86%
copy from plc4j/examples/hello-world-plc4x-subscription/pom.xml
copy to plc4j/examples/hello-world-plc4x-discover-and-browse/pom.xml
index 86febad26..671ea5a45 100644
--- a/plc4j/examples/hello-world-plc4x-subscription/pom.xml
+++ b/plc4j/examples/hello-world-plc4x-discover-and-browse/pom.xml
@@ -27,12 +27,12 @@
     <version>0.10.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-examples-hello-world-plc4x-subscription</artifactId>
-  <name>PLC4J: Examples: Hello-World PLC4X (Subscription)</name>
-  <description>Hello world application for PLC4X using the subscription API.</description>
+  <artifactId>plc4j-examples-hello-world-plc4x-discover-and-browse</artifactId>
+  <name>PLC4J: Examples: Hello-World PLC4X (Discover And Browse)</name>
+  <description>Hello world application for PLC4X using the discovery and browse-API.</description>
 
   <properties>
-    <app.main.class>org.apache.plc4x.java.examples.helloplc4x.subscription.HelloPlc4xSubscription</app.main.class>
+    <app.main.class>org.apache.plc4x.java.examples.helloplc4x.discoverandbrowse.HelloPlc4x</app.main.class>
   </properties>
 
   <dependencies>
@@ -46,7 +46,6 @@
       <groupId>commons-cli</groupId>
       <artifactId>commons-cli</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
diff --git a/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/java/org/apache/plc4x/java/examples/helloplc4x/discoverandbrowse/HelloPlc4x.java b/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/java/org/apache/plc4x/java/examples/helloplc4x/discoverandbrowse/HelloPlc4x.java
new file mode 100644
index 000000000..b95d3a670
--- /dev/null
+++ b/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/java/org/apache/plc4x/java/examples/helloplc4x/discoverandbrowse/HelloPlc4x.java
@@ -0,0 +1,60 @@
+/*
+ * 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.examples.helloplc4x.discoverandbrowse;
+
+import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.api.PlcDriver;
+import org.apache.plc4x.java.api.messages.PlcDiscoveryItem;
+import org.apache.plc4x.java.api.messages.PlcDiscoveryRequest;
+import org.apache.plc4x.java.api.messages.PlcDiscoveryResponse;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.TimeUnit;
+
+public class HelloPlc4x {
+
+    private static final Logger logger = LoggerFactory.getLogger(HelloPlc4x.class);
+
+    public static void main(String[] args) throws Exception {
+        // Iterate over all installed drivers and execute their browse functionality (If they support it)
+        PlcDriverManager plcDriverManager = new PlcDriverManager();
+        for (String protocolCode : plcDriverManager.listDrivers()) {
+            // For some reason modbus is failing on my machine ... investigate
+            if(protocolCode.startsWith("modbus")) {
+                continue;
+            }
+            PlcDriver driver = plcDriverManager.getDriver(protocolCode);
+            if(driver.getMetadata().canDiscover()) {
+                logger.info("Performing discovery for {} protocol", driver.getProtocolName());
+
+                PlcDiscoveryRequest discoveryRequest = driver.discoveryRequestBuilder().build();
+
+                PlcDiscoveryResponse discoveryResponse = discoveryRequest.execute().get(60, TimeUnit.SECONDS);
+                if(discoveryResponse.getResponseCode() == PlcResponseCode.OK) {
+                    for (PlcDiscoveryItem value : discoveryResponse.getValues()) {
+                        logger.info(" - Found device with connection-url {}", value.getConnectionUrl());
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/plc4j/examples/hello-world-plc4x/src/main/resources/logback.xml b/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/resources/logback.xml
similarity index 91%
copy from plc4j/examples/hello-world-plc4x/src/main/resources/logback.xml
copy to plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/resources/logback.xml
index eee180ec7..6359e3453 100644
--- a/plc4j/examples/hello-world-plc4x/src/main/resources/logback.xml
+++ b/plc4j/examples/hello-world-plc4x-discover-and-browse/src/main/resources/logback.xml
@@ -27,7 +27,10 @@
     </encoder>
   </appender>
 
-  <root level="info">
+  <!-- Pcap4j seems to be quite chatty -->
+  <logger name="org.pcap4j" level="WARN"/>
+
+  <root level="INFO">
     <appender-ref ref="STDOUT" />
   </root>
 
diff --git a/plc4j/examples/hello-world-plc4x/pom.xml b/plc4j/examples/hello-world-plc4x-read/pom.xml
similarity index 87%
rename from plc4j/examples/hello-world-plc4x/pom.xml
rename to plc4j/examples/hello-world-plc4x-read/pom.xml
index 233a03a88..c16e97cf8 100644
--- a/plc4j/examples/hello-world-plc4x/pom.xml
+++ b/plc4j/examples/hello-world-plc4x-read/pom.xml
@@ -27,12 +27,12 @@
     <version>0.10.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-examples-hello-world-plc4x</artifactId>
-  <name>PLC4J: Examples: Hello-World PLC4X</name>
-  <description>Hello world application for PLC4X.</description>
+  <artifactId>plc4j-examples-hello-world-plc4x-read</artifactId>
+  <name>PLC4J: Examples: Hello-World PLC4X (Read)</name>
+  <description>Hello world application for PLC4X using the read-API.</description>
 
   <properties>
-    <app.main.class>org.apache.plc4x.java.examples.helloplc4x.HelloPlc4x</app.main.class>
+    <app.main.class>org.apache.plc4x.java.examples.helloplc4x.discoverandbrowse.HelloPlc4x</app.main.class>
   </properties>
 
   <dependencies>
diff --git a/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/CliOptions.java b/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/CliOptions.java
similarity index 97%
rename from plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/CliOptions.java
rename to plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/CliOptions.java
index 3a21d7cc1..718c6a767 100644
--- a/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/CliOptions.java
+++ b/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/CliOptions.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.examples.helloplc4x;
+package org.apache.plc4x.java.examples.helloplc4x.read;
 
 import org.apache.commons.cli.*;
 
diff --git a/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java b/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/HelloPlc4x.java
similarity index 96%
rename from plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
rename to plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/HelloPlc4x.java
index 3ecd91105..b74623d9b 100644
--- a/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
+++ b/plc4j/examples/hello-world-plc4x-read/src/main/java/org/apache/plc4x/java/examples/helloplc4x/read/HelloPlc4x.java
@@ -16,19 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.examples.helloplc4x;
+package org.apache.plc4x.java.examples.helloplc4x.read;
 
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.api.value.PlcValue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.concurrent.CompletionStage;
 import java.util.concurrent.TimeUnit;
 
 public class HelloPlc4x {
diff --git a/plc4j/examples/hello-world-plc4x/src/main/resources/logback.xml b/plc4j/examples/hello-world-plc4x-read/src/main/resources/logback.xml
similarity index 100%
rename from plc4j/examples/hello-world-plc4x/src/main/resources/logback.xml
rename to plc4j/examples/hello-world-plc4x-read/src/main/resources/logback.xml
diff --git a/plc4j/examples/hello-world-plc4x-subscription/pom.xml b/plc4j/examples/hello-world-plc4x-subscribe/pom.xml
similarity index 91%
rename from plc4j/examples/hello-world-plc4x-subscription/pom.xml
rename to plc4j/examples/hello-world-plc4x-subscribe/pom.xml
index 86febad26..5a1443789 100644
--- a/plc4j/examples/hello-world-plc4x-subscription/pom.xml
+++ b/plc4j/examples/hello-world-plc4x-subscribe/pom.xml
@@ -27,12 +27,12 @@
     <version>0.10.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-examples-hello-world-plc4x-subscription</artifactId>
-  <name>PLC4J: Examples: Hello-World PLC4X (Subscription)</name>
-  <description>Hello world application for PLC4X using the subscription API.</description>
+  <artifactId>plc4j-examples-hello-world-plc4x-subscribe</artifactId>
+  <name>PLC4J: Examples: Hello-World PLC4X (Subscribe)</name>
+  <description>Hello world application for PLC4X using the subscription-API.</description>
 
   <properties>
-    <app.main.class>org.apache.plc4x.java.examples.helloplc4x.subscription.HelloPlc4xSubscription</app.main.class>
+    <app.main.class>org.apache.plc4x.java.examples.helloplc4x.subscribe.HelloPlc4xSubscription</app.main.class>
   </properties>
 
   <dependencies>
diff --git a/plc4j/examples/hello-world-plc4x-subscription/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscription/CliOptions.java b/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/CliOptions.java
similarity index 97%
rename from plc4j/examples/hello-world-plc4x-subscription/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscription/CliOptions.java
rename to plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/CliOptions.java
index 694e907fe..acb6fc21f 100644
--- a/plc4j/examples/hello-world-plc4x-subscription/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscription/CliOptions.java
+++ b/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/CliOptions.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.examples.helloplc4x.subscription;
+package org.apache.plc4x.java.examples.helloplc4x.subscribe;
 
 import org.apache.commons.cli.*;
 
diff --git a/plc4j/examples/hello-world-plc4x-subscription/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscription/HelloPlc4xSubscription.java b/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/HelloPlc4xSubscription.java
similarity index 98%
rename from plc4j/examples/hello-world-plc4x-subscription/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscription/HelloPlc4xSubscription.java
rename to plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/HelloPlc4xSubscription.java
index 2f827bf02..60b35a508 100644
--- a/plc4j/examples/hello-world-plc4x-subscription/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscription/HelloPlc4xSubscription.java
+++ b/plc4j/examples/hello-world-plc4x-subscribe/src/main/java/org/apache/plc4x/java/examples/helloplc4x/subscribe/HelloPlc4xSubscription.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.examples.helloplc4x.subscription;
+package org.apache.plc4x.java.examples.helloplc4x.subscribe;
 
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
diff --git a/plc4j/examples/hello-world-plc4x-subscription/src/main/resources/logback.xml b/plc4j/examples/hello-world-plc4x-subscribe/src/main/resources/logback.xml
similarity index 95%
rename from plc4j/examples/hello-world-plc4x-subscription/src/main/resources/logback.xml
rename to plc4j/examples/hello-world-plc4x-subscribe/src/main/resources/logback.xml
index 7d1b5f9ce..c990d53ab 100644
--- a/plc4j/examples/hello-world-plc4x-subscription/src/main/resources/logback.xml
+++ b/plc4j/examples/hello-world-plc4x-subscribe/src/main/resources/logback.xml
@@ -27,7 +27,7 @@
     </encoder>
   </appender>
 
-  <logger name="org.apache.plc4x.java.examples.helloplc4x.subscription.HelloPlc4xSubscription" level="info"/>
+  <logger name="org.apache.plc4x.java.examples.helloplc4x.subscribe.HelloPlc4xSubscription" level="info"/>
 
   <root level="warn">
     <appender-ref ref="STDOUT" />
diff --git a/plc4j/examples/hello-world-plc4x-write/pom.xml b/plc4j/examples/hello-world-plc4x-write/pom.xml
index 8a9ee8a9c..52d111762 100644
--- a/plc4j/examples/hello-world-plc4x-write/pom.xml
+++ b/plc4j/examples/hello-world-plc4x-write/pom.xml
@@ -29,7 +29,7 @@
 
   <artifactId>plc4j-examples-hello-world-plc4x-write</artifactId>
   <name>PLC4J: Examples: Hello-World PLC4X (Write)</name>
-  <description>Hello world application for PLC4X using the write API.</description>
+  <description>Hello world application for PLC4X using the write-API.</description>
 
   <properties>
     <app.main.class>org.apache.plc4x.java.examples.helloplc4x.write.HelloPlc4xWrite</app.main.class>
diff --git a/plc4j/examples/pom.xml b/plc4j/examples/pom.xml
index 6027e2076..7e97693cd 100644
--- a/plc4j/examples/pom.xml
+++ b/plc4j/examples/pom.xml
@@ -50,8 +50,9 @@
     <module>hello-opm</module>
     <module>hello-webservice</module>
     <module>hello-world-kotlin</module>
-    <module>hello-world-plc4x</module>
-    <module>hello-world-plc4x-subscription</module>
+    <module>hello-world-plc4x-discover-and-browse</module>
+    <module>hello-world-plc4x-read</module>
+    <module>hello-world-plc4x-subscribe</module>
     <module>hello-world-plc4x-write</module>
     <module>poll-loop</module>
     <module>plc4j-s7event</module>
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java
index 2253e206e..8a2587a04 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/AbstractPlcConnection.java
@@ -26,17 +26,10 @@ import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
 import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
 import org.apache.plc4x.java.spi.Plc4xProtocolBase;
-import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest;
-import org.apache.plc4x.java.spi.messages.PlcReader;
-import org.apache.plc4x.java.spi.messages.PlcSubscriber;
-import org.apache.plc4x.java.spi.messages.PlcWriter;
+import org.apache.plc4x.java.spi.messages.*;
 import org.apache.plc4x.java.spi.optimizer.BaseOptimizer;
 import org.apache.plc4x.java.api.value.PlcValueHandler;
 
-
 import java.util.Collection;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Consumer;
@@ -47,11 +40,12 @@ import java.util.function.Consumer;
  * Concrete implementations should override the methods indicating connection capabilities
  * and for obtaining respective request builders.
  */
-public abstract class AbstractPlcConnection implements PlcConnection, PlcConnectionMetadata, PlcReader, PlcWriter , PlcSubscriber {
+public abstract class AbstractPlcConnection implements PlcConnection, PlcConnectionMetadata, PlcReader, PlcWriter, PlcSubscriber, PlcBrowser {
 
     private boolean canRead = false;
     private boolean canWrite = false;
     private boolean canSubscribe = false;
+    private boolean canBrowse = false;
     private PlcFieldHandler fieldHandler;
     private PlcValueHandler valueHandler;
     private Plc4xProtocolBase<?> protocol;
@@ -64,11 +58,12 @@ public abstract class AbstractPlcConnection implements PlcConnection, PlcConnect
     protected AbstractPlcConnection() {
     }
 
-    protected AbstractPlcConnection(boolean canRead, boolean canWrite, boolean canSubscribe, PlcFieldHandler fieldHandler, PlcValueHandler valueHandler,
+    protected AbstractPlcConnection(boolean canRead, boolean canWrite, boolean canSubscribe, boolean canBrowse, PlcFieldHandler fieldHandler, PlcValueHandler valueHandler,
                                  BaseOptimizer optimizer) {
         this.canRead = canRead;
         this.canWrite = canWrite;
         this.canSubscribe = canSubscribe;
+        this.canBrowse = canBrowse;
         this.fieldHandler = fieldHandler;
         this.valueHandler = valueHandler;
         this.optimizer = optimizer;
@@ -105,6 +100,11 @@ public abstract class AbstractPlcConnection implements PlcConnection, PlcConnect
         return canSubscribe;
     }
 
+    @Override
+    public boolean canBrowse() {
+        return canBrowse;
+    }
+
     public PlcFieldHandler getPlcFieldHandler() {
         return this.fieldHandler;
     }
@@ -145,6 +145,14 @@ public abstract class AbstractPlcConnection implements PlcConnection, PlcConnect
         return new DefaultPlcUnsubscriptionRequest.Builder(this);
     }
 
+    @Override
+    public PlcBrowseRequest.Builder browseRequestBuilder() {
+        if (!canBrowse) {
+            throw new PlcUnsupportedOperationException("The connection does not support browsing");
+        }
+        return new DefaultPlcBrowseRequest.Builder(this);
+    }
+
     @Override
     public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
         if(optimizer != null) {
@@ -187,4 +195,9 @@ public abstract class AbstractPlcConnection implements PlcConnection, PlcConnect
         throw new NotImplementedException("");
     }
 
+    @Override
+    public CompletableFuture<PlcBrowseResponse> browse(PlcBrowseRequest browseRequest) {
+        throw new NotImplementedException("");
+    }
+
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
index ab8852906..303465976 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
@@ -64,12 +64,12 @@ public class DefaultNettyPlcConnection extends AbstractPlcConnection implements
     protected Channel channel;
     protected boolean connected;
 
-    public DefaultNettyPlcConnection(boolean canRead, boolean canWrite, boolean canSubscribe,
+    public DefaultNettyPlcConnection(boolean canRead, boolean canWrite, boolean canSubscribe, boolean canBrowse,
                                      PlcFieldHandler fieldHandler, PlcValueHandler valueHandler, Configuration configuration,
                                      ChannelFactory channelFactory, boolean awaitSessionSetupComplete,
                                      boolean awaitSessionDisconnectComplete, boolean awaitSessionDiscoverComplete,
                                      ProtocolStackConfigurer stackConfigurer, BaseOptimizer optimizer) {
-        super(canRead, canWrite, canSubscribe, fieldHandler, valueHandler, optimizer);
+        super(canRead, canWrite, canSubscribe, canBrowse, fieldHandler, valueHandler, optimizer);
         this.configuration = configuration;
         this.channelFactory = channelFactory;
         this.awaitSessionSetupComplete = awaitSessionSetupComplete;
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java
index a5ea32f3d..7c65760ac 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/GeneratedDriverBase.java
@@ -58,6 +58,10 @@ public abstract class GeneratedDriverBase<BASE_PACKET extends Message> implement
         return false;
     }
 
+    protected boolean canBrowse() {
+        return false;
+    }
+
     protected boolean awaitSetupComplete() {
         return true;
     }
@@ -164,7 +168,7 @@ public abstract class GeneratedDriverBase<BASE_PACKET extends Message> implement
         }
 
         return new DefaultNettyPlcConnection(
-            canRead(), canWrite(), canSubscribe(),
+            canRead(), canWrite(), canSubscribe(), canBrowse(),
             getFieldHandler(),
             getValueHandler(),
             configuration,
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcBrowseRequest.java
similarity index 51%
copy from plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcBrowseRequest.java
index 3b0cccd14..3be055447 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcBrowseRequest.java
@@ -20,53 +20,70 @@ package org.apache.plc4x.java.spi.messages;
 
 import com.fasterxml.jackson.annotation.*;
 import org.apache.plc4x.java.api.messages.*;
-import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.SerializationException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.utils.Serializable;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
-public class DefaultPlcDiscoveryRequest implements PlcDiscoveryRequest, Serializable {
+public class DefaultPlcBrowseRequest implements PlcBrowseRequest, Serializable {
 
-    private final PlcDiscoverer discoverer;
+    private final PlcBrowser browser;
+
+    private final LinkedHashMap<String, String> queries;
 
     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
-    public DefaultPlcDiscoveryRequest(@JsonProperty("discoverer") PlcDiscoverer discoverer) {
-        this.discoverer = discoverer;
+    public DefaultPlcBrowseRequest(@JsonProperty("browser") PlcBrowser browser,
+                                   @JsonProperty("queries") LinkedHashMap<String, String> queries) {
+        this.browser = browser;
+        this.queries = queries;
     }
 
     @Override
-    public CompletableFuture<? extends PlcDiscoveryResponse> execute() {
-        return discoverer.discover(this);
+    @JsonIgnore
+    public CompletableFuture<PlcBrowseResponse> execute() {
+        return browser.browse(this);
     }
 
-    @Override
-    public CompletableFuture<? extends PlcDiscoveryResponse> executeWithHandler(PlcDiscoveryItemHandler handler) {
-        return discoverer.discoverWithHandler(this, handler);
+    @JsonIgnore
+    public PlcBrowser getBrowser() {
+        return browser;
+    }
+
+    @JsonIgnore
+    public Map<String, String> getQueries() {
+        return queries;
     }
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws SerializationException {
-        writeBuffer.pushContext("PlcDiscoveryRequest");
+        writeBuffer.pushContext("PlcBrowseRequest");
+        writeBuffer.popContext("PlcBrowseRequest");
+    }
 
-        // TODO: Implement
+    public static class Builder implements PlcBrowseRequest.Builder {
 
-        writeBuffer.popContext("PlcDiscoveryRequest");
-    }
+        private final PlcBrowser browser;
 
-    public static class Builder implements PlcDiscoveryRequest.Builder {
+        private final LinkedHashMap<String, String> queries;
 
-        private final PlcDiscoverer discoverer;
+        public Builder(PlcBrowser browser) {
+            this.browser = browser;
+            queries = new LinkedHashMap<>();
+        }
 
-        public Builder(PlcDiscoverer discoverer) {
-            this.discoverer = discoverer;
+        @Override
+        public Builder addQuery(String name, String query) {
+            queries.put(name, query);
+            return this;
         }
 
         @Override
-        public PlcDiscoveryRequest build() {
-            return new DefaultPlcDiscoveryRequest(discoverer);
+        public PlcBrowseRequest build() {
+            return new DefaultPlcBrowseRequest(browser, queries);
         }
 
     }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcBrowseResponse.java
similarity index 51%
copy from plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcBrowseResponse.java
index 3b0cccd14..ae24cca36 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcBrowseResponse.java
@@ -19,56 +19,48 @@
 package org.apache.plc4x.java.spi.messages;
 
 import com.fasterxml.jackson.annotation.*;
-import org.apache.plc4x.java.api.messages.*;
-import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
+import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
+import org.apache.plc4x.java.api.messages.PlcBrowseRequest;
+import org.apache.plc4x.java.api.messages.PlcBrowseResponse;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.model.PlcField;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.generation.SerializationException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.messages.utils.ResponseItem;
 import org.apache.plc4x.java.spi.utils.Serializable;
+import org.apache.plc4x.java.spi.values.PlcList;
+import org.apache.plc4x.java.spi.values.PlcStruct;
 
-import java.util.concurrent.CompletableFuture;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.*;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
-public class DefaultPlcDiscoveryRequest implements PlcDiscoveryRequest, Serializable {
+public class DefaultPlcBrowseResponse implements PlcBrowseResponse, Serializable {
 
-    private final PlcDiscoverer discoverer;
+    private final PlcBrowseRequest request;
 
     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
-    public DefaultPlcDiscoveryRequest(@JsonProperty("discoverer") PlcDiscoverer discoverer) {
-        this.discoverer = discoverer;
+    public DefaultPlcBrowseResponse(@JsonProperty("request") PlcBrowseRequest request) {
+        this.request = request;
     }
 
     @Override
-    public CompletableFuture<? extends PlcDiscoveryResponse> execute() {
-        return discoverer.discover(this);
-    }
-
-    @Override
-    public CompletableFuture<? extends PlcDiscoveryResponse> executeWithHandler(PlcDiscoveryItemHandler handler) {
-        return discoverer.discoverWithHandler(this, handler);
+    public PlcBrowseRequest getRequest() {
+        return request;
     }
 
     @Override
     public void serialize(WriteBuffer writeBuffer) throws SerializationException {
-        writeBuffer.pushContext("PlcDiscoveryRequest");
-
-        // TODO: Implement
-
-        writeBuffer.popContext("PlcDiscoveryRequest");
-    }
-
-    public static class Builder implements PlcDiscoveryRequest.Builder {
-
-        private final PlcDiscoverer discoverer;
-
-        public Builder(PlcDiscoverer discoverer) {
-            this.discoverer = discoverer;
-        }
-
-        @Override
-        public PlcDiscoveryRequest build() {
-            return new DefaultPlcDiscoveryRequest(discoverer);
-        }
-
+        writeBuffer.pushContext("PlcBrowseResponse");
+        writeBuffer.popContext("PlcBrowseResponse");
     }
 
 }
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java
index ab2292529..874d7b8ca 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryItem.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import org.apache.plc4x.java.api.messages.PlcDiscoveryItem;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.SerializationException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
@@ -39,7 +40,7 @@ public class DefaultPlcDiscoveryItem implements PlcDiscoveryItem, Serializable {
     private final Map<String, String> options;
     private final String name;
 
-    private final Map<String, String> attributes;
+    private final Map<String, PlcValue> attributes;
 
     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
     public DefaultPlcDiscoveryItem(@JsonProperty("protocolCode") String protocolCode,
@@ -47,7 +48,7 @@ public class DefaultPlcDiscoveryItem implements PlcDiscoveryItem, Serializable {
                                    @JsonProperty("transportUrl") String transportUrl,
                                    @JsonProperty("options") Map<String, String> options,
                                    @JsonProperty("name") String name,
-                                   @JsonProperty("options") Map<String, String> attributes) {
+                                   @JsonProperty("options") Map<String, PlcValue> attributes) {
         this.protocolCode = protocolCode;
         this.transportCode = transportCode;
         this.transportUrl = transportUrl;
@@ -82,7 +83,7 @@ public class DefaultPlcDiscoveryItem implements PlcDiscoveryItem, Serializable {
     }
 
     @Override
-    public Map<String, String> getAttributes() {
+    public Map<String, PlcValue> getAttributes() {
         return attributes;
     }
 
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java
index 3b0cccd14..50cbe6ae2 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcDiscoveryRequest.java
@@ -20,11 +20,12 @@ package org.apache.plc4x.java.spi.messages;
 
 import com.fasterxml.jackson.annotation.*;
 import org.apache.plc4x.java.api.messages.*;
-import org.apache.plc4x.java.spi.generation.ParseException;
 import org.apache.plc4x.java.spi.generation.SerializationException;
 import org.apache.plc4x.java.spi.generation.WriteBuffer;
 import org.apache.plc4x.java.spi.utils.Serializable;
 
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
@@ -32,16 +33,31 @@ public class DefaultPlcDiscoveryRequest implements PlcDiscoveryRequest, Serializ
 
     private final PlcDiscoverer discoverer;
 
+    private final LinkedHashMap<String, String> queries;
+
     @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
-    public DefaultPlcDiscoveryRequest(@JsonProperty("discoverer") PlcDiscoverer discoverer) {
+    public DefaultPlcDiscoveryRequest(@JsonProperty("discoverer") PlcDiscoverer discoverer,
+                                      @JsonProperty("queries") LinkedHashMap<String, String> queries) {
         this.discoverer = discoverer;
+        this.queries = queries;
     }
 
     @Override
+    @JsonIgnore
     public CompletableFuture<? extends PlcDiscoveryResponse> execute() {
         return discoverer.discover(this);
     }
 
+    @JsonIgnore
+    public PlcDiscoverer getDiscoverer() {
+        return discoverer;
+    }
+
+    @JsonIgnore
+    public Map<String, String> getQueries() {
+        return queries;
+    }
+
     @Override
     public CompletableFuture<? extends PlcDiscoveryResponse> executeWithHandler(PlcDiscoveryItemHandler handler) {
         return discoverer.discoverWithHandler(this, handler);
@@ -60,13 +76,22 @@ public class DefaultPlcDiscoveryRequest implements PlcDiscoveryRequest, Serializ
 
         private final PlcDiscoverer discoverer;
 
+        private final LinkedHashMap<String, String> queries;
+
         public Builder(PlcDiscoverer discoverer) {
             this.discoverer = discoverer;
+            queries = new LinkedHashMap<>();
+        }
+
+        @Override
+        public PlcDiscoveryRequest.Builder addQuery(String name, String query) {
+            queries.put(name, query);
+            return this;
         }
 
         @Override
         public PlcDiscoveryRequest build() {
-            return new DefaultPlcDiscoveryRequest(discoverer);
+            return new DefaultPlcDiscoveryRequest(discoverer, queries);
         }
 
     }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcBrowser.java
similarity index 58%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
copy to plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcBrowser.java
index 2e19ea89f..565f1b2fe 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/PlcBrowser.java
@@ -16,21 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.api.messages;
+package org.apache.plc4x.java.spi.messages;
 
-import java.util.concurrent.CompletableFuture;
-
-public interface PlcBrowseRequest extends PlcRequest {
-
-    CompletableFuture<? extends PlcBrowseResponse> execute();
-
-    interface Builder extends PlcRequestBuilder {
+import org.apache.plc4x.java.api.messages.PlcBrowseRequest;
+import org.apache.plc4x.java.api.messages.PlcBrowseResponse;
 
-        @Override
-        PlcBrowseRequest build();
-
-        PlcReadRequest.Builder addItem(String name, String fieldQuery);
+import java.util.concurrent.CompletableFuture;
 
-    }
+/**
+ * Interface implemented by all PlcConnections that are able to browse remote resources.
+ */
+public interface PlcBrowser {
+
+    /**
+     * Reads a requested value from a PLC.
+     *
+     * @param browseRequest object describing the type and location of the value.
+     * @return a {@link CompletableFuture} giving async access to the returned value.
+     */
+    CompletableFuture<PlcBrowseResponse> browse(PlcBrowseRequest browseRequest);
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedBrowseRequest.java
similarity index 55%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
copy to plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedBrowseRequest.java
index 2e19ea89f..2952b395d 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedBrowseRequest.java
@@ -16,21 +16,27 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.api.messages;
+package org.apache.plc4x.java.utils.connectionpool2;
 
-import java.util.concurrent.CompletableFuture;
-
-public interface PlcBrowseRequest extends PlcRequest {
+import org.apache.plc4x.java.api.messages.PlcBrowseRequest;
+import org.apache.plc4x.java.api.messages.PlcBrowseResponse;
 
-    CompletableFuture<? extends PlcBrowseResponse> execute();
+import java.util.concurrent.CompletableFuture;
 
-    interface Builder extends PlcRequestBuilder {
+public class CachedBrowseRequest implements PlcBrowseRequest {
 
-        @Override
-        PlcBrowseRequest build();
+    private final CachedPlcConnection parent;
+    private final PlcBrowseRequest innerRequest;
 
-        PlcReadRequest.Builder addItem(String name, String fieldQuery);
+    public CachedBrowseRequest(CachedPlcConnection parent, PlcBrowseRequest innerRequest) {
+        this.parent = parent;
+        this.innerRequest = innerRequest;
+    }
 
+    @Override
+    public CompletableFuture<? extends PlcBrowseResponse> execute() {
+        // Only allowed if connection is still active
+        return parent.execute(innerRequest);
     }
 
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedBrowseRequestBuilder.java
similarity index 53%
copy from plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
copy to plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedBrowseRequestBuilder.java
index 2e19ea89f..ff0cfc509 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequest.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedBrowseRequestBuilder.java
@@ -16,21 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.api.messages;
+package org.apache.plc4x.java.utils.connectionpool2;
 
-import java.util.concurrent.CompletableFuture;
+import org.apache.plc4x.java.api.messages.PlcBrowseRequest;
 
-public interface PlcBrowseRequest extends PlcRequest {
+public class CachedBrowseRequestBuilder implements PlcBrowseRequest.Builder {
 
-    CompletableFuture<? extends PlcBrowseResponse> execute();
+    private final CachedPlcConnection parent;
+    private final PlcBrowseRequest.Builder builder;
 
-    interface Builder extends PlcRequestBuilder {
-
-        @Override
-        PlcBrowseRequest build();
+    public CachedBrowseRequestBuilder(CachedPlcConnection parent, PlcBrowseRequest.Builder builder) {
+        this.parent = parent;
+        this.builder = builder;
+    }
 
-        PlcReadRequest.Builder addItem(String name, String fieldQuery);
+    @Override
+    public PlcBrowseRequest.Builder addQuery(String name, String query) {
+        return builder.addQuery(name, query);
+    }
 
+    @Override
+    public PlcBrowseRequest build() {
+        return new CachedBrowseRequest(parent, builder.build());
     }
 
 }
diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java
index d05801216..462fc3358 100644
--- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedPlcConnection.java
@@ -68,6 +68,34 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
         }
     }
 
+    private CompletableFuture<? extends PlcBrowseResponse> wrapBrowseWithTimeout(CompletableFuture<? extends PlcBrowseResponse> future, long timeoutMillis) {
+        //schedule watcher
+        final CompletableFuture<PlcBrowseResponse> responseFuture = new CompletableFuture<>();
+        schedulerExecutor.schedule(() -> {
+            if (!future.isDone()) {
+                logger.debug("Timing out the PLC request!");
+                future.cancel(true);
+                responseFuture.completeExceptionally(new TimeoutException("Response did not finish in Time!"));
+            } else {
+                logger.trace("Unnecessary to cancel the request!");
+            }
+        }, timeoutMillis, TimeUnit.MILLISECONDS);
+        future.handle(new BiFunction<PlcBrowseResponse, Throwable, Object>() {
+            @Override
+            public Object apply(PlcBrowseResponse plcBrowseResponse, Throwable throwable) {
+                if (plcBrowseResponse != null) {
+                    logger.debug("Request finsihed successfull!");
+                    responseFuture.complete(plcBrowseResponse);
+                } else {
+                    logger.debug("Request failed", throwable);
+                    responseFuture.completeExceptionally(throwable);
+                }
+                return null;
+            }
+        });
+        return responseFuture;
+    }
+
     private CompletableFuture<? extends PlcReadResponse> wrapReadWithTimeout(CompletableFuture<? extends PlcReadResponse> future, long timeoutMillis) {
         //schedule watcher
         final CompletableFuture<PlcReadResponse> responseFuture = new CompletableFuture<>();
@@ -124,6 +152,34 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
         return responseFuture;
     }
 
+    public CompletableFuture<? extends PlcBrowseResponse> execute(PlcBrowseRequest request) {
+        logger.trace("Trying to executing Request {}", request);
+        if (closed) {
+            throw new IllegalStateException("Trying to execute a Request on a closed Connection!");
+        }
+        try {
+            logger.trace("Executing Request {}", request);
+            final CompletableFuture<? extends PlcBrowseResponse> responseFuture = wrapBrowseWithTimeout(request.execute(), 5_000);
+            // The following code handles the case, that a read fails (which is handled async and thus not really connected
+            // to the connection, yet
+            // Thus, we register our own listener who gets the notification and reports the connection as broken
+            final CompletableFuture<PlcBrowseResponse> handledResponseFuture = responseFuture.handleAsync(new BiFunction<PlcBrowseResponse, Throwable, PlcBrowseResponse>() {
+                @Override
+                public PlcBrowseResponse apply(PlcBrowseResponse plcBrowseResponse, Throwable throwable) {
+                    if (throwable != null) {
+                        // Do something here...
+                        logger.warn("Request finished with exception. Reporting Connection as Broken", throwable);
+                        closeConnectionExceptionally(null);
+                    }
+                    return plcBrowseResponse;
+                }
+            });
+            return handledResponseFuture;
+        } catch (Exception e) {
+            return (CompletableFuture<? extends PlcBrowseResponse>) closeConnectionExceptionally(e);
+        }
+    }
+
     /**
      * Executes the Request.
      */
@@ -227,6 +283,14 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
         return future;
     }
 
+    @Override
+    public PlcBrowseRequest.Builder browseRequestBuilder() {
+        if (closed) {
+            throw new IllegalStateException("Trying to build a Request on a closed Connection!");
+        }
+        return new CachedBrowseRequestBuilder(this, this.getActiveConnection().browseRequestBuilder());
+    }
+
     @Override
     public PlcReadRequest.Builder readRequestBuilder() {
         if (closed) {
@@ -253,6 +317,15 @@ public class CachedPlcConnection implements PlcConnection, PlcConnectionMetadata
         throw new UnsupportedOperationException();
     }
 
+    @Override
+    public boolean canBrowse() {
+        if (closed) {
+            return false;
+        } else {
+            return this.activeConnection.getMetadata().canBrowse();
+        }
+    }
+
     @Override
     public boolean canRead() {
         if (closed) {
diff --git a/plc4j/tools/connection-pool/src/test/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManagerTest.java b/plc4j/tools/connection-pool/src/test/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManagerTest.java
index 8f87216fd..499edf1c6 100644
--- a/plc4j/tools/connection-pool/src/test/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManagerTest.java
+++ b/plc4j/tools/connection-pool/src/test/java/org/apache/plc4x/java/utils/connectionpool/PooledPlcDriverManagerTest.java
@@ -26,10 +26,7 @@ import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.authentication.PlcUsernamePasswordAuthentication;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcUnsubscriptionRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.*;
 import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
 import org.apache.plc4x.java.api.PlcDriver;
 import org.assertj.core.api.WithAssertions;
@@ -331,6 +328,11 @@ class PooledPlcDriverManagerTest implements WithAssertions {
             return false;
         }
 
+        @Override
+        public boolean canBrowse() {
+            return false;
+        }
+
         @Override
         public void close() {
             connected = false;
@@ -356,6 +358,11 @@ class PooledPlcDriverManagerTest implements WithAssertions {
             throw new PlcUnsupportedOperationException("The connection does not support subscription");
         }
 
+        @Override
+        public PlcBrowseRequest.Builder browseRequestBuilder() {
+            throw new PlcUnsupportedOperationException("The connection does not support browsing");
+        }
+
         @Override
         public String toString() {
             return "DummyPlcConnection{" +
diff --git a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
index e7b5f86af..d039f16aa 100644
--- a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
+++ b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
@@ -217,6 +217,12 @@ public class PlcEntityManagerComplexTest implements WithAssertions {
             public boolean canSubscribe() {
                 return true;
             }
+
+            @Override
+            public boolean canBrowse() {
+                return true;
+            }
+
         });
 
         PlcReader reader = readRequest -> {
diff --git a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
index 2f99ff138..bd0a28d2e 100644
--- a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
+++ b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
@@ -618,8 +618,9 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
         M_GORDIC = 591,
         M_DELTA_ELECTRONICS = 592,
         M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_ = 593,
-        M_ABB___RESERVED = 594,
-        M_BUSCH_JAEGER_ELEKTRO___RESERVED = 595,
+        M_KG_POWER = 594,
+        M_ABB___RESERVED = 595,
+        M_BUSCH_JAEGER_ELEKTRO___RESERVED = 596,
     }
 
     public static class KnxManufacturerInfo
@@ -2279,10 +2280,13 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
                 case KnxManufacturer.M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_: { /* '593' */
                     return 651;
                 }
-                case KnxManufacturer.M_ABB___RESERVED: { /* '594' */
+                case KnxManufacturer.M_KG_POWER: { /* '594' */
+                    return 652;
+                }
+                case KnxManufacturer.M_ABB___RESERVED: { /* '595' */
                     return 43954;
                 }
-                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '595' */
+                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '596' */
                     return 43959;
                 }
                 case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO: { /* '6' */
@@ -4077,10 +4081,13 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
                 case KnxManufacturer.M_SHANGHAI_LEWIN_INTELLIGENT_TECHNOLOGY_CO__LTD_: { /* '593' */
                     return "Shanghai Lewin Intelligent Technology Co.,Ltd.";
                 }
-                case KnxManufacturer.M_ABB___RESERVED: { /* '594' */
+                case KnxManufacturer.M_KG_POWER: { /* '594' */
+                    return "KG-POWER";
+                }
+                case KnxManufacturer.M_ABB___RESERVED: { /* '595' */
                     return "ABB - reserved";
                 }
-                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '595' */
+                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '596' */
                     return "Busch-Jaeger Elektro - reserved";
                 }
                 case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO: { /* '6' */
diff --git a/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryConnection.java b/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryConnection.java
index bf0722515..f886606cf 100644
--- a/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryConnection.java
+++ b/sandbox/discovery/src/main/java/org/apache/plc4x/java/discovery/DiscoveryConnection.java
@@ -29,9 +29,7 @@ import org.apache.plc4x.java.spi.discovery.ActiveDiscovery;
 import org.apache.plc4x.java.spi.discovery.BroadcastDiscovery;
 import org.apache.plc4x.java.spi.discovery.SupportsDiscovery;
 import org.apache.plc4x.java.spi.discovery.PassiveDiscovery;
-import org.apache.plc4x.java.spi.messages.DefaultPlcSubscriptionRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcUnsubscriptionRequest;
-import org.apache.plc4x.java.spi.messages.PlcSubscriber;
+import org.apache.plc4x.java.spi.messages.*;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -40,7 +38,7 @@ import java.util.ServiceLoader;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.Consumer;
 
-public class DiscoveryConnection implements PlcConnection, PlcSubscriber {
+public class DiscoveryConnection implements PlcConnection, PlcSubscriber, PlcBrowser {
 
     private boolean connected = false;
     private Map<String, ActiveDiscovery> activeDiscovery;
@@ -110,6 +108,11 @@ public class DiscoveryConnection implements PlcConnection, PlcSubscriber {
             public boolean canSubscribe() {
                 return true;
             }
+
+            @Override
+            public boolean canBrowse() {
+                return true;
+            }
         };
     }
 
@@ -140,6 +143,11 @@ public class DiscoveryConnection implements PlcConnection, PlcSubscriber {
         return new DefaultPlcUnsubscriptionRequest.Builder(this);
     }
 
+    @Override
+    public PlcBrowseRequest.Builder browseRequestBuilder() {
+        return new DefaultPlcBrowseRequest.Builder(this);
+    }
+
     @Override
     public CompletableFuture<PlcSubscriptionResponse> subscribe(PlcSubscriptionRequest subscriptionRequest) {
         // TODO: Implement ...
@@ -163,4 +171,10 @@ public class DiscoveryConnection implements PlcConnection, PlcSubscriber {
         // TODO: Implement ...
     }
 
+    @Override
+    public CompletableFuture<PlcBrowseResponse> browse(PlcBrowseRequest browseRequest) {
+        // TODO: Implement ...
+        return null;
+    }
+
 }


[plc4x] 04/07: chore(ads): Finished implementing a first version of the symbol-table and the datatype-table extraction

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 95f18f557463ac75b4894934ec9f6556e5607ace
Author: christoferdutz <ch...@c-ware.de>
AuthorDate: Thu Aug 4 23:00:09 2022 +0200

    chore(ads): Finished implementing a first version of the symbol-table and the datatype-table extraction
---
 .../plc4x/java/ads/protocol/AdsProtocolLogic.java  | 80 ++++++++++++----------
 .../ads/src/main/resources/protocols/ads/ads.mspec | 57 +++++++++------
 2 files changed, 79 insertions(+), 58 deletions(-)

diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index 0d4128e85..9641148d2 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -98,6 +98,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
     public void onConnect(ConversationContext<AmsTCPPacket> context) {
         LOGGER.debug("Fetching sizes of symbol and datatype table sizes.");
         final CompletableFuture<Void> future = new CompletableFuture<>();
+
         List<AdsDataTypeTableEntry> dataTypes = new ArrayList<>();
         List<AdsSymbolTableEntry> symbols = new ArrayList<>();
         // Initialize the request.
@@ -115,66 +116,69 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
             .check(responseAmsPacket -> responseAmsPacket.getUserdata().getInvokeId() == amsPacket.getInvokeId())
             .unwrap(response -> (AdsReadResponse) response.getUserdata().getData())
             .handle(responseAdsData -> {
+                transaction.endRequest();
                 if (responseAdsData.getResult() == ReturnCode.OK) {
                     ReadBuffer readBuffer = new ReadBufferByteBased(responseAdsData.getData());
                     try {
                         AdsTableSizes adsTableSizes = AdsTableSizes.staticParse(readBuffer);
                         LOGGER.info("PLC contains {} symbols and {} datatypes", adsTableSizes.getSymbolCount(), adsTableSizes.getDataTypeCount());
 
-                        AdsData adsReadSymbolTableData = new AdsReadRequest(AdsSignificantGroupAddresses.SYMBOL_TABLE.getValue(), 0x00000000, adsTableSizes.getSymbolLength());
-                        AmsPacket amsReadSymbolTablePacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
-                            configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
-                            CommandId.ADS_READ, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsReadSymbolTableData);
-                        AmsTCPPacket amsReadSymbolTableTCPPacket = new AmsTCPPacket(amsReadSymbolTablePacket);
-                        transaction.submit(() -> context.sendRequest(amsReadSymbolTableTCPPacket)
-                            .expectResponse(AmsTCPPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
-                            .onTimeout(future::completeExceptionally)
-                            .onError((p, e) -> future.completeExceptionally(e))
-                            .check(responseAmsPacket -> responseAmsPacket.getUserdata().getInvokeId() == amsReadSymbolTablePacket.getInvokeId())
-                            .unwrap(response -> (AdsReadResponse) response.getUserdata().getData())
-                            .handle(responseAdsReadSymbolTableData -> {
-                                if (responseAdsData.getResult() == ReturnCode.OK) {
-                                    ReadBuffer rb2 = new ReadBufferByteBased(responseAdsReadSymbolTableData.getData());
-                                    for (int i = 0; i < adsTableSizes.getSymbolCount(); i++) {
-                                        try {
-                                            AdsSymbolTableEntry adsSymbolTableEntry = AdsSymbolTableEntry.staticParse(rb2);
-                                            System.out.println(adsSymbolTableEntry);
-                                            symbols.add(adsSymbolTableEntry);
-                                        } catch (ParseException e) {
-                                            throw new RuntimeException(e);
-                                        }
-                                    }
-                                    future.complete(null);
-                                }
-                            }));
-
-                        // TODO: Now we load the symbol-table and the datatype definitions.
-                        /*AdsData adsReadTypeTableData = new AdsReadRequest(AdsSignificantGroupAddresses.DATA_TYPE_TABLE.getValue(), 0x00000000, adsTableSizes.getDataTypeLength());
+                        // Now we load the datatype definitions.
+                        AdsData adsReadTypeTableData = new AdsReadRequest(AdsSignificantGroupAddresses.DATA_TYPE_TABLE.getValue(), 0x00000000, adsTableSizes.getDataTypeLength());
                         AmsPacket amsReadTablePacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
                             configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
                             CommandId.ADS_READ, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsReadTypeTableData);
+                        RequestTransactionManager.RequestTransaction transaction2 = tm.startRequest();
                         AmsTCPPacket amsReadTableTCPPacket = new AmsTCPPacket(amsReadTablePacket);
-                        transaction.submit(() -> context.sendRequest(amsReadTableTCPPacket)
+                        transaction2.submit(() -> context.sendRequest(amsReadTableTCPPacket)
                             .expectResponse(AmsTCPPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
                             .onTimeout(future::completeExceptionally)
                             .onError((p, e) -> future.completeExceptionally(e))
                             .check(responseAmsPacket -> responseAmsPacket.getUserdata().getInvokeId() == amsReadTablePacket.getInvokeId())
                             .unwrap(response -> (AdsReadResponse) response.getUserdata().getData())
                             .handle(responseAdsReadTableData -> {
+                                transaction2.endRequest();
                                 if (responseAdsData.getResult() == ReturnCode.OK) {
                                     // Parse the result.
                                     ReadBuffer rb = new ReadBufferByteBased(responseAdsReadTableData.getData());
-                                    while (rb.hasMore(8)) {
+                                    for (int i = 0; i < adsTableSizes.getDataTypeCount(); i++) {
                                         try {
                                             AdsDataTypeTableEntry adsDataTypeTableEntry = AdsDataTypeTableEntry.staticParse(rb);
-                                            System.out.println(adsDataTypeTableEntry);
                                             dataTypes.add(adsDataTypeTableEntry);
                                         } catch (ParseException e) {
                                             throw new RuntimeException(e);
                                         }
                                     }
+
+                                    AdsData adsReadSymbolTableData = new AdsReadRequest(AdsSignificantGroupAddresses.SYMBOL_TABLE.getValue(), 0x00000000, adsTableSizes.getSymbolLength());
+                                    AmsPacket amsReadSymbolTablePacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
+                                        configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
+                                        CommandId.ADS_READ, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsReadSymbolTableData);
+                                    RequestTransactionManager.RequestTransaction transaction3 = tm.startRequest();
+                                    AmsTCPPacket amsReadSymbolTableTCPPacket = new AmsTCPPacket(amsReadSymbolTablePacket);
+                                    transaction3.submit(() -> context.sendRequest(amsReadSymbolTableTCPPacket)
+                                        .expectResponse(AmsTCPPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
+                                        .onTimeout(future::completeExceptionally)
+                                        .onError((p, e) -> future.completeExceptionally(e))
+                                        .check(responseAmsPacket -> responseAmsPacket.getUserdata().getInvokeId() == amsReadSymbolTablePacket.getInvokeId())
+                                        .unwrap(response -> (AdsReadResponse) response.getUserdata().getData())
+                                        .handle(responseAdsReadSymbolTableData -> {
+                                            transaction3.endRequest();
+                                            if (responseAdsData.getResult() == ReturnCode.OK) {
+                                                ReadBuffer rb2 = new ReadBufferByteBased(responseAdsReadSymbolTableData.getData());
+                                                for (int i = 0; i < adsTableSizes.getSymbolCount(); i++) {
+                                                    try {
+                                                        AdsSymbolTableEntry adsSymbolTableEntry = AdsSymbolTableEntry.staticParse(rb2);
+                                                        symbols.add(adsSymbolTableEntry);
+                                                    } catch (ParseException e) {
+                                                        throw new RuntimeException(e);
+                                                    }
+                                                }
+                                                future.complete(null);
+                                            }
+                                        }));
                                 }
-                            }));*/
+                            }));
                     } catch (ParseException e) {
                         future.completeExceptionally(new PlcException("Error loading the table sizes", e));
                     }
@@ -182,13 +186,17 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
                     // TODO: Implement this correctly.
                     future.completeExceptionally(new PlcException("Result is " + responseAdsData.getResult()));
                 }
-                // Finish the request-transaction.
-                transaction.endRequest();
             }));
         future.whenComplete((unused, throwable) -> {
             if(throwable != null) {
                 LOGGER.error("Error fetching symbol and datatype table sizes");
             } else {
+                for (AdsSymbolTableEntry symbol : symbols) {
+                    System.out.println(symbol.getName());
+                }
+                /*for (AdsDataTypeTableEntry dataType : dataTypes) {
+                    System.out.println(dataType);
+                }*/
                 context.fireConnected();
             }
         });
@@ -332,7 +340,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
             ReservedIndexGroups.ADSIGRP_MULTIPLE_READ.getValue(), directAdsFields.size(), expectedResponseDataSize,
             directAdsFields.stream().map(directAdsField -> new AdsMultiRequestItemRead(
                     directAdsField.getIndexGroup(), directAdsField.getIndexOffset(),
-                    (directAdsField.getAdsDataType().getNumBytes() * directAdsField.getNumberOfElements())))
+                    ((long) directAdsField.getAdsDataType().getNumBytes() * directAdsField.getNumberOfElements())))
                 .collect(Collectors.toList()), null);
 
         AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index a5d6bde5f..1b79e178b 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -795,29 +795,42 @@
 	// Will have to continue searching for more details on how to decode this.
 	// I would assume that we'll have some "optional" fields here which depend
 	// on values in the flags section.
-	[array    byte                         rest               count 'entryLength - curPos']
+	[array    byte                         rest               length 'entryLength - curPos']
 ]
 
 // https://gitlab.com/xilix-systems-llc/go-native-ads/-/blob/master/symbols.go#L15
-[type AdsDataTypeTableEntry byteOrder='LITTLE_ENDIAN'
-	[simple   uint 32                            entryLength                           ]
-	[simple   uint 32                            version                               ]
-	[simple   uint 32                            hashValue                             ]
-	[simple   uint 32                            typeHashValue                         ]
-	[simple   uint 32                            size                                  ]
-	[simple   uint 32                            offs                                  ]
-	[simple   uint 32                            dataType                              ]
-	[simple   uint 32                            flags                                 ]
-	[implicit uint 16                            nameLength         'STR_LEN(name)'    ]
-	[implicit uint 16                            typeNameLength     'STR_LEN(typeName)']
-	[implicit uint 16                            commentLength      'STR_LEN(comment)' ]
-	[simple   uint 16                            arrayDim                              ]
-	[simple   uint 16                            subItems                              ]
-	[simple   vstring '(nameLength - 1) * 8'     name                                  ]
-	[const    uint 8                             nameTerminator     0x00               ]
-	[simple   vstring '(typeNameLength - 1) * 8' typeName                              ]
-	[const    uint 8                             typeNameTerminator 0x00               ]
-	[simple   vstring '(commentLength - 1) * 8'  comment                               ]
-	[const    uint 8                             commentTerminator  0x00               ]
-	//[array    AdsDataTypeTableEntry              children           length               '']
+[discriminatedType AdsDataTypeTableEntry byteOrder='LITTLE_ENDIAN'
+	[simple   uint 32                      entryLength                                                  ]
+	[simple   uint 32                      version                                                      ]
+	[simple   uint 32                      hashValue                                                    ]
+	[simple   uint 32                      typeHashValue                                                ]
+	[simple   uint 32                      size                                                         ]
+	[simple   uint 32                      offs                                                         ]
+	[simple   uint 32                      dataType                                                     ]
+	[simple   uint 32                      flags                                                        ]
+	[implicit uint 16                      nameLength         'STR_LEN(name)'                           ]
+	[implicit uint 16                      typeNameLength     'STR_LEN(typeName)'                       ]
+	[implicit uint 16                      commentLength      'STR_LEN(comment)'                        ]
+	[simple   uint 16                      arrayDimensions                                              ]
+	[simple   uint 16                      numChildren                                                  ]
+	[simple   vstring 'nameLength * 8'     name                                                         ]
+	[const    uint 8                       nameTerminator     0x00                                      ]
+	[simple   vstring 'typeNameLength * 8' typeName                                                     ]
+	[const    uint 8                       typeNameTerminator 0x00                                      ]
+	[simple   vstring 'commentLength * 8'  comment                                                      ]
+	[const    uint 8                       commentTerminator  0x00                                      ]
+    [array    AdsDataTypeArrayInfo         arrayInfo          count               'arrayDimensions'     ]
+   	[array    AdsDataTypeTableEntry        children           count               'numChildren'         ]
+	// Gobbling up the rest, but it seems there is content in here, when looking
+	// at the data in wireshark, it seems to be related to the flags field.
+	// Will have to continue searching for more details on how to decode this.
+	// I would assume that we'll have some "optional" fields here which depend
+	// on values in the flags section.
+	[array    byte                         rest               length              'entryLength - curPos']
+]
+
+[type AdsDataTypeArrayInfo byteOrder='LITTLE_ENDIAN'
+    [simple  uint 32 lowerBound                            ]
+    [simple  uint 32 numElements                           ]
+    [virtual uint 32 upperBound  'lowerBound + numElements']
 ]


[plc4x] 06/07: chore(ads): Added back the previously deleted tests

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 90f9f20bea62ea3a7da16f94e22844c440ce6618
Author: christoferdutz <ch...@c-ware.de>
AuthorDate: Wed Aug 10 08:51:22 2022 +0200

    chore(ads): Added back the previously deleted tests
---
 .../apache/plc4x/java/cbus/RandomPackagesTest.java |  403 ++++
 .../org/apache/plc4x/java/cbus/ReferenceTest.java  | 2052 ++++++++++++++++++++
 2 files changed, 2455 insertions(+)

diff --git a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/RandomPackagesTest.java b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/RandomPackagesTest.java
new file mode 100644
index 000000000..ab42558ad
--- /dev/null
+++ b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/RandomPackagesTest.java
@@ -0,0 +1,403 @@
+/*
+ * 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.cbus;
+
+import org.apache.plc4x.java.cbus.readwrite.*;
+import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import java.nio.charset.StandardCharsets;
+
+import static org.apache.plc4x.java.cbus.Util.assertMessageMatches;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class RandomPackagesTest {
+
+    public static final CBusOptions C_BUS_OPTIONS_WITH_SRCHK = new CBusOptions(false, false, false, false, false, false, false, false, true);
+    RequestContext requestContext;
+    CBusOptions cBusOptions;
+
+    @BeforeEach
+    void setUp() {
+        requestContext = new RequestContext(false);
+        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
+    }
+
+    @Disabled
+    @Test
+    void whatEverThisIs() throws Exception {
+        byte[] bytes = "\\3436303230303231303167\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void deviceManagementInstruction() throws Exception {
+        byte[] bytes = "@1A2001\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void setLight() throws Exception {
+        byte[] bytes = "\\0538000100g\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void identifyResponse() throws Exception {
+        byte[] bytes = "g.890150435F434E49454421\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        // We know we send an identify command so we set the cal flag
+        requestContext = new RequestContext(false);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void someResponse() throws Exception {
+        byte[] bytes = "nl.8220025C\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        requestContext = new RequestContext(false);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void someOtherResponse() throws Exception {
+        byte[] bytes = "\\0538000100g\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+
+    @Test
+    void identifyRequest2() throws Exception {
+        byte[] bytes = "21021A2102i\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void identifyResponse2() throws Exception {
+        byte[] bytes = "i.8902352E342E3030202010\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        // We know we send an identify command so we set the cal flag
+        requestContext = new RequestContext(false);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void recall() throws Exception {
+        byte[] bytes = "@1A2001\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void identifyTypeReply() throws Exception {
+        byte[] bytes = "h.890150435F434E49454421\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        requestContext = new RequestContext(false);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void write30to9755() throws Exception {
+        byte[] bytes = "A3309755s\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void strangeNotYetParsableCommandResponse() throws Exception {
+        byte[] bytes = "s.860202003230977D\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        requestContext = new RequestContext(false);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void statusRequestBinaryState() throws Exception {
+        byte[] bytes = "\\05FF00FAFF00v\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Disabled
+    @Test
+    void wat() throws Exception {
+        byte[] bytes = "D8FF0024000002000000000000000008000000000000000000\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        requestContext = new RequestContext(false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void WriteCommand() throws Exception {
+        byte[] bytes = "\\46310900A400410600r\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void statusReply() throws Exception {
+        byte[] bytes = "D8FF5800000000000000000000000000000000000000000000D1\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        requestContext = new RequestContext(false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void identifyUnitSummary() throws Exception {
+        byte[] bytes = "2110\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void identifyUnitSummaryResponse() throws Exception {
+        byte[] bytes = "o.8510020000FF6A\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        requestContext = new RequestContext(true);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void hvacAndCoolingSAL() throws Exception {
+        byte[] bytes = "0531AC0079042F0401430316000011\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        requestContext = new RequestContext(false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Disabled("apparently something is broken, the second cal data can't be parsed")
+    @Test
+    void calIdentifyReplyAndAnotherCal() throws Exception {
+        byte[] bytes = "h.860102008902312E362E30302020832138FFAE\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        requestContext = new RequestContext(false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void routedAcknowledge() throws Exception {
+        byte[] bytes = "r.8631020100320041D3\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        requestContext = new RequestContext(false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void gavValuesCurrentReply() throws Exception {
+        byte[] bytes = "w.860C02008A08000000C8000000000012\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        requestContext = new RequestContext(false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void SetHvacLevel() throws Exception {
+        byte[] bytes = "0531AC0036040108FF0000DC\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        requestContext = new RequestContext(false);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void salHvac() throws Exception {
+        byte[] bytes = "0531AC0036040142037F001F\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        requestContext = new RequestContext(false);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Disabled("Not clear yet what this is")
+    @Test
+    void closestFitIsAStatusRequestButWeDonTHaveAnyBytesBeforeThat() throws Exception {
+        byte[] bytes = "FAFF00r\r".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void ownSal() throws Exception {
+        byte[] bytes = "003809AF10\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void powerUpNotification() throws Exception {
+        byte[] bytes = "++\r\n".getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void incmoingMMI() throws Exception {
+        byte[] bytes = ("86040200F940380001000000000000000008000000000000000000000000FA\r\n").getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+    @Test
+    void justAnError() throws Exception {
+        byte[] bytes = ("!").getBytes(StandardCharsets.UTF_8);
+        ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+        cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+        CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+        assertThat(msg).isNotNull();
+        System.out.println(msg);
+
+        assertMessageMatches(bytes, msg);
+    }
+
+}
diff --git a/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java
new file mode 100644
index 000000000..3e626678b
--- /dev/null
+++ b/plc4j/drivers/c-bus/src/test/java/org/apache/plc4x/java/cbus/ReferenceTest.java
@@ -0,0 +1,2052 @@
+/*
+ * 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.cbus;
+
+import org.apache.commons.codec.binary.Hex;
+import org.apache.plc4x.java.cbus.readwrite.*;
+import org.apache.plc4x.java.spi.generation.ReadBufferByteBased;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import java.nio.charset.StandardCharsets;
+
+import static org.apache.plc4x.java.cbus.Util.assertMessageMatches;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ReferenceTest {
+
+    public static final CBusOptions C_BUS_OPTIONS_WITH_SRCHK = new CBusOptions(false, false, false, false, false, false, false, false, true);
+
+    RequestContext requestContext;
+    CBusOptions cBusOptions;
+
+    @BeforeEach
+    void setUp() {
+        requestContext = new RequestContext(false);
+        cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, false);
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/C-Bus%20Interface%20Requirements.pdf
+    @Nested
+    class InterfaceRequirementsTest {
+
+        // 8.2
+        @Nested
+        class Level1InterfaceImplementationRequirements {
+
+            // 8.2.4
+            @Nested
+            class SerialInterfaceInitialisation {
+
+                @Test
+                void Step_1_Reset() throws Exception {
+                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_2_SetInterfaceOptions3() throws Exception {
+                    byte[] bytes = "@A3420002\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_3_SetInterfaceOptions1_PUN() throws Exception {
+                    byte[] bytes = "@A3410058\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_4_SetInterfaceOptions1() throws Exception {
+                    byte[] bytes = "@A3300058\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+
+            // 8.2.5
+            @Nested
+            class ConfirmationOfTransmission {
+                @Test
+                void SomeCommand() throws Exception {
+                    byte[] bytes = "\\0538000121A1g\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void success() throws Exception {
+                    byte[] bytes = "g.".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void checksumFailure() throws Exception {
+                    byte[] bytes = "g!".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void tooManyRetransmissions() throws Exception {
+                    byte[] bytes = "g#".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void corruptionInTransmission() throws Exception {
+                    byte[] bytes = "g$".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void noSystemClock() throws Exception {
+                    byte[] bytes = "g%".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+        }
+
+        // 8.3
+        @Nested
+        class Level2InterfaceImplementationRequirements {
+
+            // 8.3.4
+            @Nested
+            class SerialInterfaceInitialisation {
+                @Test
+                void Step_1_Reset() throws Exception {
+                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_2_AnyApplicationFilter() throws Exception {
+                    byte[] bytes = "@A3210038\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_3_SetInterfaceOptions3() throws Exception {
+                    byte[] bytes = "@A3420002\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_4_SetInterfaceOptions1_PUN() throws Exception {
+                    byte[] bytes = "@A3410059\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_5_SetInterfaceOptions1() throws Exception {
+                    byte[] bytes = "@A3300059\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+
+            // 8.3.5
+            @Nested
+            class ProgrammingTheSerialInterfaceToFilterSALMessageTraffic {
+
+                @Test
+                void Step_1_SelectOnlyLighting() throws Exception {
+                    byte[] bytes = "@A3210038\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_2_SelectHeatingAsSecondApplication() throws Exception {
+                    byte[] bytes = "@A3220088\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+        }
+
+        // 8.4
+        @Nested
+        class Level3InterfaceImplementationRequirements {
+            // No specific tests
+        }
+
+        // 8.5
+        @Nested
+        class Level4InterfaceImplementationRequirements {
+
+            // 8.5.4
+            @Nested
+            class SerialInterfaceInitialisation {
+                @Test
+                void Step_1_Reset() throws Exception {
+                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_2_AnyApplicationFilter() throws Exception {
+                    byte[] bytes = "@A3210038\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_3_SetInterfaceOptions3() throws Exception {
+                    byte[] bytes = "@A342000A\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_4_SetInterfaceOptions1_PUN() throws Exception {
+                    byte[] bytes = "@A3410079\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Step_5_SetInterfaceOptions1() throws Exception {
+                    byte[] bytes = "@A3300079\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+        }
+
+        // 8.6
+        @Nested
+        class Level5InterfaceImplementationRequirements {
+            // No specific tests
+        }
+
+        // 8.7
+        @Nested
+        class Level6InterfaceImplementationRequirements {
+            // No specific tests
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Serial%20Interface%20User%20Guide.pdf
+    @Nested
+    class SerialInterfaceGuideTest {
+
+        // 3.4
+        @Nested
+        class Header {
+            @Test
+            void Point_point_multipoint_lowest_priority_class() throws Exception {
+                byte[] bytes = new byte[]{0x03};
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusHeader msg = CBusHeader.staticParse(readBufferByteBased);
+                assertThat(msg).isNotNull();
+
+                System.out.println(msg);
+            }
+
+            @Test
+            void Point_multipoint_lowest_priority_class() throws Exception {
+                byte[] bytes = new byte[]{0x05};
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusHeader msg = CBusHeader.staticParse(readBufferByteBased);
+                assertThat(msg).isNotNull();
+
+                System.out.println(msg);
+            }
+
+            @Test
+            void Point_point_lowest_priority_class() throws Exception {
+                byte[] bytes = new byte[]{0x06};
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusHeader msg = CBusHeader.staticParse(readBufferByteBased);
+                assertThat(msg).isNotNull();
+
+                System.out.println(msg);
+            }
+
+        }
+
+        // 4
+        @Nested
+        class SerialInterface {
+
+            // 4.2.3
+            @Test
+            void reset() throws Exception {
+                byte[] bytes = "~\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+
+                System.out.println(msg);
+            }
+
+            @Disabled("not implemented yet")
+            // 4.2.4
+            @Test
+            void cancel() throws Exception {
+                byte[] bytes = "AB0123?9876\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+
+                System.out.println(msg);
+            }
+
+            // 4.2.5
+            @Test
+            void smartConnectShortcut() throws Exception {
+                byte[] bytes = "\r|\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+
+                System.out.println(msg);
+            }
+
+            @Disabled("not implemented yet")
+            // 4.2.4
+            @Test
+            void confirmation() throws Exception {
+                // If you follow the spec a confirmation can occur at any place... seems strange
+                byte[] bytes = "AB0123n9876\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+
+                System.out.println(msg);
+            }
+
+            // 4.2.7
+            @Test
+            void directCommandAccess1() throws Exception {
+                byte[] bytes = "@2102\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 4.2.7
+            @Test
+            void directCommandAccess2() throws Exception {
+                // TODO: this should be the same as the @above but that is not yet implemented
+                byte[] bytes = "~2102\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+
+
+        // 4.2.9.1
+        @Nested
+        class PointToPointCommands {
+            @Test
+            void pointToPointCommandDirect() throws Exception {
+                byte[] bytes = "\\0603002102D4\r".getBytes(StandardCharsets.UTF_8);
+                cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void pointToPointCommandBridged() throws Exception {
+                byte[] bytes = "\\06420903210289\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+
+        // 4.2.9.2
+        @Nested
+        class PointToMultiPointCommands {
+            @Test
+            void pointToMultiPointCommandDirect() throws Exception {
+                byte[] bytes = "\\0538000108BA\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void pointToMultiPointCommandBridged() throws Exception {
+                byte[] bytes = "\\05FF007A38004A\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 4.2.9.3
+        @Nested
+        class PointToPointToMultoPointCommands {
+            @Test
+            void pointToPointToMultiPointCommand2() throws Exception {
+                byte[] bytes = "\\03420938010871\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 4.3.3.1
+        @Nested
+        class _CALReply {
+            @Test
+            void calRequest() throws Exception {
+                byte[] bytes = "\\0605002102\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void calReplyNormal() throws Exception {
+                byte[] bytes = "8902312E322E363620200A\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                requestContext = new RequestContext(false);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void calReplySmart() throws Exception {
+                // TODO: seems like the checksum is wrong here???
+                //byte[] bytes = "860593008902312E322E363620207F\r\n".getBytes(StandardCharsets.UTF_8);
+                byte[] bytes = "860593008902312E322E36362020EC\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                requestContext = new RequestContext(false);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 4.3.3.2
+        @Nested
+        class _MonitoredSAL {
+            @Test
+            void monitoredSal() throws Exception {
+                byte[] bytes = "0503380079083F\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 4.3.3.3
+        @Nested
+        class Confirmation {
+            @Test
+            void successful() throws Exception {
+                byte[] bytes = "g.".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void toManyRetransmissions() throws Exception {
+                byte[] bytes = "g#".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void corruption() throws Exception {
+                byte[] bytes = "g$".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void desync() throws Exception {
+                byte[] bytes = "g%".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void tooLong() throws Exception {
+                byte[] bytes = "g'".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                ReplyOrConfirmation msg = ReplyOrConfirmation.staticParse(readBufferByteBased, cBusOptions, requestContext);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 7.3
+        @Test
+        void StandardFormatStatusReply1() throws Exception {
+            byte[] bytes = "D8380068AA0140550550001000000014000000000000000000CF\r\n".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            requestContext = new RequestContext(true);
+            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        @Test
+        void StandardFormatStatusReply2() throws Exception {
+            byte[] bytes = "D838580000000000000000000000000000000000000000000098\r\n".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            requestContext = new RequestContext(true);
+            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        @Test
+        void StandardFormatStatusReply3() throws Exception {
+            byte[] bytes = "D638B000000000FF00000000000000000000000000000043\r\n".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            requestContext = new RequestContext(true);
+            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        // 7.4
+        @Test
+        void ExtendedFormatStatusReply1() throws Exception {
+            byte[] bytes = "F9073800AAAA000095990000000055550000000000005555555548\r\n".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            requestContext = new RequestContext(true);
+            cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        @Test
+        void ExtendedFormatStatusReply2() throws Exception {
+            byte[] bytes = "F907380B0000000000005555000000000000000000000000000013\r\n".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            requestContext = new RequestContext(true);
+            cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        @Test
+        void ExtendedFormatStatusReply3() throws Exception {
+            byte[] bytes = "F70738160000000000000000000000000000000000000000B4\r\n".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            requestContext = new RequestContext(true);
+            cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        // 9.1
+        @Nested
+        class PointToMultiPointCommandsIntoLocalCBusNetwork {
+            @Test
+            void LightningOff() throws Exception {
+                byte[] bytes = "\\0538000114AE\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void LightningStatus() throws Exception {
+                byte[] bytes = "\\05FF007A38004A\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void LightningStatusReply1() throws Exception {
+                byte[] bytes = "D83800A8AA02000000000000000000000000000000000000009C\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                requestContext = new RequestContext(true);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void LightningStatusReply2() throws Exception {
+                byte[] bytes = "D838580000000000000000000000000000000000000000000098\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void LightningStatusReply3() throws Exception {
+                byte[] bytes = "D638B0000000000000000000000000000000000000000042\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void LightningStatusReply4() throws Exception {
+                // TODO: the command header seems wrong as it is missing a byte
+                //byte[] bytes = "86999900F8003800A8AA0200000000000000000000000000000000000000C4\r\n".getBytes(StandardCharsets.UTF_8);
+                byte[] bytes = "86999900F9003800A8AA0200000000000000000000000000000000000000C3\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+
+            @Test
+            void LightningStatusReply5() throws Exception {
+                // TODO: the command header seems wrong as it is missing a byte
+                // byte[] bytes = "86999900F800385800000000000000000000000000000000000000000000C0\r\n".getBytes(StandardCharsets.UTF_8);
+                byte[] bytes = "86999900F900385800000000000000000000000000000000000000000000BF\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void LightningStatusReply6() throws Exception {
+                // TODO: wrong checksum in this example???
+                // TODO: the command header seems wrong as it is missing a byte
+                //byte[] bytes = "86999900F60038B000000000000000000000000000000000000000008F\r\n".getBytes(StandardCharsets.UTF_8);
+                byte[] bytes = "86999900F70038B0000000000000000000000000000000000000000069\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, true, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 9.2
+        @Nested
+        class PointToPointCommandsIntoLocalCBusNetwork {
+            @Test
+            void RecallCurrentValueOfParameter0x30onUnit0x04() throws Exception {
+                // TODO: the section describes that on non smart mode the message doesn't have the last CR
+                byte[] bytes = "\\0604001A3001AB\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // TODO: due the usage of reserved we lose bits here so we need to fix that
+            @Disabled("TODO: due the usage of reserved we lose bits here so we need to fix that")
+            @Test
+            void Reply() throws Exception {
+                byte[] bytes = "8604990082300328\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+
+        // 9.3
+        @Nested
+        class PointToMultiPointCommandsIntoaRemoteCBusNetwork {
+            @Test
+            void IssueLightningOf() throws Exception {
+                // TODO: the section describes that on non smart mode the message doesn't have the last CR
+                byte[] bytes = "\\03421B53643801149C\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Disabled("the transformation from point to point to multipoint message is not yet implemented as described in 8.4... not sure if we will ever implement that")
+            @Test
+            void Reply() throws Exception {
+                byte[] bytes = Hex.decodeHex("0565380354432101148E");
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusCommand msg = CBusCommand.staticParse(readBufferByteBased, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+
+        // 9.4
+        @Test
+        void SwitchMode() throws Exception {
+            byte[] bytes = "~@A3300019\r".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+            assertMessageMatches(bytes, msg);
+        }
+
+        // 9.5
+        @Test
+        void MultipleCommands() throws Exception {
+            byte[] bytes = "\\05380001210122012301240A25010A2601D4\r".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        // 10.2.1
+        @Test
+        void testParameterSet() throws Exception {
+            byte[] bytes = "@A3470011\r".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        // 10.2.1
+        @Test
+        void testParameterSetObsolete() throws Exception {
+            byte[] bytes = "A3470011\r".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/C-Bus%20Quick%20Start%20Guide.pdf
+    @Nested
+    class CBusQuickStartGuideTest {
+
+        // 4.3
+        @Test
+        void checksums() throws Exception {
+            byte[] bytes = "\\0538007988C2g\r".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        //5.2
+        @Nested
+        class PCI_Setup {
+
+            // 5.2.1
+            @Nested
+            class MMIMessagesNotRequired {
+
+                @Test
+                void init() throws Exception {
+                    byte[] bytes = "~~~\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void writeSomething() throws Exception {
+                    byte[] bytes = "A3210038g\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void writeSomethingResponse() throws Exception {
+                    byte[] bytes = "g.322100AD\r\n".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+                    requestContext = new RequestContext(false);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void writeSomething2() throws Exception {
+                    byte[] bytes = "A3420002g\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void writeSomethingResponse2() throws Exception {
+                    byte[] bytes = "g.3242008C\r\n".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    requestContext = new RequestContext(false);
+                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void writeSomething3() throws Exception {
+                    byte[] bytes = "A3300059g\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void writeSomethingResponse3() throws Exception {
+                    byte[] bytes = "g.8600000032300018\r\n".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = C_BUS_OPTIONS_WITH_SRCHK;
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+
+            // 5.2.2
+            @Test
+            void MMIMessagesRequired() throws Exception {
+                byte[] bytes = "A3300079g\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 6
+        @Nested
+        class TransmittingCBusLightingControlCommands {
+            // 6.1
+            @Test
+            void TransmitAnONCommand() throws Exception {
+                byte[] bytes = "\\053800790842u\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 6.2
+            @Test
+            void TransmitAnOFFCommand() throws Exception {
+                byte[] bytes = "\\0538000108BAu\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 6.3
+            @Test
+            void TransmitAnRampToLevelCommand() throws Exception {
+                byte[] bytes = "\\0538005A08550Cu\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 7
+        @Nested
+        class ReceivingCBusLightingControlCommands {
+            // 7.1
+            @Test
+            void ReceiveAnONCommand() throws Exception {
+                byte[] bytes = "05003800790842\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 7.1
+            @Test
+            void ReceiveAnONCommandAlternative() throws Exception {
+                byte[] bytes = "0500380100790841\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 7.2
+            @Test
+            void ReceiveAnOFFCommand() throws Exception {
+                byte[] bytes = "050038000108BA\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 7.2
+            @Test
+            void ReceiveAnOFFCommandAlternative() throws Exception {
+                byte[] bytes = "05003801000108B9\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 7.3
+            @Test
+            void ReceiveAnRampToLevelCommand() throws Exception {
+                byte[] bytes = "050038005A08550C\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 7.3
+            @Test
+            void ReceiveAnRampToLevelCommandAlternative() throws Exception {
+                byte[] bytes = "05003801005A08550B\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Disabled("Needs to be implemented")
+            // 7.4
+            @Nested
+            class ReceivingOtherCommands {
+                @Test
+                void Case1() throws Exception {
+                    // Test with nn not 00 or 01... they should be discarded
+                    byte[] bytes = "05ss38nn....zz\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Case2() throws Exception {
+                    // Test with nn not 00 or 01... they should be discarded
+                    byte[] bytes = "05ss3800cc....zz\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Case2Alternative() throws Exception {
+                    // Test with nn not 00 or 01... they should be discarded
+                    byte[] bytes = "05ss380100cc....zz\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+
+        }
+
+        // 8
+        @Nested
+        class InterpretingTheMmi {
+            @Test
+            void BigMMI1() throws Exception {
+                byte[] bytes = "D8380068AA0140550550001000000014000000000000000000CF\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void BigMMI2() throws Exception {
+                byte[] bytes = "D838580000000000000000000000000000000000000000000098\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void BigMMI3() throws Exception {
+                byte[] bytes = "D638B000000000FF00000000000000000000000000000043\r\n".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+
+        // 9
+        @Nested
+        class Example {
+            @Nested
+            class ControlExamples {
+                @Test
+                void turnOnLight() throws Exception {
+                    byte[] bytes = "\\053800792129g\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void turnOffLight() throws Exception {
+                    byte[] bytes = "\\0538000121A1g\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void rampLight() throws Exception {
+                    byte[] bytes = "\\0538000A217F19g\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+
+            @Nested
+            class MontiorExamples {
+                @Test
+                void onCommand() throws Exception {
+                    byte[] bytes = "050B380079201F\r\n".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void offCommand() throws Exception {
+                    byte[] bytes = "050B3800012097\r\n".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Ramp() throws Exception {
+                    byte[] bytes = "050B38000220484E\r\n".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, true, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2002%20-%20C-Bus%20Lighting%20Application.pdf
+    @Nested
+    class LightningApplicationsTest {
+
+        // 2.9.6.4.4 Command Sequence
+        @Nested
+        class CommandSquence {
+
+            @Test
+            void StartDynamicIcon() throws Exception {
+                byte[] bytes = "\\053800A412080020\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void IconBitmap() throws Exception {
+                byte[] bytes = "\\053800A412080021\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void CompleteDynamicIcon() throws Exception {
+                byte[] bytes = "\\053800A412080022\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Nested
+            class ChineseTable {
+
+                @Test
+                void StartDynamicIcon() throws Exception {
+                    byte[] bytes = "\\053800A401080020\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void IconHeader() throws Exception {
+                    byte[] bytes = "\\053800A80104CA00130C0600\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void AppendDynamicIcon() throws Exception {
+                    byte[] bytes = "\\053800A401080021\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void WriteIconBitmapData1() throws Exception {
+                    byte[] bytes = "\\053800A80104AAF05500FF50\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void WriteIconBitmapData2() throws Exception {
+                    byte[] bytes = "\\053800A801040000F0F00F00\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void useDynamicIcon() throws Exception {
+                    byte[] bytes = "\\053800A401080022\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void displayIcon() throws Exception {
+                    byte[] bytes = "\\053800A60102CA010013\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+            }
+        }
+
+        // 2.11 Examples
+        @Nested
+        class Examples {
+            @Test
+            void switchElectricalLoads() throws Exception {
+                byte[] bytes = "\\0538007993B7\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void switchElectricalLoadsBridged() throws Exception {
+                byte[] bytes = "\\0356093879935A\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2005%20-%20C-Bus%20Security%20Application.pdf
+    @Nested
+    class SecurityApplicationsTest {
+
+        //5.11.1
+        @Nested
+        class SecuritySystemEmitsAlarmOn {
+            @Test
+            void AlarmOnWrongPrio() throws Exception {
+                byte[] bytes = "\\05D00079832F\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void AlarmOn() throws Exception {
+                byte[] bytes = "\\85D0007983AF\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+
+        //5.11.2
+        @Test
+        void Zone3Unsealed() throws Exception {
+            byte[] bytes = "\\05D0000A860398\r".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        //5.11.3
+        @Test
+        void ZoneName() throws Exception {
+            byte[] bytes = "\\05D000AD8D034B49544348452E2020202088\r".getBytes(StandardCharsets.UTF_8);
+            ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+            cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+            CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+            assertThat(msg).isNotNull();
+            System.out.println(msg);
+
+            assertMessageMatches(bytes, msg);
+        }
+
+        // 5.11.4
+        @Nested
+        class DeviceRequestsSecuritySystemtoArm {
+
+            @Test
+            void ArmSecurity() throws Exception {
+                byte[] bytes = "\\05D0000AA2FF80\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void ArmSecurityRemote() throws Exception {
+                byte[] bytes = "\\039209D00AA2FFE7\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+    }
+
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2006%20-%20C-Bus%20Metering%20Application.pdf
+    @Nested
+    class MeteringApplicationsTest {
+
+        //6.11.1
+        @Nested
+        class DeviceRequestsMeteringApplicationtoMeasureElectricity {
+            @Test
+            void LocalMeasurement() throws Exception {
+                byte[] bytes = "\\05D100090120\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void RemoteMeasurement() throws Exception {
+                byte[] bytes = "\\035609D10901C3\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+
+        //6.11.2
+        @Nested
+        class MeterMeasurementDevicesendsElectricityUse {
+            @Test
+            void LocalMeasurement() throws Exception {
+                byte[] bytes = "\\05D1000D810000DBF8C9\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void RemoteMeasurement() throws Exception {
+                byte[] bytes = "\\033709D10D810000DBF88B\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2007%20-%20C-Bus%20Trigger%20Control%20Application.pdf
+    @Nested
+    class TriggerControlApplicationsTest {
+
+        //7.12
+        @Nested
+        class Examples {
+            @Test
+            void LocalTrigger() throws Exception {
+                byte[] bytes = "\\05CA0002250109\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void RemoteTrigger() throws Exception {
+                byte[] bytes = "\\035609CA022501AC\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2008%20-%20C-Bus%20Enable%20Control%20Application.pdf
+    @Nested
+    class EnableControlApplicationsTest {
+
+        //8.11
+        @Nested
+        class Examples {
+            @Test
+            void LocalTrigger() throws Exception {
+                byte[] bytes = "\\05CB0002378275\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void RemoteTrigger() throws Exception {
+                // TODO: seems like the checksum is wrong here again...
+                //byte[] bytes = "\\035609CB02378216\r".getBytes(StandardCharsets.UTF_8);
+                byte[] bytes = "\\035609CB02378218\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2009%20-%20C-Bus%20Temperature%20Broadcast%20Application.pdf
+    @Nested
+    class TemperatureBroadcastApplicationsTest {
+
+        //9.11
+        @Nested
+        class Examples {
+
+            @Test
+            void temperatureBroadcast() throws Exception {
+                byte[] bytes = "\\051900020564\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2010%20-%20C-Bus%20Ventilation%20Application.pdf
+    @Nested
+    class VentilationApplicationTest {
+        // TODO: no tests described here but it should work by adjusting the values from Lightning...
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2009%20-%20C-Bus%20Temperature%20Control%20Application.pdf
+    @Nested
+    class AccessControlApplicationsTest {
+
+        //9.11
+        @Nested
+        class Examples {
+
+            @Test
+            void validAccessRequest() throws Exception {
+                byte[] bytes = "\\05D500A4010300017D\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void closeAccessPoint() throws Exception {
+                byte[] bytes = "\\05D5000201FF24\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void lockAccessPoint() throws Exception {
+                byte[] bytes = "\\05D5000AFFFF1E\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void lockAccessPointRemote() throws Exception {
+                byte[] bytes = "\\039209D50AFFFF85\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2021%20-%20C-Bus%20Media%20Transport%20Control%20Application.pdf
+    @Nested
+    class MediaTransportControlApplicationsTest {
+        // TODO: no tests described here
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2023%20-%20C-Bus%20Clock%20and%20Timekeeping%20Application.pdf
+    @Nested
+    class ClockAndTimekeeping {
+
+        //23.13
+        @Nested
+        class Examples {
+
+            @Test
+            void outputATimeCommand() throws Exception {
+                byte[] bytes = "\\05DF000D010A2B1700C2\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void outputADateCommand() throws Exception {
+                byte[] bytes = "\\05DF000E0207D502190411\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Disabled("This example just seems plain wrong... First of all there is no command for 0x10 defined and the argument which should be it 0x11 requires a argument of 0x03... So either documenation wrong or the example")
+            @Test
+            void outputARequestRefreshCommand() throws Exception {
+                byte[] bytes = "\\05DF00100C\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void outputARequestRefreshCommandFixedQuestionMark() throws Exception {
+                byte[] bytes = "\\05DF001103\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2024%20-%20C-Bus%20Telephony%20Application.pdf
+    @Nested
+    class Telephony {
+
+        //24.11
+        @Nested
+        class Examples {
+
+            @Test
+            void LineOnHook() throws Exception {
+                byte[] bytes = "\\05E000090111\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Disabled("Again it seems as this command is just wrong... there is no command definition for 2C")
+            @Test
+            void LineOffHook() throws Exception {
+                byte[] bytes = "\\05E0002C020230333935323734333231FD\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            @Test
+            void LineOffHookFixedQuestionMark() throws Exception {
+                byte[] bytes = "\\05E000AC02013033393532373433323168\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                cBusOptions = new CBusOptions(false, false, false, false, false, false, false, false, true);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+        }
+    }
+
+    // from: https://updates.clipsal.com/ClipsalSoftwareDownload/DL/downloads/OpenCBus/Chapter%2034%20-%20C-Bus%20Error%20Reporting%20Application.pdf
+    @Nested
+    class ErrorReporting {
+
+        //34.13
+        @Nested
+        class Examples {
+
+            // 34.13.1
+            @Test
+            void AllOk() throws Exception {
+                byte[] bytes = "\\05CE0015FF20DE0000\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+            // 34.13.2
+            @Test
+            void MinorFailure() throws Exception {
+                byte[] bytes = "\\05CE0015882A6721B4\r".getBytes(StandardCharsets.UTF_8);
+                ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                assertThat(msg).isNotNull();
+                System.out.println(msg);
+
+                assertMessageMatches(bytes, msg);
+            }
+
+
+            // 34.13.3
+            @Nested
+            class GeneralFailureWhichGetsAcknowledged {
+                @Test
+                void Reporting() throws Exception {
+                    byte[] bytes = "\\05CE00159023426633\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void Acknowledge() throws Exception {
+                    byte[] bytes = "\\05CE00259033426633\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+
+            @Nested
+            class LatchedExtremeFailureWhichGetsCleared {
+                @Test
+                void mostRecent() throws Exception {
+                    byte[] bytes = "\\05CE001569E1FE0100\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void mostSevere() throws Exception {
+                    byte[] bytes = "\\05CE001569CCFE0102\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void clearMostSevere() throws Exception {
+                    byte[] bytes = "\\05CE003569C9FE0102\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+
+                @Test
+                void newError() throws Exception {
+                    byte[] bytes = "\\05CE001569E9FE0100\r".getBytes(StandardCharsets.UTF_8);
+                    ReadBufferByteBased readBufferByteBased = new ReadBufferByteBased(bytes);
+                    CBusMessage msg = CBusMessage.staticParse(readBufferByteBased, false, requestContext, cBusOptions);
+                    assertThat(msg).isNotNull();
+                    System.out.println(msg);
+
+                    assertMessageMatches(bytes, msg);
+                }
+            }
+        }
+    }
+}


[plc4x] 03/07: chore(ads): Worked on the browse functionality

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 4e640f3f0e0e05c9f079451163be96ebb622adff
Author: christoferdutz <ch...@c-ware.de>
AuthorDate: Wed Aug 3 08:46:28 2022 +0200

    chore(ads): Worked on the browse functionality
---
 .../plc4x/java/ads/protocol/AdsProtocolLogic.java  | 98 +++++++++++++++++++++-
 .../ads/AdsDiscoverySerializerParserTest.java      |  2 +-
 .../org/apache/plc4x/protocol/ads/AdsDriverIT.java |  4 +-
 .../protocol/ads/ProbeAdsDiscoveryCommands.java    |  8 +-
 .../resources/protocols/ads/ads-discovery.mspec    | 20 ++---
 .../ads/src/main/resources/protocols/ads/ads.mspec | 86 +++++++++++++++++++
 .../resources/protocols/ads/DriverTestsuite.xml    | 76 ++++++-----------
 7 files changed, 222 insertions(+), 72 deletions(-)

diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index 77d9b18af..0d4128e85 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -96,8 +96,102 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
 
     @Override
     public void onConnect(ConversationContext<AmsTCPPacket> context) {
-        // AMS/ADS doesn't know a concept of a "connect".
-        context.fireConnected();
+        LOGGER.debug("Fetching sizes of symbol and datatype table sizes.");
+        final CompletableFuture<Void> future = new CompletableFuture<>();
+        List<AdsDataTypeTableEntry> dataTypes = new ArrayList<>();
+        List<AdsSymbolTableEntry> symbols = new ArrayList<>();
+        // Initialize the request.
+        AdsData adsData = new AdsReadRequest(AdsSignificantGroupAddresses.TABLE_SIZES.getValue(), 0x00000000, 24);
+        AmsPacket amsPacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
+            configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
+            CommandId.ADS_READ, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsData);
+        AmsTCPPacket amsTCPPacket = new AmsTCPPacket(amsPacket);
+        // Start a new request-transaction (Is ended in the response-handler)
+        RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
+        transaction.submit(() -> context.sendRequest(amsTCPPacket)
+            .expectResponse(AmsTCPPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
+            .onTimeout(future::completeExceptionally)
+            .onError((p, e) -> future.completeExceptionally(e))
+            .check(responseAmsPacket -> responseAmsPacket.getUserdata().getInvokeId() == amsPacket.getInvokeId())
+            .unwrap(response -> (AdsReadResponse) response.getUserdata().getData())
+            .handle(responseAdsData -> {
+                if (responseAdsData.getResult() == ReturnCode.OK) {
+                    ReadBuffer readBuffer = new ReadBufferByteBased(responseAdsData.getData());
+                    try {
+                        AdsTableSizes adsTableSizes = AdsTableSizes.staticParse(readBuffer);
+                        LOGGER.info("PLC contains {} symbols and {} datatypes", adsTableSizes.getSymbolCount(), adsTableSizes.getDataTypeCount());
+
+                        AdsData adsReadSymbolTableData = new AdsReadRequest(AdsSignificantGroupAddresses.SYMBOL_TABLE.getValue(), 0x00000000, adsTableSizes.getSymbolLength());
+                        AmsPacket amsReadSymbolTablePacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
+                            configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
+                            CommandId.ADS_READ, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsReadSymbolTableData);
+                        AmsTCPPacket amsReadSymbolTableTCPPacket = new AmsTCPPacket(amsReadSymbolTablePacket);
+                        transaction.submit(() -> context.sendRequest(amsReadSymbolTableTCPPacket)
+                            .expectResponse(AmsTCPPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
+                            .onTimeout(future::completeExceptionally)
+                            .onError((p, e) -> future.completeExceptionally(e))
+                            .check(responseAmsPacket -> responseAmsPacket.getUserdata().getInvokeId() == amsReadSymbolTablePacket.getInvokeId())
+                            .unwrap(response -> (AdsReadResponse) response.getUserdata().getData())
+                            .handle(responseAdsReadSymbolTableData -> {
+                                if (responseAdsData.getResult() == ReturnCode.OK) {
+                                    ReadBuffer rb2 = new ReadBufferByteBased(responseAdsReadSymbolTableData.getData());
+                                    for (int i = 0; i < adsTableSizes.getSymbolCount(); i++) {
+                                        try {
+                                            AdsSymbolTableEntry adsSymbolTableEntry = AdsSymbolTableEntry.staticParse(rb2);
+                                            System.out.println(adsSymbolTableEntry);
+                                            symbols.add(adsSymbolTableEntry);
+                                        } catch (ParseException e) {
+                                            throw new RuntimeException(e);
+                                        }
+                                    }
+                                    future.complete(null);
+                                }
+                            }));
+
+                        // TODO: Now we load the symbol-table and the datatype definitions.
+                        /*AdsData adsReadTypeTableData = new AdsReadRequest(AdsSignificantGroupAddresses.DATA_TYPE_TABLE.getValue(), 0x00000000, adsTableSizes.getDataTypeLength());
+                        AmsPacket amsReadTablePacket = new AmsPacket(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
+                            configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
+                            CommandId.ADS_READ, DEFAULT_COMMAND_STATE, 0, getInvokeId(), adsReadTypeTableData);
+                        AmsTCPPacket amsReadTableTCPPacket = new AmsTCPPacket(amsReadTablePacket);
+                        transaction.submit(() -> context.sendRequest(amsReadTableTCPPacket)
+                            .expectResponse(AmsTCPPacket.class, Duration.ofMillis(configuration.getTimeoutRequest()))
+                            .onTimeout(future::completeExceptionally)
+                            .onError((p, e) -> future.completeExceptionally(e))
+                            .check(responseAmsPacket -> responseAmsPacket.getUserdata().getInvokeId() == amsReadTablePacket.getInvokeId())
+                            .unwrap(response -> (AdsReadResponse) response.getUserdata().getData())
+                            .handle(responseAdsReadTableData -> {
+                                if (responseAdsData.getResult() == ReturnCode.OK) {
+                                    // Parse the result.
+                                    ReadBuffer rb = new ReadBufferByteBased(responseAdsReadTableData.getData());
+                                    while (rb.hasMore(8)) {
+                                        try {
+                                            AdsDataTypeTableEntry adsDataTypeTableEntry = AdsDataTypeTableEntry.staticParse(rb);
+                                            System.out.println(adsDataTypeTableEntry);
+                                            dataTypes.add(adsDataTypeTableEntry);
+                                        } catch (ParseException e) {
+                                            throw new RuntimeException(e);
+                                        }
+                                    }
+                                }
+                            }));*/
+                    } catch (ParseException e) {
+                        future.completeExceptionally(new PlcException("Error loading the table sizes", e));
+                    }
+                } else {
+                    // TODO: Implement this correctly.
+                    future.completeExceptionally(new PlcException("Result is " + responseAdsData.getResult()));
+                }
+                // Finish the request-transaction.
+                transaction.endRequest();
+            }));
+        future.whenComplete((unused, throwable) -> {
+            if(throwable != null) {
+                LOGGER.error("Error fetching symbol and datatype table sizes");
+            } else {
+                context.fireConnected();
+            }
+        });
     }
 
     @Override
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java
index 77b0d1ac7..0bda07b2b 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDiscoverySerializerParserTest.java
@@ -24,7 +24,7 @@ import org.junit.jupiter.api.Disabled;
 public class AdsDiscoverySerializerParserTest extends ParserSerializerTestsuiteRunner {
 
     public AdsDiscoverySerializerParserTest() {
-        super("/protocols/ads/AdsDiscoverySerializerTest.xml", true);
+        super("/protocols/ads/AdsDiscoverySerializerTest.xml");
     }
 
 }
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java
index 46c440588..973231ce1 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/AdsDriverIT.java
@@ -19,11 +19,13 @@
 package org.apache.plc4x.protocol.ads;
 
 import org.apache.plc4x.test.driver.DriverTestsuiteRunner;
+import org.junit.jupiter.api.Disabled;
 
+@Disabled("I have to port the commands for reading the symbol-table first")
 public class AdsDriverIT extends DriverTestsuiteRunner {
 
     public AdsDriverIT() {
-        super("/protocols/ads/DriverTestsuite.xml");
+        super("/protocols/ads/DriverTestsuite.xml", true);
     }
 
 }
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ProbeAdsDiscoveryCommands.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ProbeAdsDiscoveryCommands.java
index 241255d2c..051341849 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ProbeAdsDiscoveryCommands.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ProbeAdsDiscoveryCommands.java
@@ -26,20 +26,22 @@ import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetAddress;
 import java.util.Arrays;
+import java.util.Collections;
 
 public class ProbeAdsDiscoveryCommands {
 
     public static void main(String[] args) {
         // Create the discovery request message for this device.
         AmsNetId amsNetId = new AmsNetId((byte) 192, (byte) 168, (byte) 23, (byte) 200, (byte) 1, (byte) 1);
-        AdsDiscovery discoveryRequestMessage = new AdsDiscovery(1, Operation.ADD_OR_UPDATE_ROUTE_REQUEST, amsNetId, AdsPortNumbers.SYSTEM_SERVICE,
+        AdsDiscovery discoveryRequestMessage = new AdsDiscovery(1, Operation.UNKNOWN_REQUEST, amsNetId, AdsPortNumbers.SYSTEM_SERVICE,
             //Collections.emptyList()
             Arrays.asList(
-                new AdsDiscoveryBlockRouteName(new AmsString("route-name")),
+                /*new AdsDiscoveryBlockRouteName(new AmsString("route-name")),
                 new AdsDiscoveryBlockAmsNetId(amsNetId),
                 new AdsDiscoveryBlockUserName(new AmsString("username")),
                 new AdsDiscoveryBlockPassword(new AmsString("password")),
-                new AdsDiscoveryBlockHostName(new AmsString("host-name-or-ip"))
+                new AdsDiscoveryBlockHostName(new AmsString("host-name-or-ip"))*/
+                new AdsDiscoveryBlockAmsNetId(new AmsNetId((byte) 192, (byte) 168, (byte) 23, (byte) 20, (byte) 1, (byte) 1))
             ));
 
         try (DatagramSocket adsDiscoverySocket = new DatagramSocket(AdsDiscoveryConstants.ADSDISCOVERYUDPDEFAULTPORT)) {
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
index 25b73f3a3..c49624e3a 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads-discovery.mspec
@@ -113,27 +113,19 @@
 // without any blocks for any of the "UNKNOWN" request codes.
 // However all responses do contain the remote AmsNetId.
 [enum uint 32 Operation
-    ['0x00000000' UNKNOWN_1_REQUEST           ]
-    ['0x80000000' UNKNOWN_1_RESPONSE          ]
     ['0x00000001' DISCOVERY_REQUEST           ]
     ['0x80000001' DISCOVERY_RESPONSE          ]
-    ['0x00000002' UNKNOWN_2_REQUEST           ]
-    ['0x80000002' UNKNOWN_2_RESPONSE          ]
-    ['0x00000003' UNKNOWN_3_REQUEST           ]
-    ['0x80000003' UNKNOWN_3_RESPONSE          ]
-    ['0x00000004' UNKNOWN_4_REQUEST           ]
-    ['0x80000004' UNKNOWN_4_RESPONSE          ]
-    ['0x00000005' UNKNOWN_5_REQUEST           ]
-    ['0x80000005' UNKNOWN_5_RESPONSE          ]
     // Update information for an entry with the same AmsNetId
     ['0x00000006' ADD_OR_UPDATE_ROUTE_REQUEST ]
     ['0x80000006' ADD_OR_UPDATE_ROUTE_RESPONSE]
     ['0x00000007' DEL_ROUTE_REQUEST           ]
     ['0x80000007' DEL_ROUTE_RESPONSE          ]
-    ['0x00000008' UNKNOWN_8_REQUEST           ]
-    ['0x80000008' UNKNOWN_8_RESPONSE          ]
-    ['0x00000009' UNKNOWN_9_REQUEST           ]
-    ['0x80000009' UNKNOWN_9_RESPONSE          ]
+    // In contrast to the other message, I get an status block back when using this,
+    // just as if I was adding a route with invalid credentials. So possibly we might
+    // have something here ... I would guess something like a Enumerate Routes command
+    // For which I have seen in the documentation of TwinCat 2 and 3.
+    ['0x00000008' UNKNOWN_REQUEST             ]
+    ['0x80000008' UNKNOWN_RESPONSE            ]
 ]
 
 [enum uint 32 Status
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index f8b69bb1d..a5d6bde5f 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -735,3 +735,89 @@
     ['0x274D' WSAECONNREFUSED]
     ['0x2751' WSAEHOSTUNREACH]
 ]
+
+// https://github.com/Beckhoff/ADS/blob/master/AdsLib/standalone/AdsDef.h
+// https://gitlab.com/xilix-systems-llc/go-native-ads/-/blob/master/ads.go#L145
+// https://gitlab.com/xilix-systems-llc/go-native-ads/-/blob/master/connection.go#L109
+// https://gitlab.com/xilix-systems-llc/go-native-ads/-/blob/master/symbols.go#L222
+[enum uint 32 AdsSignificantGroupAddresses
+    ['0x0000F00B' SYMBOL_TABLE   ]
+    ['0x0000F00E' DATA_TYPE_TABLE]
+    ['0x0000F00F' TABLE_SIZES    ]
+]
+
+[type AdsTableSizes byteOrder='LITTLE_ENDIAN'
+	[simple   uint 32 symbolCount   ]
+	[simple   uint 32 symbolLength  ]
+	[simple   uint 32 dataTypeCount ]
+	[simple   uint 32 dataTypeLength]
+	[simple   uint 32 extraCount    ]
+	[simple   uint 32 extraLength   ]
+]
+
+[type AdsSymbolTableEntry byteOrder='LITTLE_ENDIAN'
+  	[simple   uint 32                      entryLength                           ]
+    [simple   uint 32                      group                                 ]
+    [simple   uint 32                      offset                                ]
+    [simple   uint 32                      size                                  ]
+    [simple   uint 32                      dataType                              ]
+    // Start: Flags
+    // https://github.com/jisotalo/ads-server/blob/master/src/ads-commons.ts#L631
+    // Order of the bits if read Little-Endian and then accessing the bit flags
+    // 7 6 5 4 3 2 1 0  |  15 14 13 12 11 10 9 8  |  23 22 21 20 19 18 17 16 | 31 30 29 28 27 26 25 24
+    [simple   bit                          flagMethodDeref                       ]
+    [simple   bit                          flagItfMethodAccess                   ]
+    [simple   bit                          flagReadOnly                          ]
+    [simple   bit                          flagTComInterfacePointer              ]
+    [simple   bit                          flagTypeGuid                          ]
+    [simple   bit                          flagReferenceTo                       ]
+    [simple   bit                          flagBitValue                          ]
+    [simple   bit                          flagPersistent                        ]
+    [reserved uint 3                       '0x00'                                ]
+    [simple   bit                          flagExtendedFlags                     ]
+    [simple   bit                          flagInitOnReset                       ]
+    [simple   bit                          flagStatic                            ]
+    [simple   bit                          flagAttributes                        ]
+    [simple   bit                          flagContextMask                       ]
+    [reserved uint 16                      '0x0000'                              ]
+    // End: Flags
+    [implicit uint 16                      nameLength         'STR_LEN(name)'    ]
+    [implicit uint 16                      typeNameLength     'STR_LEN(typeName)']
+    [implicit uint 16                      commentLength      'STR_LEN(comment)' ]
+	[simple   vstring 'nameLength * 8'     name                                  ]
+	[const    uint 8                       nameTerminator     0x00               ]
+	[simple   vstring 'typeNameLength * 8' typeName                              ]
+	[const    uint 8                       typeNameTerminator 0x00               ]
+	[simple   vstring 'commentLength * 8'  comment                               ]
+	[const    uint 8                       commentTerminator  0x00               ]
+	// Gobbling up the rest, but it seems there is content in here, when looking
+	// at the data in wireshark, it seems to be related to the flags field.
+	// Will have to continue searching for more details on how to decode this.
+	// I would assume that we'll have some "optional" fields here which depend
+	// on values in the flags section.
+	[array    byte                         rest               count 'entryLength - curPos']
+]
+
+// https://gitlab.com/xilix-systems-llc/go-native-ads/-/blob/master/symbols.go#L15
+[type AdsDataTypeTableEntry byteOrder='LITTLE_ENDIAN'
+	[simple   uint 32                            entryLength                           ]
+	[simple   uint 32                            version                               ]
+	[simple   uint 32                            hashValue                             ]
+	[simple   uint 32                            typeHashValue                         ]
+	[simple   uint 32                            size                                  ]
+	[simple   uint 32                            offs                                  ]
+	[simple   uint 32                            dataType                              ]
+	[simple   uint 32                            flags                                 ]
+	[implicit uint 16                            nameLength         'STR_LEN(name)'    ]
+	[implicit uint 16                            typeNameLength     'STR_LEN(typeName)']
+	[implicit uint 16                            commentLength      'STR_LEN(comment)' ]
+	[simple   uint 16                            arrayDim                              ]
+	[simple   uint 16                            subItems                              ]
+	[simple   vstring '(nameLength - 1) * 8'     name                                  ]
+	[const    uint 8                             nameTerminator     0x00               ]
+	[simple   vstring '(typeNameLength - 1) * 8' typeName                              ]
+	[const    uint 8                             typeNameTerminator 0x00               ]
+	[simple   vstring '(commentLength - 1) * 8'  comment                               ]
+	[const    uint 8                             commentTerminator  0x00               ]
+	//[array    AdsDataTypeTableEntry              children           length               '']
+]
diff --git a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
index fb0aa1c2f..70a6dd51a 100644
--- a/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
+++ b/protocols/ads/src/test/resources/protocols/ads/DriverTestsuite.xml
@@ -113,9 +113,9 @@
               <data>
                 <AdsData>
                   <AdsReadRequest>
-                    <indexGroup dataType="uint" bitLength="32">4040</indexGroup>
-                    <indexOffset dataType="uint" bitLength="32">8</indexOffset>
-                    <length dataType="uint" bitLength="32">1</length>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
+                    <indexOffset dataType="uint" bitLength="32">0</indexOffset>
+                    <length dataType="uint" bitLength="32">24</length>
                   </AdsReadRequest>
                 </AdsData>
               </data>
@@ -238,7 +238,7 @@
       <outgoing-plc-message name="Send Ads Read Request">
         <AmsTCPPacket>
           <reserved dataType="uint" bitLength="16">0</reserved>
-          <length dataType="uint" bitLength="32">72</length>
+          <length dataType="uint" bitLength="32">44</length>
           <userdata>
             <AmsPacket>
               <targetAmsNetId>
@@ -264,7 +264,7 @@
               </sourceAmsNetId>
               <sourceAmsPort dataType="uint" bitLength="16">48898</sourceAmsPort>
               <commandId>
-                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ_WRITE">9</CommandId>
+                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ">2</CommandId>
               </commandId>
               <state>
                 <State>
@@ -280,34 +280,16 @@
                   <reserved dataType="int" bitLength="7">0</reserved>
                 </State>
               </state>
-              <length dataType="uint" bitLength="32">40</length>
+              <length dataType="uint" bitLength="32">12</length>
               <errorCode dataType="uint" bitLength="32">0</errorCode>
               <invokeId dataType="uint" bitLength="32">1</invokeId>
               <data>
                 <AdsData>
-                  <AdsReadWriteRequest>
-                    <indexGroup dataType="uint" bitLength="32">61568</indexGroup>
-                    <indexOffset dataType="uint" bitLength="32">2</indexOffset>
-                    <readLength dataType="uint" bitLength="32">10</readLength>
-                    <writeLength dataType="uint" bitLength="32">24</writeLength>
-                    <items isList="true">
-                      <AdsMultiRequestItem>
-                        <AdsMultiRequestItemRead>
-                          <itemIndexGroup dataType="uint" bitLength="32">4040</itemIndexGroup>
-                          <itemIndexOffset dataType="uint" bitLength="32">8</itemIndexOffset>
-                          <itemReadLength dataType="uint" bitLength="32">1</itemReadLength>
-                        </AdsMultiRequestItemRead>
-                      </AdsMultiRequestItem>
-                      <AdsMultiRequestItem>
-                        <AdsMultiRequestItemRead>
-                          <itemIndexGroup dataType="uint" bitLength="32">4040</itemIndexGroup>
-                          <itemIndexOffset dataType="uint" bitLength="32">12</itemIndexOffset>
-                          <itemReadLength dataType="uint" bitLength="32">1</itemReadLength>
-                        </AdsMultiRequestItemRead>
-                      </AdsMultiRequestItem>
-                    </items>
-                    <data dataType="byte" bitLength="0">0x</data>
-                  </AdsReadWriteRequest>
+                  <AdsReadRequest>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
+                    <indexOffset dataType="uint" bitLength="32">0</indexOffset>
+                    <length dataType="uint" bitLength="32">24</length>
+                  </AdsReadRequest>
                 </AdsData>
               </data>
             </AmsPacket>
@@ -441,7 +423,7 @@
       <outgoing-plc-message name="Send Resolve Symbolic Address Request">
         <AmsTCPPacket>
           <reserved dataType="uint" bitLength="16">0</reserved>
-          <length dataType="uint" bitLength="32">74</length>
+          <length dataType="uint" bitLength="32">44</length>
           <userdata>
             <AmsPacket>
               <targetAmsNetId>
@@ -467,7 +449,7 @@
               </sourceAmsNetId>
               <sourceAmsPort dataType="uint" bitLength="16">48898</sourceAmsPort>
               <commandId>
-                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ_WRITE">9</CommandId>
+                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ">2</CommandId>
               </commandId>
               <state>
                 <State>
@@ -483,20 +465,16 @@
                   <reserved dataType="int" bitLength="7">0</reserved>
                 </State>
               </state>
-              <length dataType="uint" bitLength="32">42</length>
+              <length dataType="uint" bitLength="32">12</length>
               <errorCode dataType="uint" bitLength="32">0</errorCode>
               <invokeId dataType="uint" bitLength="32">1</invokeId>
               <data>
                 <AdsData>
-                  <AdsReadWriteRequest>
-                    <indexGroup dataType="uint" bitLength="32">61443</indexGroup>
+                  <AdsReadRequest>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
                     <indexOffset dataType="uint" bitLength="32">0</indexOffset>
-                    <readLength dataType="uint" bitLength="32">4</readLength>
-                    <writeLength dataType="uint" bitLength="32">26</writeLength>
-                    <items isList="true">
-                    </items>
-                    <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
-                  </AdsReadWriteRequest>
+                    <length dataType="uint" bitLength="32">24</length>
+                  </AdsReadRequest>
                 </AdsData>
               </data>
             </AmsPacket>
@@ -737,7 +715,7 @@
       <outgoing-plc-message name="Send Resolve Symbolic Address Request">
         <AmsTCPPacket>
           <reserved dataType="uint" bitLength="16">0</reserved>
-          <length dataType="uint" bitLength="32">74</length>
+          <length dataType="uint" bitLength="32">44</length>
           <userdata>
             <AmsPacket>
               <targetAmsNetId>
@@ -763,7 +741,7 @@
               </sourceAmsNetId>
               <sourceAmsPort dataType="uint" bitLength="16">48898</sourceAmsPort>
               <commandId>
-                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ_WRITE">9</CommandId>
+                <CommandId dataType="uint" bitLength="16" stringRepresentation="ADS_READ">2</CommandId>
               </commandId>
               <state>
                 <State>
@@ -779,20 +757,16 @@
                   <reserved dataType="int" bitLength="7">0</reserved>
                 </State>
               </state>
-              <length dataType="uint" bitLength="32">42</length>
+              <length dataType="uint" bitLength="32">12</length>
               <errorCode dataType="uint" bitLength="32">0</errorCode>
               <invokeId dataType="uint" bitLength="32">1</invokeId>
               <data>
                 <AdsData>
-                  <AdsReadWriteRequest>
-                    <indexGroup dataType="uint" bitLength="32">61443</indexGroup>
+                  <AdsReadRequest>
+                    <indexGroup dataType="uint" bitLength="32">61455</indexGroup>
                     <indexOffset dataType="uint" bitLength="32">0</indexOffset>
-                    <readLength dataType="uint" bitLength="32">4</readLength>
-                    <writeLength dataType="uint" bitLength="32">26</writeLength>
-                    <items isList="true">
-                    </items>
-                    <data dataType="byte" bitLength="208">0x6d61696e2e665f74726967446174656947656c6573656e2e4d00</data>
-                  </AdsReadWriteRequest>
+                    <length dataType="uint" bitLength="32">24</length>
+                  </AdsReadRequest>
                 </AdsData>
               </data>
             </AmsPacket>


[plc4x] 01/07: Prototype of ADS symbol scanner.

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 7f1f52fd4f52fa0072882747d6e3e9eb28faad5f
Author: Łukasz Dywicki <lu...@code-house.org>
AuthorDate: Tue Aug 2 02:25:29 2022 +0200

    Prototype of ADS symbol scanner.
    
    Signed-off-by: Łukasz Dywicki <lu...@code-house.org>
---
 .../org/apache/plc4x/protocol/ads/Scanner.java     | 151 +++++++++++++++++++++
 1 file changed, 151 insertions(+)

diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/Scanner.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/Scanner.java
new file mode 100644
index 000000000..4c55e0d66
--- /dev/null
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/Scanner.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.protocol.ads;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.ads.readwrite.AdsDataType;
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.metadata.PlcConnectionMetadata;
+import org.apache.plc4x.java.api.value.PlcValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class Scanner {
+
+    private static Logger logger = LoggerFactory.getLogger(Scanner.class);
+
+    public static void main(String[] args) throws Exception {
+        if (args.length != 5) {
+            System.out.println("Usage: java -jar ... [ip -address] [target ams] [target ams port] [source ams] [source ams port]");
+            System.out.println("All fields are required. AMS route must be created beforehand.");
+            System.out.println("Example parameter sequence:");
+            System.out.println("  192.168.2.251  39.42.54.209.1.1  851  192.168.2.232.1.1  851");
+            return;
+        }
+
+        String targetIp = args[0];
+        String targetAmsId = args[1];
+        String targetAmsPort = args[2];
+
+        String sourceAmsId = args[3];
+        String sourceAmsPort = args[4];
+
+        String connectionString = "ads:tcp://" + targetIp + "?targetAmsNetId=" + targetAmsId + "&targetAmsPort=" + targetAmsPort + "&sourceAmsNetId=" + sourceAmsId + "&sourceAmsPort=" + sourceAmsPort;
+        System.out.println("Launching connection " + connectionString);
+
+        // Establish a connection to the plc using the url provided as first argument
+        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(connectionString)) {
+            PlcConnectionMetadata metadata = plcConnection.getMetadata();
+            System.out.println("read: " + metadata.canRead());
+            System.out.println("write: " + metadata.canWrite());
+
+            // read symbols
+            System.out.println("Reading symbol info");
+            PlcReadRequest.Builder readRequestBuilder = plcConnection.readRequestBuilder();
+            PlcReadRequest request = readRequestBuilder.addItem("SYM_UPLOADINFO2", "0xf00f/0x0:SINT[24]").build();
+            PlcReadResponse rsp = request.execute().get();
+            ByteBuffer buffer = toBuffer(rsp, "SYM_UPLOADINFO2");
+
+            //System.err.println("first answer " + Hex.dump(buffer.array()));
+            int symbolAnswerSize = buffer.getInt(4);
+            System.out.println("Expecting symbol table containing " + symbolAnswerSize + " bytes");
+
+            request = plcConnection.readRequestBuilder().addItem("SYM_UPLOAD", "0xf00b/0x0:SINT[" + symbolAnswerSize + "]").build();
+            PlcReadResponse readResponse = request.execute().get();
+            buffer = toBuffer(readResponse, "SYM_UPLOAD");
+            //System.err.println("second answer " + Hex.dump(buffer.array()));
+
+            System.out.println("      |           PLC4X Field        |          Hex          |                                                            ");
+            System.out.println("##### |          Query Syntax        |   Index   |   Offset  |   Type   | Name                                   | Size (B) | Type | Flag | Comment");
+            System.out.println("------+------------------------------+-----------+-----------+----------+----------------------------------------+----------+------+------+");
+
+            int index = 0;
+            int pos = 0;
+
+            List<String> supportedTypes = Arrays.stream(AdsDataType.values())
+                .map(AdsDataType::name)
+                .map(String::toUpperCase)
+                .map(s -> s + '\0')
+                .collect(Collectors.toList());
+
+            while (buffer.remaining() > 0) {
+                int sectionLen = buffer.getInt();
+
+                int group = buffer.getInt();
+                int offset = buffer.getInt();
+                int symbolSize = buffer.getInt();
+                int symbolType = buffer.getInt();
+                int symbolFlags = buffer.getInt();
+                short nameLength = (short) (buffer.getShort() + 1);
+                short typeLength = (short) (buffer.getShort() + 1);
+                short commentLength = (short) (buffer.getShort() + 1);
+
+                String name= slice(buffer, nameLength);
+                String type = slice(buffer, typeLength);
+                String comment = slice(buffer, commentLength);
+
+                if (supportedTypes.contains(type.toUpperCase())) {
+                    System.out.printf("%5s |", index++);
+                    System.out.printf("%30s |", "0x" + Integer.toHexString(group) + "/0x" + Integer.toHexString(offset) + ":" + type);
+                    System.out.printf("%10s |", "0x" + Integer.toHexString(group));
+                    System.out.printf("%10s |", "0x" + Integer.toHexString(offset));
+                    System.out.printf("%10s |", type);
+                    System.out.printf("%-40s |", name);
+                    System.out.printf("%9s |", symbolSize);
+                    System.out.printf("%5s |", symbolType);
+                    System.out.printf("%5s |", symbolFlags);
+                    System.out.println(comment);
+                }
+
+                pos += sectionLen;
+                buffer.position(pos);
+
+            }
+        }
+    }
+
+    private static String slice(ByteBuffer buffer, short length) {
+        byte[] arr = new byte[length];
+        buffer.get(arr);
+        return new String(arr, StandardCharsets.UTF_8);
+    }
+
+    private static ByteBuffer toBuffer(PlcReadResponse rsp, String fieldName) {
+        System.out.println(rsp.getFieldNames() + " " + rsp.getField(fieldName) + " " + rsp.getResponseCode(fieldName));
+        List<PlcValue> symbols = (List<PlcValue>) rsp.getObject(fieldName);
+        ByteBuffer buffer = ByteBuffer.allocate(symbols.size()).order(ByteOrder.LITTLE_ENDIAN);
+
+        for (PlcValue byteVal : symbols) {
+            byte byteValue = byteVal.getByte();
+            //System.err.println("data " + Hex.encodeHexString(new byte[] {byteValue}));
+            buffer.put(byteValue);
+        }
+        buffer.rewind();
+        return buffer;
+    }
+
+}


[plc4x] 07/07: chore(ads): Tried fixing the go-build of the updated ADS protocol.

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit f3760aa6e8b99d01021614d2e573fd6a114de68d
Author: christoferdutz <ch...@c-ware.de>
AuthorDate: Wed Aug 10 09:37:30 2022 +0200

    chore(ads): Tried fixing the go-build of the updated ADS protocol.
---
 .../language/go/GoLanguageTemplateHelper.java      |   1 +
 plc4go/protocols/abeth/readwrite/ParserHelper.go   |   2 +-
 .../protocols/abeth/readwrite/XmlParserHelper.go   |  38 +-
 .../model/CIPEncapsulationConnectionRequest.go     |  31 +-
 .../model/CIPEncapsulationConnectionResponse.go    |  31 +-
 .../readwrite/model/CIPEncapsulationPacket.go      |  71 +-
 .../readwrite/model/CIPEncapsulationReadRequest.go |  62 +-
 .../model/CIPEncapsulationReadResponse.go          |  63 +-
 .../readwrite/model/DF1CommandRequestMessage.go    |  62 +-
 ...mandResponseMessageProtectedTypedLogicalRead.go |  61 +-
 .../abeth/readwrite/model/DF1RequestCommand.go     |  32 +-
 .../abeth/readwrite/model/DF1RequestMessage.go     |  61 +-
 .../model/DF1RequestProtectedTypedLogicalRead.go   | 141 ++--
 .../abeth/readwrite/model/DF1ResponseMessage.go    |  64 +-
 plc4go/protocols/ads/readwrite/ParserHelper.go     |   4 +-
 plc4go/protocols/ads/readwrite/XmlParserHelper.go  | 108 +--
 .../model/AdsAddDeviceNotificationRequest.go       | 228 ++++---
 .../model/AdsAddDeviceNotificationResponse.go      |  84 +--
 .../protocols/ads/readwrite/model/AdsConstants.go  |  22 +-
 plc4go/protocols/ads/readwrite/model/AdsData.go    |  66 +-
 .../protocols/ads/readwrite/model/AdsDataType.go   | 658 ++++++++----------
 .../ads/readwrite/model/AdsDataTypeArrayInfo.go    |  37 +-
 .../ads/readwrite/model/AdsDataTypeTableEntry.go   | 149 +++--
 .../model/AdsDeleteDeviceNotificationRequest.go    |  54 +-
 .../model/AdsDeleteDeviceNotificationResponse.go   |  66 +-
 .../model/AdsDeviceNotificationRequest.go          | 112 ++--
 .../model/AdsDeviceNotificationResponse.go         |  35 +-
 .../ads/readwrite/model/AdsInvalidRequest.go       |  35 +-
 .../ads/readwrite/model/AdsInvalidResponse.go      |  35 +-
 .../ads/readwrite/model/AdsMultiRequestItem.go     |  32 +-
 .../ads/readwrite/model/AdsMultiRequestItemRead.go |  97 +--
 .../readwrite/model/AdsMultiRequestItemWrite.go    |  97 +--
 .../ads/readwrite/model/AdsNotificationSample.go   |  41 +-
 .../readwrite/model/AdsReadDeviceInfoRequest.go    |  35 +-
 .../readwrite/model/AdsReadDeviceInfoResponse.go   | 140 ++--
 .../ads/readwrite/model/AdsReadRequest.go          |  98 +--
 .../ads/readwrite/model/AdsReadResponse.go         |  94 +--
 .../ads/readwrite/model/AdsReadStateRequest.go     |  35 +-
 .../ads/readwrite/model/AdsReadStateResponse.go    | 106 +--
 .../ads/readwrite/model/AdsReadWriteRequest.go     | 166 ++---
 .../ads/readwrite/model/AdsReadWriteResponse.go    |  94 +--
 .../model/AdsSignificantGroupAddresses.go          |  25 +-
 .../ads/readwrite/model/AdsStampHeader.go          |  47 +-
 .../ads/readwrite/model/AdsSymbolTableEntry.go     | 283 ++++----
 .../protocols/ads/readwrite/model/AdsTableSizes.go |  69 +-
 .../ads/readwrite/model/AdsWriteControlRequest.go  | 104 +--
 .../ads/readwrite/model/AdsWriteControlResponse.go |  66 +-
 .../ads/readwrite/model/AdsWriteRequest.go         | 104 +--
 .../ads/readwrite/model/AdsWriteResponse.go        |  66 +-
 plc4go/protocols/ads/readwrite/model/AmsNetId.go   |  69 +-
 plc4go/protocols/ads/readwrite/model/AmsPacket.go  |  83 +--
 .../readwrite/model/AmsSerialAcknowledgeFrame.go   |  69 +-
 .../ads/readwrite/model/AmsSerialFrame.go          |  75 ++-
 .../ads/readwrite/model/AmsSerialResetFrame.go     |  69 +-
 .../protocols/ads/readwrite/model/AmsTCPPacket.go  |  33 +-
 plc4go/protocols/ads/readwrite/model/DataItem.go   | 645 +++++++++---------
 .../ads/readwrite/model/ReservedIndexGroups.go     | 187 +++---
 plc4go/protocols/ads/readwrite/model/ReturnCode.go | 739 +++++++++++----------
 plc4go/protocols/ads/readwrite/model/State.go      |  99 +--
 .../protocols/ads/readwrite/model/StaticHelper.go  |   8 +-
 .../ads/src/main/resources/protocols/ads/ads.mspec |  84 +--
 61 files changed, 3363 insertions(+), 3009 deletions(-)

diff --git a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index a656652e7..d6ce46996 100644
--- a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -784,6 +784,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             return toCeilVariableExpression(field, variableLiteral, parserArguments, serializerArguments, serialize, suppressPointerAccess, tracer);
         }
         // All uppercase names are not fields, but utility methods.
+        // TODO: It seems we also run into this, in case of using enum constants in type-switches.
         else if (variableLiteralName.equals(variableLiteralName.toUpperCase())) {
             tracer = tracer.dive("utility");
             return toUppercaseVariableExpression(field, typeReference, variableLiteral, parserArguments, serializerArguments, serialize, suppressPointerAccess, tracer);
diff --git a/plc4go/protocols/abeth/readwrite/ParserHelper.go b/plc4go/protocols/abeth/readwrite/ParserHelper.go
index 861b5af64..ff1947bc7 100644
--- a/plc4go/protocols/abeth/readwrite/ParserHelper.go
+++ b/plc4go/protocols/abeth/readwrite/ParserHelper.go
@@ -20,8 +20,8 @@
 package readwrite
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/apache/plc4x/plc4go/protocols/abeth/readwrite/model"
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
diff --git a/plc4go/protocols/abeth/readwrite/XmlParserHelper.go b/plc4go/protocols/abeth/readwrite/XmlParserHelper.go
index 76b316a06..c08566b28 100644
--- a/plc4go/protocols/abeth/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/abeth/readwrite/XmlParserHelper.go
@@ -20,11 +20,11 @@
 package readwrite
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/apache/plc4x/plc4go/protocols/abeth/readwrite/model"
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
-	"strconv"
-	"strings"
+    "strings"
+    "strconv"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
@@ -41,20 +41,20 @@ func init() {
 }
 
 func (m AbethXmlParserHelper) Parse(typeName string, xmlString string, parserArguments ...string) (interface{}, error) {
-	switch typeName {
-	case "DF1RequestCommand":
-		return model.DF1RequestCommandParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "DF1RequestMessage":
-		return model.DF1RequestMessageParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "DF1ResponseMessage":
-		parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 16)
-		if err != nil {
-			return nil, err
-		}
-		payloadLength := uint16(parsedUint0)
-		return model.DF1ResponseMessageParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), payloadLength)
-	case "CIPEncapsulationPacket":
-		return model.CIPEncapsulationPacketParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	}
-	return nil, errors.Errorf("Unsupported type %s", typeName)
+    switch typeName {
+        case "DF1RequestCommand":
+			return model.DF1RequestCommandParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "DF1RequestMessage":
+			return model.DF1RequestMessageParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "DF1ResponseMessage":
+			parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 16)
+			if err!=nil {
+				return nil, err
+			}
+			payloadLength := uint16(parsedUint0)
+            return model.DF1ResponseMessageParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), payloadLength  )
+        case "CIPEncapsulationPacket":
+			return model.CIPEncapsulationPacketParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+    }
+    return nil, errors.Errorf("Unsupported type %s", typeName)
 }
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go
index d76fb9108..55ee74a63 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // CIPEncapsulationConnectionRequest is the corresponding interface of CIPEncapsulationConnectionRequest
 type CIPEncapsulationConnectionRequest interface {
@@ -45,35 +47,36 @@ type _CIPEncapsulationConnectionRequest struct {
 	*_CIPEncapsulationPacket
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_CIPEncapsulationConnectionRequest) GetCommandType() uint16 {
-	return 0x0101
-}
+func (m *_CIPEncapsulationConnectionRequest)  GetCommandType() uint16 {
+return 0x0101}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_CIPEncapsulationConnectionRequest) InitializeParent(parent CIPEncapsulationPacket, sessionHandle uint32, status uint32, senderContext []uint8, options uint32) {
-	m.SessionHandle = sessionHandle
+func (m *_CIPEncapsulationConnectionRequest) InitializeParent(parent CIPEncapsulationPacket , sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) {	m.SessionHandle = sessionHandle
 	m.Status = status
 	m.SenderContext = senderContext
 	m.Options = options
 }
 
-func (m *_CIPEncapsulationConnectionRequest) GetParent() CIPEncapsulationPacket {
+func (m *_CIPEncapsulationConnectionRequest)  GetParent() CIPEncapsulationPacket {
 	return m._CIPEncapsulationPacket
 }
 
+
 // NewCIPEncapsulationConnectionRequest factory function for _CIPEncapsulationConnectionRequest
-func NewCIPEncapsulationConnectionRequest(sessionHandle uint32, status uint32, senderContext []uint8, options uint32) *_CIPEncapsulationConnectionRequest {
+func NewCIPEncapsulationConnectionRequest( sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) *_CIPEncapsulationConnectionRequest {
 	_result := &_CIPEncapsulationConnectionRequest{
-		_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
+    	_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
 	}
 	_result._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _result
 	return _result
@@ -81,7 +84,7 @@ func NewCIPEncapsulationConnectionRequest(sessionHandle uint32, status uint32, s
 
 // Deprecated: use the interface for direct cast
 func CastCIPEncapsulationConnectionRequest(structType interface{}) CIPEncapsulationConnectionRequest {
-	if casted, ok := structType.(CIPEncapsulationConnectionRequest); ok {
+    if casted, ok := structType.(CIPEncapsulationConnectionRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*CIPEncapsulationConnectionRequest); ok {
@@ -104,6 +107,7 @@ func (m *_CIPEncapsulationConnectionRequest) GetLengthInBitsConditional(lastItem
 	return lengthInBits
 }
 
+
 func (m *_CIPEncapsulationConnectionRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -123,7 +127,8 @@ func CIPEncapsulationConnectionRequestParse(readBuffer utils.ReadBuffer) (CIPEnc
 
 	// Create a partially initialized instance
 	_child := &_CIPEncapsulationConnectionRequest{
-		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{},
+		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{
+		},
 	}
 	_child._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _child
 	return _child, nil
@@ -145,6 +150,7 @@ func (m *_CIPEncapsulationConnectionRequest) Serialize(writeBuffer utils.WriteBu
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_CIPEncapsulationConnectionRequest) isCIPEncapsulationConnectionRequest() bool {
 	return true
 }
@@ -159,3 +165,6 @@ func (m *_CIPEncapsulationConnectionRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go
index f99726a63..2466010b1 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // CIPEncapsulationConnectionResponse is the corresponding interface of CIPEncapsulationConnectionResponse
 type CIPEncapsulationConnectionResponse interface {
@@ -45,35 +47,36 @@ type _CIPEncapsulationConnectionResponse struct {
 	*_CIPEncapsulationPacket
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_CIPEncapsulationConnectionResponse) GetCommandType() uint16 {
-	return 0x0201
-}
+func (m *_CIPEncapsulationConnectionResponse)  GetCommandType() uint16 {
+return 0x0201}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_CIPEncapsulationConnectionResponse) InitializeParent(parent CIPEncapsulationPacket, sessionHandle uint32, status uint32, senderContext []uint8, options uint32) {
-	m.SessionHandle = sessionHandle
+func (m *_CIPEncapsulationConnectionResponse) InitializeParent(parent CIPEncapsulationPacket , sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) {	m.SessionHandle = sessionHandle
 	m.Status = status
 	m.SenderContext = senderContext
 	m.Options = options
 }
 
-func (m *_CIPEncapsulationConnectionResponse) GetParent() CIPEncapsulationPacket {
+func (m *_CIPEncapsulationConnectionResponse)  GetParent() CIPEncapsulationPacket {
 	return m._CIPEncapsulationPacket
 }
 
+
 // NewCIPEncapsulationConnectionResponse factory function for _CIPEncapsulationConnectionResponse
-func NewCIPEncapsulationConnectionResponse(sessionHandle uint32, status uint32, senderContext []uint8, options uint32) *_CIPEncapsulationConnectionResponse {
+func NewCIPEncapsulationConnectionResponse( sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) *_CIPEncapsulationConnectionResponse {
 	_result := &_CIPEncapsulationConnectionResponse{
-		_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
+    	_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
 	}
 	_result._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _result
 	return _result
@@ -81,7 +84,7 @@ func NewCIPEncapsulationConnectionResponse(sessionHandle uint32, status uint32,
 
 // Deprecated: use the interface for direct cast
 func CastCIPEncapsulationConnectionResponse(structType interface{}) CIPEncapsulationConnectionResponse {
-	if casted, ok := structType.(CIPEncapsulationConnectionResponse); ok {
+    if casted, ok := structType.(CIPEncapsulationConnectionResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*CIPEncapsulationConnectionResponse); ok {
@@ -104,6 +107,7 @@ func (m *_CIPEncapsulationConnectionResponse) GetLengthInBitsConditional(lastIte
 	return lengthInBits
 }
 
+
 func (m *_CIPEncapsulationConnectionResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -123,7 +127,8 @@ func CIPEncapsulationConnectionResponseParse(readBuffer utils.ReadBuffer) (CIPEn
 
 	// Create a partially initialized instance
 	_child := &_CIPEncapsulationConnectionResponse{
-		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{},
+		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{
+		},
 	}
 	_child._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _child
 	return _child, nil
@@ -145,6 +150,7 @@ func (m *_CIPEncapsulationConnectionResponse) Serialize(writeBuffer utils.WriteB
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_CIPEncapsulationConnectionResponse) isCIPEncapsulationConnectionResponse() bool {
 	return true
 }
@@ -159,3 +165,6 @@ func (m *_CIPEncapsulationConnectionResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
index 81d965d92..70e9c8be5 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
@@ -19,13 +19,15 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // CIPEncapsulationPacket is the corresponding interface of CIPEncapsulationPacket
 type CIPEncapsulationPacket interface {
@@ -53,10 +55,10 @@ type CIPEncapsulationPacketExactly interface {
 // _CIPEncapsulationPacket is the data-structure of this message
 type _CIPEncapsulationPacket struct {
 	_CIPEncapsulationPacketChildRequirements
-	SessionHandle uint32
-	Status        uint32
-	SenderContext []uint8
-	Options       uint32
+        SessionHandle uint32
+        Status uint32
+        SenderContext []uint8
+        Options uint32
 	// Reserved Fields
 	reservedField0 *uint32
 }
@@ -68,6 +70,7 @@ type _CIPEncapsulationPacketChildRequirements interface {
 	GetCommandType() uint16
 }
 
+
 type CIPEncapsulationPacketParent interface {
 	SerializeParent(writeBuffer utils.WriteBuffer, child CIPEncapsulationPacket, serializeChildFunction func() error) error
 	GetTypeName() string
@@ -75,13 +78,12 @@ type CIPEncapsulationPacketParent interface {
 
 type CIPEncapsulationPacketChild interface {
 	utils.Serializable
-	InitializeParent(parent CIPEncapsulationPacket, sessionHandle uint32, status uint32, senderContext []uint8, options uint32)
+InitializeParent(parent CIPEncapsulationPacket , sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 )
 	GetParent() *CIPEncapsulationPacket
 
 	GetTypeName() string
 	CIPEncapsulationPacket
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -108,14 +110,15 @@ func (m *_CIPEncapsulationPacket) GetOptions() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewCIPEncapsulationPacket factory function for _CIPEncapsulationPacket
-func NewCIPEncapsulationPacket(sessionHandle uint32, status uint32, senderContext []uint8, options uint32) *_CIPEncapsulationPacket {
-	return &_CIPEncapsulationPacket{SessionHandle: sessionHandle, Status: status, SenderContext: senderContext, Options: options}
+func NewCIPEncapsulationPacket( sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) *_CIPEncapsulationPacket {
+return &_CIPEncapsulationPacket{ SessionHandle: sessionHandle , Status: status , SenderContext: senderContext , Options: options }
 }
 
 // Deprecated: use the interface for direct cast
 func CastCIPEncapsulationPacket(structType interface{}) CIPEncapsulationPacket {
-	if casted, ok := structType.(CIPEncapsulationPacket); ok {
+    if casted, ok := structType.(CIPEncapsulationPacket); ok {
 		return casted
 	}
 	if casted, ok := structType.(*CIPEncapsulationPacket); ok {
@@ -128,27 +131,29 @@ func (m *_CIPEncapsulationPacket) GetTypeName() string {
 	return "CIPEncapsulationPacket"
 }
 
+
+
 func (m *_CIPEncapsulationPacket) GetParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
 	// Discriminator Field (commandType)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Implicit Field (packetLen)
 	lengthInBits += 16
 
 	// Simple field (sessionHandle)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (status)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Array field
 	if len(m.SenderContext) > 0 {
 		lengthInBits += 8 * uint16(len(m.SenderContext))
-	}
+				}
 
 	// Simple field (options)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Reserved Field (reserved)
 	lengthInBits += 32
@@ -183,14 +188,14 @@ func CIPEncapsulationPacketParse(readBuffer utils.ReadBuffer) (CIPEncapsulationP
 	}
 
 	// Simple Field (sessionHandle)
-	_sessionHandle, _sessionHandleErr := readBuffer.ReadUint32("sessionHandle", 32)
+_sessionHandle, _sessionHandleErr := readBuffer.ReadUint32("sessionHandle", 32)
 	if _sessionHandleErr != nil {
 		return nil, errors.Wrap(_sessionHandleErr, "Error parsing 'sessionHandle' field of CIPEncapsulationPacket")
 	}
 	sessionHandle := _sessionHandle
 
 	// Simple Field (status)
-	_status, _statusErr := readBuffer.ReadUint32("status", 32)
+_status, _statusErr := readBuffer.ReadUint32("status", 32)
 	if _statusErr != nil {
 		return nil, errors.Wrap(_statusErr, "Error parsing 'status' field of CIPEncapsulationPacket")
 	}
@@ -208,7 +213,7 @@ func CIPEncapsulationPacketParse(readBuffer utils.ReadBuffer) (CIPEncapsulationP
 	}
 	{
 		for curItem := uint16(0); curItem < uint16(uint16(8)); curItem++ {
-			_item, _err := readBuffer.ReadUint8("", 8)
+_item, _err := readBuffer.ReadUint8("", 8)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'senderContext' field of CIPEncapsulationPacket")
 			}
@@ -220,7 +225,7 @@ func CIPEncapsulationPacketParse(readBuffer utils.ReadBuffer) (CIPEncapsulationP
 	}
 
 	// Simple Field (options)
-	_options, _optionsErr := readBuffer.ReadUint32("options", 32)
+_options, _optionsErr := readBuffer.ReadUint32("options", 32)
 	if _optionsErr != nil {
 		return nil, errors.Wrap(_optionsErr, "Error parsing 'options' field of CIPEncapsulationPacket")
 	}
@@ -236,7 +241,7 @@ func CIPEncapsulationPacketParse(readBuffer utils.ReadBuffer) (CIPEncapsulationP
 		if reserved != uint32(0x00000000) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint32(0x00000000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField0 = &reserved
@@ -246,20 +251,20 @@ func CIPEncapsulationPacketParse(readBuffer utils.ReadBuffer) (CIPEncapsulationP
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type CIPEncapsulationPacketChildSerializeRequirement interface {
 		CIPEncapsulationPacket
-		InitializeParent(CIPEncapsulationPacket, uint32, uint32, []uint8, uint32)
+		InitializeParent(CIPEncapsulationPacket,  uint32, uint32, []uint8, uint32)
 		GetParent() CIPEncapsulationPacket
 	}
 	var _childTemp interface{}
 	var _child CIPEncapsulationPacketChildSerializeRequirement
 	var typeSwitchError error
 	switch {
-	case commandType == 0x0101: // CIPEncapsulationConnectionRequest
-		_childTemp, typeSwitchError = CIPEncapsulationConnectionRequestParse(readBuffer)
-	case commandType == 0x0201: // CIPEncapsulationConnectionResponse
-		_childTemp, typeSwitchError = CIPEncapsulationConnectionResponseParse(readBuffer)
-	case commandType == 0x0107: // CIPEncapsulationReadRequest
-		_childTemp, typeSwitchError = CIPEncapsulationReadRequestParse(readBuffer)
-	case commandType == 0x0207: // CIPEncapsulationReadResponse
+case commandType == 0x0101 : // CIPEncapsulationConnectionRequest
+		_childTemp, typeSwitchError = CIPEncapsulationConnectionRequestParse(readBuffer, )
+case commandType == 0x0201 : // CIPEncapsulationConnectionResponse
+		_childTemp, typeSwitchError = CIPEncapsulationConnectionResponseParse(readBuffer, )
+case commandType == 0x0107 : // CIPEncapsulationReadRequest
+		_childTemp, typeSwitchError = CIPEncapsulationReadRequestParse(readBuffer, )
+case commandType == 0x0207 : // CIPEncapsulationReadResponse
 		_childTemp, typeSwitchError = CIPEncapsulationReadResponseParse(readBuffer, packetLen)
 	default:
 		typeSwitchError = errors.Errorf("Unmapped type for parameters [commandType=%v]", commandType)
@@ -274,7 +279,7 @@ func CIPEncapsulationPacketParse(readBuffer utils.ReadBuffer) (CIPEncapsulationP
 	}
 
 	// Finish initializing
-	_child.InitializeParent(_child, sessionHandle, status, senderContext, options)
+_child.InitializeParent(_child , sessionHandle , status , senderContext , options )
 	_child.GetParent().(*_CIPEncapsulationPacket).reservedField0 = reservedField0
 	return _child, nil
 }
@@ -285,7 +290,7 @@ func (pm *_CIPEncapsulationPacket) SerializeParent(writeBuffer utils.WriteBuffer
 	_ = m
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("CIPEncapsulationPacket"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("CIPEncapsulationPacket"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for CIPEncapsulationPacket")
 	}
 
@@ -345,7 +350,7 @@ func (pm *_CIPEncapsulationPacket) SerializeParent(writeBuffer utils.WriteBuffer
 		if pm.reservedField0 != nil {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint32(0x00000000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Overriding reserved field with unexpected value.")
 			reserved = *pm.reservedField0
 		}
@@ -366,6 +371,7 @@ func (pm *_CIPEncapsulationPacket) SerializeParent(writeBuffer utils.WriteBuffer
 	return nil
 }
 
+
 func (m *_CIPEncapsulationPacket) isCIPEncapsulationPacket() bool {
 	return true
 }
@@ -380,3 +386,6 @@ func (m *_CIPEncapsulationPacket) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go
index a87900f26..46914825f 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // CIPEncapsulationReadRequest is the corresponding interface of CIPEncapsulationReadRequest
 type CIPEncapsulationReadRequest interface {
@@ -45,34 +47,33 @@ type CIPEncapsulationReadRequestExactly interface {
 // _CIPEncapsulationReadRequest is the data-structure of this message
 type _CIPEncapsulationReadRequest struct {
 	*_CIPEncapsulationPacket
-	Request DF1RequestMessage
+        Request DF1RequestMessage
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_CIPEncapsulationReadRequest) GetCommandType() uint16 {
-	return 0x0107
-}
+func (m *_CIPEncapsulationReadRequest)  GetCommandType() uint16 {
+return 0x0107}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_CIPEncapsulationReadRequest) InitializeParent(parent CIPEncapsulationPacket, sessionHandle uint32, status uint32, senderContext []uint8, options uint32) {
-	m.SessionHandle = sessionHandle
+func (m *_CIPEncapsulationReadRequest) InitializeParent(parent CIPEncapsulationPacket , sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) {	m.SessionHandle = sessionHandle
 	m.Status = status
 	m.SenderContext = senderContext
 	m.Options = options
 }
 
-func (m *_CIPEncapsulationReadRequest) GetParent() CIPEncapsulationPacket {
+func (m *_CIPEncapsulationReadRequest)  GetParent() CIPEncapsulationPacket {
 	return m._CIPEncapsulationPacket
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -87,11 +88,12 @@ func (m *_CIPEncapsulationReadRequest) GetRequest() DF1RequestMessage {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewCIPEncapsulationReadRequest factory function for _CIPEncapsulationReadRequest
-func NewCIPEncapsulationReadRequest(request DF1RequestMessage, sessionHandle uint32, status uint32, senderContext []uint8, options uint32) *_CIPEncapsulationReadRequest {
+func NewCIPEncapsulationReadRequest( request DF1RequestMessage , sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) *_CIPEncapsulationReadRequest {
 	_result := &_CIPEncapsulationReadRequest{
-		Request:                 request,
-		_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
+		Request: request,
+    	_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
 	}
 	_result._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _result
 	return _result
@@ -99,7 +101,7 @@ func NewCIPEncapsulationReadRequest(request DF1RequestMessage, sessionHandle uin
 
 // Deprecated: use the interface for direct cast
 func CastCIPEncapsulationReadRequest(structType interface{}) CIPEncapsulationReadRequest {
-	if casted, ok := structType.(CIPEncapsulationReadRequest); ok {
+    if casted, ok := structType.(CIPEncapsulationReadRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*CIPEncapsulationReadRequest); ok {
@@ -125,6 +127,7 @@ func (m *_CIPEncapsulationReadRequest) GetLengthInBitsConditional(lastItem bool)
 	return lengthInBits
 }
 
+
 func (m *_CIPEncapsulationReadRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -142,7 +145,7 @@ func CIPEncapsulationReadRequestParse(readBuffer utils.ReadBuffer) (CIPEncapsula
 	if pullErr := readBuffer.PullContext("request"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for request")
 	}
-	_request, _requestErr := DF1RequestMessageParse(readBuffer)
+_request, _requestErr := DF1RequestMessageParse(readBuffer)
 	if _requestErr != nil {
 		return nil, errors.Wrap(_requestErr, "Error parsing 'request' field of CIPEncapsulationReadRequest")
 	}
@@ -157,8 +160,9 @@ func CIPEncapsulationReadRequestParse(readBuffer utils.ReadBuffer) (CIPEncapsula
 
 	// Create a partially initialized instance
 	_child := &_CIPEncapsulationReadRequest{
-		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{},
-		Request:                 request,
+		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{
+		},
+		Request: request,
 	}
 	_child._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _child
 	return _child, nil
@@ -172,17 +176,17 @@ func (m *_CIPEncapsulationReadRequest) Serialize(writeBuffer utils.WriteBuffer)
 			return errors.Wrap(pushErr, "Error pushing for CIPEncapsulationReadRequest")
 		}
 
-		// Simple Field (request)
-		if pushErr := writeBuffer.PushContext("request"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for request")
-		}
-		_requestErr := writeBuffer.WriteSerializable(m.GetRequest())
-		if popErr := writeBuffer.PopContext("request"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for request")
-		}
-		if _requestErr != nil {
-			return errors.Wrap(_requestErr, "Error serializing 'request' field")
-		}
+	// Simple Field (request)
+	if pushErr := writeBuffer.PushContext("request"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for request")
+	}
+	_requestErr := writeBuffer.WriteSerializable(m.GetRequest())
+	if popErr := writeBuffer.PopContext("request"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for request")
+	}
+	if _requestErr != nil {
+		return errors.Wrap(_requestErr, "Error serializing 'request' field")
+	}
 
 		if popErr := writeBuffer.PopContext("CIPEncapsulationReadRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for CIPEncapsulationReadRequest")
@@ -192,6 +196,7 @@ func (m *_CIPEncapsulationReadRequest) Serialize(writeBuffer utils.WriteBuffer)
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_CIPEncapsulationReadRequest) isCIPEncapsulationReadRequest() bool {
 	return true
 }
@@ -206,3 +211,6 @@ func (m *_CIPEncapsulationReadRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go
index 58c32a8cd..7e8d564ff 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // CIPEncapsulationReadResponse is the corresponding interface of CIPEncapsulationReadResponse
 type CIPEncapsulationReadResponse interface {
@@ -45,37 +47,36 @@ type CIPEncapsulationReadResponseExactly interface {
 // _CIPEncapsulationReadResponse is the data-structure of this message
 type _CIPEncapsulationReadResponse struct {
 	*_CIPEncapsulationPacket
-	Response DF1ResponseMessage
+        Response DF1ResponseMessage
 
 	// Arguments.
 	PacketLen uint16
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_CIPEncapsulationReadResponse) GetCommandType() uint16 {
-	return 0x0207
-}
+func (m *_CIPEncapsulationReadResponse)  GetCommandType() uint16 {
+return 0x0207}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_CIPEncapsulationReadResponse) InitializeParent(parent CIPEncapsulationPacket, sessionHandle uint32, status uint32, senderContext []uint8, options uint32) {
-	m.SessionHandle = sessionHandle
+func (m *_CIPEncapsulationReadResponse) InitializeParent(parent CIPEncapsulationPacket , sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 ) {	m.SessionHandle = sessionHandle
 	m.Status = status
 	m.SenderContext = senderContext
 	m.Options = options
 }
 
-func (m *_CIPEncapsulationReadResponse) GetParent() CIPEncapsulationPacket {
+func (m *_CIPEncapsulationReadResponse)  GetParent() CIPEncapsulationPacket {
 	return m._CIPEncapsulationPacket
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -90,11 +91,12 @@ func (m *_CIPEncapsulationReadResponse) GetResponse() DF1ResponseMessage {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewCIPEncapsulationReadResponse factory function for _CIPEncapsulationReadResponse
-func NewCIPEncapsulationReadResponse(response DF1ResponseMessage, sessionHandle uint32, status uint32, senderContext []uint8, options uint32, packetLen uint16) *_CIPEncapsulationReadResponse {
+func NewCIPEncapsulationReadResponse( response DF1ResponseMessage , sessionHandle uint32 , status uint32 , senderContext []uint8 , options uint32 , packetLen uint16 ) *_CIPEncapsulationReadResponse {
 	_result := &_CIPEncapsulationReadResponse{
-		Response:                response,
-		_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
+		Response: response,
+    	_CIPEncapsulationPacket: NewCIPEncapsulationPacket(sessionHandle, status, senderContext, options),
 	}
 	_result._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _result
 	return _result
@@ -102,7 +104,7 @@ func NewCIPEncapsulationReadResponse(response DF1ResponseMessage, sessionHandle
 
 // Deprecated: use the interface for direct cast
 func CastCIPEncapsulationReadResponse(structType interface{}) CIPEncapsulationReadResponse {
-	if casted, ok := structType.(CIPEncapsulationReadResponse); ok {
+    if casted, ok := structType.(CIPEncapsulationReadResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*CIPEncapsulationReadResponse); ok {
@@ -128,6 +130,7 @@ func (m *_CIPEncapsulationReadResponse) GetLengthInBitsConditional(lastItem bool
 	return lengthInBits
 }
 
+
 func (m *_CIPEncapsulationReadResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -145,7 +148,7 @@ func CIPEncapsulationReadResponseParse(readBuffer utils.ReadBuffer, packetLen ui
 	if pullErr := readBuffer.PullContext("response"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for response")
 	}
-	_response, _responseErr := DF1ResponseMessageParse(readBuffer, uint16(packetLen))
+_response, _responseErr := DF1ResponseMessageParse(readBuffer , uint16( packetLen ) )
 	if _responseErr != nil {
 		return nil, errors.Wrap(_responseErr, "Error parsing 'response' field of CIPEncapsulationReadResponse")
 	}
@@ -160,8 +163,9 @@ func CIPEncapsulationReadResponseParse(readBuffer utils.ReadBuffer, packetLen ui
 
 	// Create a partially initialized instance
 	_child := &_CIPEncapsulationReadResponse{
-		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{},
-		Response:                response,
+		_CIPEncapsulationPacket: &_CIPEncapsulationPacket{
+		},
+		Response: response,
 	}
 	_child._CIPEncapsulationPacket._CIPEncapsulationPacketChildRequirements = _child
 	return _child, nil
@@ -175,17 +179,17 @@ func (m *_CIPEncapsulationReadResponse) Serialize(writeBuffer utils.WriteBuffer)
 			return errors.Wrap(pushErr, "Error pushing for CIPEncapsulationReadResponse")
 		}
 
-		// Simple Field (response)
-		if pushErr := writeBuffer.PushContext("response"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for response")
-		}
-		_responseErr := writeBuffer.WriteSerializable(m.GetResponse())
-		if popErr := writeBuffer.PopContext("response"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for response")
-		}
-		if _responseErr != nil {
-			return errors.Wrap(_responseErr, "Error serializing 'response' field")
-		}
+	// Simple Field (response)
+	if pushErr := writeBuffer.PushContext("response"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for response")
+	}
+	_responseErr := writeBuffer.WriteSerializable(m.GetResponse())
+	if popErr := writeBuffer.PopContext("response"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for response")
+	}
+	if _responseErr != nil {
+		return errors.Wrap(_responseErr, "Error serializing 'response' field")
+	}
 
 		if popErr := writeBuffer.PopContext("CIPEncapsulationReadResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for CIPEncapsulationReadResponse")
@@ -195,13 +199,13 @@ func (m *_CIPEncapsulationReadResponse) Serialize(writeBuffer utils.WriteBuffer)
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 ////
 // Arguments Getter
 
 func (m *_CIPEncapsulationReadResponse) GetPacketLen() uint16 {
 	return m.PacketLen
 }
-
 //
 ////
 
@@ -219,3 +223,6 @@ func (m *_CIPEncapsulationReadResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go b/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go
index 50ca3e897..3eef60564 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // DF1CommandRequestMessage is the corresponding interface of DF1CommandRequestMessage
 type DF1CommandRequestMessage interface {
@@ -45,34 +47,33 @@ type DF1CommandRequestMessageExactly interface {
 // _DF1CommandRequestMessage is the data-structure of this message
 type _DF1CommandRequestMessage struct {
 	*_DF1RequestMessage
-	Command DF1RequestCommand
+        Command DF1RequestCommand
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_DF1CommandRequestMessage) GetCommandCode() uint8 {
-	return 0x0F
-}
+func (m *_DF1CommandRequestMessage)  GetCommandCode() uint8 {
+return 0x0F}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_DF1CommandRequestMessage) InitializeParent(parent DF1RequestMessage, destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16) {
-	m.DestinationAddress = destinationAddress
+func (m *_DF1CommandRequestMessage) InitializeParent(parent DF1RequestMessage , destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 ) {	m.DestinationAddress = destinationAddress
 	m.SourceAddress = sourceAddress
 	m.Status = status
 	m.TransactionCounter = transactionCounter
 }
 
-func (m *_DF1CommandRequestMessage) GetParent() DF1RequestMessage {
+func (m *_DF1CommandRequestMessage)  GetParent() DF1RequestMessage {
 	return m._DF1RequestMessage
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -87,11 +88,12 @@ func (m *_DF1CommandRequestMessage) GetCommand() DF1RequestCommand {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewDF1CommandRequestMessage factory function for _DF1CommandRequestMessage
-func NewDF1CommandRequestMessage(command DF1RequestCommand, destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16) *_DF1CommandRequestMessage {
+func NewDF1CommandRequestMessage( command DF1RequestCommand , destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 ) *_DF1CommandRequestMessage {
 	_result := &_DF1CommandRequestMessage{
-		Command:            command,
-		_DF1RequestMessage: NewDF1RequestMessage(destinationAddress, sourceAddress, status, transactionCounter),
+		Command: command,
+    	_DF1RequestMessage: NewDF1RequestMessage(destinationAddress, sourceAddress, status, transactionCounter),
 	}
 	_result._DF1RequestMessage._DF1RequestMessageChildRequirements = _result
 	return _result
@@ -99,7 +101,7 @@ func NewDF1CommandRequestMessage(command DF1RequestCommand, destinationAddress u
 
 // Deprecated: use the interface for direct cast
 func CastDF1CommandRequestMessage(structType interface{}) DF1CommandRequestMessage {
-	if casted, ok := structType.(DF1CommandRequestMessage); ok {
+    if casted, ok := structType.(DF1CommandRequestMessage); ok {
 		return casted
 	}
 	if casted, ok := structType.(*DF1CommandRequestMessage); ok {
@@ -125,6 +127,7 @@ func (m *_DF1CommandRequestMessage) GetLengthInBitsConditional(lastItem bool) ui
 	return lengthInBits
 }
 
+
 func (m *_DF1CommandRequestMessage) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -142,7 +145,7 @@ func DF1CommandRequestMessageParse(readBuffer utils.ReadBuffer) (DF1CommandReque
 	if pullErr := readBuffer.PullContext("command"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for command")
 	}
-	_command, _commandErr := DF1RequestCommandParse(readBuffer)
+_command, _commandErr := DF1RequestCommandParse(readBuffer)
 	if _commandErr != nil {
 		return nil, errors.Wrap(_commandErr, "Error parsing 'command' field of DF1CommandRequestMessage")
 	}
@@ -157,8 +160,9 @@ func DF1CommandRequestMessageParse(readBuffer utils.ReadBuffer) (DF1CommandReque
 
 	// Create a partially initialized instance
 	_child := &_DF1CommandRequestMessage{
-		_DF1RequestMessage: &_DF1RequestMessage{},
-		Command:            command,
+		_DF1RequestMessage: &_DF1RequestMessage{
+		},
+		Command: command,
 	}
 	_child._DF1RequestMessage._DF1RequestMessageChildRequirements = _child
 	return _child, nil
@@ -172,17 +176,17 @@ func (m *_DF1CommandRequestMessage) Serialize(writeBuffer utils.WriteBuffer) err
 			return errors.Wrap(pushErr, "Error pushing for DF1CommandRequestMessage")
 		}
 
-		// Simple Field (command)
-		if pushErr := writeBuffer.PushContext("command"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for command")
-		}
-		_commandErr := writeBuffer.WriteSerializable(m.GetCommand())
-		if popErr := writeBuffer.PopContext("command"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for command")
-		}
-		if _commandErr != nil {
-			return errors.Wrap(_commandErr, "Error serializing 'command' field")
-		}
+	// Simple Field (command)
+	if pushErr := writeBuffer.PushContext("command"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for command")
+	}
+	_commandErr := writeBuffer.WriteSerializable(m.GetCommand())
+	if popErr := writeBuffer.PopContext("command"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for command")
+	}
+	if _commandErr != nil {
+		return errors.Wrap(_commandErr, "Error serializing 'command' field")
+	}
 
 		if popErr := writeBuffer.PopContext("DF1CommandRequestMessage"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for DF1CommandRequestMessage")
@@ -192,6 +196,7 @@ func (m *_DF1CommandRequestMessage) Serialize(writeBuffer utils.WriteBuffer) err
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_DF1CommandRequestMessage) isDF1CommandRequestMessage() bool {
 	return true
 }
@@ -206,3 +211,6 @@ func (m *_DF1CommandRequestMessage) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go b/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go
index 6e8acbf7a..1456e6dc5 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // DF1CommandResponseMessageProtectedTypedLogicalRead is the corresponding interface of DF1CommandResponseMessageProtectedTypedLogicalRead
 type DF1CommandResponseMessageProtectedTypedLogicalRead interface {
@@ -45,34 +47,33 @@ type DF1CommandResponseMessageProtectedTypedLogicalReadExactly interface {
 // _DF1CommandResponseMessageProtectedTypedLogicalRead is the data-structure of this message
 type _DF1CommandResponseMessageProtectedTypedLogicalRead struct {
 	*_DF1ResponseMessage
-	Data []uint8
+        Data []uint8
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) GetCommandCode() uint8 {
-	return 0x4F
-}
+func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead)  GetCommandCode() uint8 {
+return 0x4F}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) InitializeParent(parent DF1ResponseMessage, destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16) {
-	m.DestinationAddress = destinationAddress
+func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) InitializeParent(parent DF1ResponseMessage , destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 ) {	m.DestinationAddress = destinationAddress
 	m.SourceAddress = sourceAddress
 	m.Status = status
 	m.TransactionCounter = transactionCounter
 }
 
-func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) GetParent() DF1ResponseMessage {
+func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead)  GetParent() DF1ResponseMessage {
 	return m._DF1ResponseMessage
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -87,11 +88,12 @@ func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) GetData() []uint8
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewDF1CommandResponseMessageProtectedTypedLogicalRead factory function for _DF1CommandResponseMessageProtectedTypedLogicalRead
-func NewDF1CommandResponseMessageProtectedTypedLogicalRead(data []uint8, destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16, payloadLength uint16) *_DF1CommandResponseMessageProtectedTypedLogicalRead {
+func NewDF1CommandResponseMessageProtectedTypedLogicalRead( data []uint8 , destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 , payloadLength uint16 ) *_DF1CommandResponseMessageProtectedTypedLogicalRead {
 	_result := &_DF1CommandResponseMessageProtectedTypedLogicalRead{
-		Data:                data,
-		_DF1ResponseMessage: NewDF1ResponseMessage(destinationAddress, sourceAddress, status, transactionCounter, payloadLength),
+		Data: data,
+    	_DF1ResponseMessage: NewDF1ResponseMessage(destinationAddress, sourceAddress, status, transactionCounter, payloadLength),
 	}
 	_result._DF1ResponseMessage._DF1ResponseMessageChildRequirements = _result
 	return _result
@@ -99,7 +101,7 @@ func NewDF1CommandResponseMessageProtectedTypedLogicalRead(data []uint8, destina
 
 // Deprecated: use the interface for direct cast
 func CastDF1CommandResponseMessageProtectedTypedLogicalRead(structType interface{}) DF1CommandResponseMessageProtectedTypedLogicalRead {
-	if casted, ok := structType.(DF1CommandResponseMessageProtectedTypedLogicalRead); ok {
+    if casted, ok := structType.(DF1CommandResponseMessageProtectedTypedLogicalRead); ok {
 		return casted
 	}
 	if casted, ok := structType.(*DF1CommandResponseMessageProtectedTypedLogicalRead); ok {
@@ -127,6 +129,7 @@ func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) GetLengthInBitsCon
 	return lengthInBits
 }
 
+
 func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -149,8 +152,8 @@ func DF1CommandResponseMessageProtectedTypedLogicalReadParse(readBuffer utils.Re
 	{
 		_dataLength := uint16(payloadLength) - uint16(uint16(8))
 		_dataEndPos := positionAware.GetPos() + uint16(_dataLength)
-		for positionAware.GetPos() < _dataEndPos {
-			_item, _err := readBuffer.ReadUint8("", 8)
+		for ;positionAware.GetPos() < _dataEndPos; {
+_item, _err := readBuffer.ReadUint8("", 8)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'data' field of DF1CommandResponseMessageProtectedTypedLogicalRead")
 			}
@@ -184,19 +187,19 @@ func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) Serialize(writeBuf
 			return errors.Wrap(pushErr, "Error pushing for DF1CommandResponseMessageProtectedTypedLogicalRead")
 		}
 
-		// Array Field (data)
-		if pushErr := writeBuffer.PushContext("data", utils.WithRenderAsList(true)); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for data")
-		}
-		for _, _element := range m.GetData() {
-			_elementErr := writeBuffer.WriteUint8("", 8, _element)
-			if _elementErr != nil {
-				return errors.Wrap(_elementErr, "Error serializing 'data' field")
-			}
-		}
-		if popErr := writeBuffer.PopContext("data", utils.WithRenderAsList(true)); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for data")
+	// Array Field (data)
+	if pushErr := writeBuffer.PushContext("data", utils.WithRenderAsList(true)); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for data")
+	}
+	for _, _element := range m.GetData() {
+		_elementErr := writeBuffer.WriteUint8("", 8, _element)
+		if _elementErr != nil {
+			return errors.Wrap(_elementErr, "Error serializing 'data' field")
 		}
+	}
+	if popErr := writeBuffer.PopContext("data", utils.WithRenderAsList(true)); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for data")
+	}
 
 		if popErr := writeBuffer.PopContext("DF1CommandResponseMessageProtectedTypedLogicalRead"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for DF1CommandResponseMessageProtectedTypedLogicalRead")
@@ -206,6 +209,7 @@ func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) Serialize(writeBuf
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) isDF1CommandResponseMessageProtectedTypedLogicalRead() bool {
 	return true
 }
@@ -220,3 +224,6 @@ func (m *_DF1CommandResponseMessageProtectedTypedLogicalRead) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go b/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go
index a7b79c240..dbbb3098e 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // DF1RequestCommand is the corresponding interface of DF1RequestCommand
 type DF1RequestCommand interface {
@@ -53,6 +55,7 @@ type _DF1RequestCommandChildRequirements interface {
 	GetFunctionCode() uint8
 }
 
+
 type DF1RequestCommandParent interface {
 	SerializeParent(writeBuffer utils.WriteBuffer, child DF1RequestCommand, serializeChildFunction func() error) error
 	GetTypeName() string
@@ -60,21 +63,22 @@ type DF1RequestCommandParent interface {
 
 type DF1RequestCommandChild interface {
 	utils.Serializable
-	InitializeParent(parent DF1RequestCommand)
+InitializeParent(parent DF1RequestCommand )
 	GetParent() *DF1RequestCommand
 
 	GetTypeName() string
 	DF1RequestCommand
 }
 
+
 // NewDF1RequestCommand factory function for _DF1RequestCommand
-func NewDF1RequestCommand() *_DF1RequestCommand {
-	return &_DF1RequestCommand{}
+func NewDF1RequestCommand( ) *_DF1RequestCommand {
+return &_DF1RequestCommand{ }
 }
 
 // Deprecated: use the interface for direct cast
 func CastDF1RequestCommand(structType interface{}) DF1RequestCommand {
-	if casted, ok := structType.(DF1RequestCommand); ok {
+    if casted, ok := structType.(DF1RequestCommand); ok {
 		return casted
 	}
 	if casted, ok := structType.(*DF1RequestCommand); ok {
@@ -87,10 +91,12 @@ func (m *_DF1RequestCommand) GetTypeName() string {
 	return "DF1RequestCommand"
 }
 
+
+
 func (m *_DF1RequestCommand) GetParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
 	// Discriminator Field (functionCode)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	return lengthInBits
 }
@@ -117,15 +123,15 @@ func DF1RequestCommandParse(readBuffer utils.ReadBuffer) (DF1RequestCommand, err
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type DF1RequestCommandChildSerializeRequirement interface {
 		DF1RequestCommand
-		InitializeParent(DF1RequestCommand)
+		InitializeParent(DF1RequestCommand )
 		GetParent() DF1RequestCommand
 	}
 	var _childTemp interface{}
 	var _child DF1RequestCommandChildSerializeRequirement
 	var typeSwitchError error
 	switch {
-	case functionCode == 0xA2: // DF1RequestProtectedTypedLogicalRead
-		_childTemp, typeSwitchError = DF1RequestProtectedTypedLogicalReadParse(readBuffer)
+case functionCode == 0xA2 : // DF1RequestProtectedTypedLogicalRead
+		_childTemp, typeSwitchError = DF1RequestProtectedTypedLogicalReadParse(readBuffer, )
 	default:
 		typeSwitchError = errors.Errorf("Unmapped type for parameters [functionCode=%v]", functionCode)
 	}
@@ -139,7 +145,7 @@ func DF1RequestCommandParse(readBuffer utils.ReadBuffer) (DF1RequestCommand, err
 	}
 
 	// Finish initializing
-	_child.InitializeParent(_child)
+_child.InitializeParent(_child )
 	return _child, nil
 }
 
@@ -149,7 +155,7 @@ func (pm *_DF1RequestCommand) SerializeParent(writeBuffer utils.WriteBuffer, chi
 	_ = m
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("DF1RequestCommand"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("DF1RequestCommand"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for DF1RequestCommand")
 	}
 
@@ -172,6 +178,7 @@ func (pm *_DF1RequestCommand) SerializeParent(writeBuffer utils.WriteBuffer, chi
 	return nil
 }
 
+
 func (m *_DF1RequestCommand) isDF1RequestCommand() bool {
 	return true
 }
@@ -186,3 +193,6 @@ func (m *_DF1RequestCommand) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go b/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go
index b06b7bd87..745ad90bb 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go
@@ -19,13 +19,15 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // DF1RequestMessage is the corresponding interface of DF1RequestMessage
 type DF1RequestMessage interface {
@@ -53,10 +55,10 @@ type DF1RequestMessageExactly interface {
 // _DF1RequestMessage is the data-structure of this message
 type _DF1RequestMessage struct {
 	_DF1RequestMessageChildRequirements
-	DestinationAddress uint8
-	SourceAddress      uint8
-	Status             uint8
-	TransactionCounter uint16
+        DestinationAddress uint8
+        SourceAddress uint8
+        Status uint8
+        TransactionCounter uint16
 	// Reserved Fields
 	reservedField0 *uint16
 }
@@ -68,6 +70,7 @@ type _DF1RequestMessageChildRequirements interface {
 	GetCommandCode() uint8
 }
 
+
 type DF1RequestMessageParent interface {
 	SerializeParent(writeBuffer utils.WriteBuffer, child DF1RequestMessage, serializeChildFunction func() error) error
 	GetTypeName() string
@@ -75,13 +78,12 @@ type DF1RequestMessageParent interface {
 
 type DF1RequestMessageChild interface {
 	utils.Serializable
-	InitializeParent(parent DF1RequestMessage, destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16)
+InitializeParent(parent DF1RequestMessage , destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 )
 	GetParent() *DF1RequestMessage
 
 	GetTypeName() string
 	DF1RequestMessage
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -108,14 +110,15 @@ func (m *_DF1RequestMessage) GetTransactionCounter() uint16 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewDF1RequestMessage factory function for _DF1RequestMessage
-func NewDF1RequestMessage(destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16) *_DF1RequestMessage {
-	return &_DF1RequestMessage{DestinationAddress: destinationAddress, SourceAddress: sourceAddress, Status: status, TransactionCounter: transactionCounter}
+func NewDF1RequestMessage( destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 ) *_DF1RequestMessage {
+return &_DF1RequestMessage{ DestinationAddress: destinationAddress , SourceAddress: sourceAddress , Status: status , TransactionCounter: transactionCounter }
 }
 
 // Deprecated: use the interface for direct cast
 func CastDF1RequestMessage(structType interface{}) DF1RequestMessage {
-	if casted, ok := structType.(DF1RequestMessage); ok {
+    if casted, ok := structType.(DF1RequestMessage); ok {
 		return casted
 	}
 	if casted, ok := structType.(*DF1RequestMessage); ok {
@@ -128,25 +131,27 @@ func (m *_DF1RequestMessage) GetTypeName() string {
 	return "DF1RequestMessage"
 }
 
+
+
 func (m *_DF1RequestMessage) GetParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
 
 	// Simple field (destinationAddress)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (sourceAddress)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Reserved Field (reserved)
 	lengthInBits += 16
 	// Discriminator Field (commandCode)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (status)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (transactionCounter)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	return lengthInBits
 }
@@ -165,14 +170,14 @@ func DF1RequestMessageParse(readBuffer utils.ReadBuffer) (DF1RequestMessage, err
 	_ = currentPos
 
 	// Simple Field (destinationAddress)
-	_destinationAddress, _destinationAddressErr := readBuffer.ReadUint8("destinationAddress", 8)
+_destinationAddress, _destinationAddressErr := readBuffer.ReadUint8("destinationAddress", 8)
 	if _destinationAddressErr != nil {
 		return nil, errors.Wrap(_destinationAddressErr, "Error parsing 'destinationAddress' field of DF1RequestMessage")
 	}
 	destinationAddress := _destinationAddress
 
 	// Simple Field (sourceAddress)
-	_sourceAddress, _sourceAddressErr := readBuffer.ReadUint8("sourceAddress", 8)
+_sourceAddress, _sourceAddressErr := readBuffer.ReadUint8("sourceAddress", 8)
 	if _sourceAddressErr != nil {
 		return nil, errors.Wrap(_sourceAddressErr, "Error parsing 'sourceAddress' field of DF1RequestMessage")
 	}
@@ -188,7 +193,7 @@ func DF1RequestMessageParse(readBuffer utils.ReadBuffer) (DF1RequestMessage, err
 		if reserved != uint16(0x0000) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint16(0x0000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField0 = &reserved
@@ -202,14 +207,14 @@ func DF1RequestMessageParse(readBuffer utils.ReadBuffer) (DF1RequestMessage, err
 	}
 
 	// Simple Field (status)
-	_status, _statusErr := readBuffer.ReadUint8("status", 8)
+_status, _statusErr := readBuffer.ReadUint8("status", 8)
 	if _statusErr != nil {
 		return nil, errors.Wrap(_statusErr, "Error parsing 'status' field of DF1RequestMessage")
 	}
 	status := _status
 
 	// Simple Field (transactionCounter)
-	_transactionCounter, _transactionCounterErr := readBuffer.ReadUint16("transactionCounter", 16)
+_transactionCounter, _transactionCounterErr := readBuffer.ReadUint16("transactionCounter", 16)
 	if _transactionCounterErr != nil {
 		return nil, errors.Wrap(_transactionCounterErr, "Error parsing 'transactionCounter' field of DF1RequestMessage")
 	}
@@ -218,15 +223,15 @@ func DF1RequestMessageParse(readBuffer utils.ReadBuffer) (DF1RequestMessage, err
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type DF1RequestMessageChildSerializeRequirement interface {
 		DF1RequestMessage
-		InitializeParent(DF1RequestMessage, uint8, uint8, uint8, uint16)
+		InitializeParent(DF1RequestMessage,  uint8, uint8, uint8, uint16)
 		GetParent() DF1RequestMessage
 	}
 	var _childTemp interface{}
 	var _child DF1RequestMessageChildSerializeRequirement
 	var typeSwitchError error
 	switch {
-	case commandCode == 0x0F: // DF1CommandRequestMessage
-		_childTemp, typeSwitchError = DF1CommandRequestMessageParse(readBuffer)
+case commandCode == 0x0F : // DF1CommandRequestMessage
+		_childTemp, typeSwitchError = DF1CommandRequestMessageParse(readBuffer, )
 	default:
 		typeSwitchError = errors.Errorf("Unmapped type for parameters [commandCode=%v]", commandCode)
 	}
@@ -240,7 +245,7 @@ func DF1RequestMessageParse(readBuffer utils.ReadBuffer) (DF1RequestMessage, err
 	}
 
 	// Finish initializing
-	_child.InitializeParent(_child, destinationAddress, sourceAddress, status, transactionCounter)
+_child.InitializeParent(_child , destinationAddress , sourceAddress , status , transactionCounter )
 	_child.GetParent().(*_DF1RequestMessage).reservedField0 = reservedField0
 	return _child, nil
 }
@@ -251,7 +256,7 @@ func (pm *_DF1RequestMessage) SerializeParent(writeBuffer utils.WriteBuffer, chi
 	_ = m
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("DF1RequestMessage"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("DF1RequestMessage"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for DF1RequestMessage")
 	}
 
@@ -275,7 +280,7 @@ func (pm *_DF1RequestMessage) SerializeParent(writeBuffer utils.WriteBuffer, chi
 		if pm.reservedField0 != nil {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint16(0x0000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Overriding reserved field with unexpected value.")
 			reserved = *pm.reservedField0
 		}
@@ -318,6 +323,7 @@ func (pm *_DF1RequestMessage) SerializeParent(writeBuffer utils.WriteBuffer, chi
 	return nil
 }
 
+
 func (m *_DF1RequestMessage) isDF1RequestMessage() bool {
 	return true
 }
@@ -332,3 +338,6 @@ func (m *_DF1RequestMessage) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go b/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go
index 02833b25d..7982dfa22 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // DF1RequestProtectedTypedLogicalRead is the corresponding interface of DF1RequestProtectedTypedLogicalRead
 type DF1RequestProtectedTypedLogicalRead interface {
@@ -53,33 +55,33 @@ type DF1RequestProtectedTypedLogicalReadExactly interface {
 // _DF1RequestProtectedTypedLogicalRead is the data-structure of this message
 type _DF1RequestProtectedTypedLogicalRead struct {
 	*_DF1RequestCommand
-	ByteSize         uint8
-	FileNumber       uint8
-	FileType         uint8
-	ElementNumber    uint8
-	SubElementNumber uint8
+        ByteSize uint8
+        FileNumber uint8
+        FileType uint8
+        ElementNumber uint8
+        SubElementNumber uint8
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_DF1RequestProtectedTypedLogicalRead) GetFunctionCode() uint8 {
-	return 0xA2
-}
+func (m *_DF1RequestProtectedTypedLogicalRead)  GetFunctionCode() uint8 {
+return 0xA2}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_DF1RequestProtectedTypedLogicalRead) InitializeParent(parent DF1RequestCommand) {}
+func (m *_DF1RequestProtectedTypedLogicalRead) InitializeParent(parent DF1RequestCommand ) {}
 
-func (m *_DF1RequestProtectedTypedLogicalRead) GetParent() DF1RequestCommand {
+func (m *_DF1RequestProtectedTypedLogicalRead)  GetParent() DF1RequestCommand {
 	return m._DF1RequestCommand
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -110,15 +112,16 @@ func (m *_DF1RequestProtectedTypedLogicalRead) GetSubElementNumber() uint8 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewDF1RequestProtectedTypedLogicalRead factory function for _DF1RequestProtectedTypedLogicalRead
-func NewDF1RequestProtectedTypedLogicalRead(byteSize uint8, fileNumber uint8, fileType uint8, elementNumber uint8, subElementNumber uint8) *_DF1RequestProtectedTypedLogicalRead {
+func NewDF1RequestProtectedTypedLogicalRead( byteSize uint8 , fileNumber uint8 , fileType uint8 , elementNumber uint8 , subElementNumber uint8 ) *_DF1RequestProtectedTypedLogicalRead {
 	_result := &_DF1RequestProtectedTypedLogicalRead{
-		ByteSize:           byteSize,
-		FileNumber:         fileNumber,
-		FileType:           fileType,
-		ElementNumber:      elementNumber,
-		SubElementNumber:   subElementNumber,
-		_DF1RequestCommand: NewDF1RequestCommand(),
+		ByteSize: byteSize,
+		FileNumber: fileNumber,
+		FileType: fileType,
+		ElementNumber: elementNumber,
+		SubElementNumber: subElementNumber,
+    	_DF1RequestCommand: NewDF1RequestCommand(),
 	}
 	_result._DF1RequestCommand._DF1RequestCommandChildRequirements = _result
 	return _result
@@ -126,7 +129,7 @@ func NewDF1RequestProtectedTypedLogicalRead(byteSize uint8, fileNumber uint8, fi
 
 // Deprecated: use the interface for direct cast
 func CastDF1RequestProtectedTypedLogicalRead(structType interface{}) DF1RequestProtectedTypedLogicalRead {
-	if casted, ok := structType.(DF1RequestProtectedTypedLogicalRead); ok {
+    if casted, ok := structType.(DF1RequestProtectedTypedLogicalRead); ok {
 		return casted
 	}
 	if casted, ok := structType.(*DF1RequestProtectedTypedLogicalRead); ok {
@@ -147,23 +150,24 @@ func (m *_DF1RequestProtectedTypedLogicalRead) GetLengthInBitsConditional(lastIt
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (byteSize)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (fileNumber)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (fileType)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (elementNumber)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (subElementNumber)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	return lengthInBits
 }
 
+
 func (m *_DF1RequestProtectedTypedLogicalRead) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -178,35 +182,35 @@ func DF1RequestProtectedTypedLogicalReadParse(readBuffer utils.ReadBuffer) (DF1R
 	_ = currentPos
 
 	// Simple Field (byteSize)
-	_byteSize, _byteSizeErr := readBuffer.ReadUint8("byteSize", 8)
+_byteSize, _byteSizeErr := readBuffer.ReadUint8("byteSize", 8)
 	if _byteSizeErr != nil {
 		return nil, errors.Wrap(_byteSizeErr, "Error parsing 'byteSize' field of DF1RequestProtectedTypedLogicalRead")
 	}
 	byteSize := _byteSize
 
 	// Simple Field (fileNumber)
-	_fileNumber, _fileNumberErr := readBuffer.ReadUint8("fileNumber", 8)
+_fileNumber, _fileNumberErr := readBuffer.ReadUint8("fileNumber", 8)
 	if _fileNumberErr != nil {
 		return nil, errors.Wrap(_fileNumberErr, "Error parsing 'fileNumber' field of DF1RequestProtectedTypedLogicalRead")
 	}
 	fileNumber := _fileNumber
 
 	// Simple Field (fileType)
-	_fileType, _fileTypeErr := readBuffer.ReadUint8("fileType", 8)
+_fileType, _fileTypeErr := readBuffer.ReadUint8("fileType", 8)
 	if _fileTypeErr != nil {
 		return nil, errors.Wrap(_fileTypeErr, "Error parsing 'fileType' field of DF1RequestProtectedTypedLogicalRead")
 	}
 	fileType := _fileType
 
 	// Simple Field (elementNumber)
-	_elementNumber, _elementNumberErr := readBuffer.ReadUint8("elementNumber", 8)
+_elementNumber, _elementNumberErr := readBuffer.ReadUint8("elementNumber", 8)
 	if _elementNumberErr != nil {
 		return nil, errors.Wrap(_elementNumberErr, "Error parsing 'elementNumber' field of DF1RequestProtectedTypedLogicalRead")
 	}
 	elementNumber := _elementNumber
 
 	// Simple Field (subElementNumber)
-	_subElementNumber, _subElementNumberErr := readBuffer.ReadUint8("subElementNumber", 8)
+_subElementNumber, _subElementNumberErr := readBuffer.ReadUint8("subElementNumber", 8)
 	if _subElementNumberErr != nil {
 		return nil, errors.Wrap(_subElementNumberErr, "Error parsing 'subElementNumber' field of DF1RequestProtectedTypedLogicalRead")
 	}
@@ -218,12 +222,13 @@ func DF1RequestProtectedTypedLogicalReadParse(readBuffer utils.ReadBuffer) (DF1R
 
 	// Create a partially initialized instance
 	_child := &_DF1RequestProtectedTypedLogicalRead{
-		_DF1RequestCommand: &_DF1RequestCommand{},
-		ByteSize:           byteSize,
-		FileNumber:         fileNumber,
-		FileType:           fileType,
-		ElementNumber:      elementNumber,
-		SubElementNumber:   subElementNumber,
+		_DF1RequestCommand: &_DF1RequestCommand{
+		},
+		ByteSize: byteSize,
+		FileNumber: fileNumber,
+		FileType: fileType,
+		ElementNumber: elementNumber,
+		SubElementNumber: subElementNumber,
 	}
 	_child._DF1RequestCommand._DF1RequestCommandChildRequirements = _child
 	return _child, nil
@@ -237,40 +242,40 @@ func (m *_DF1RequestProtectedTypedLogicalRead) Serialize(writeBuffer utils.Write
 			return errors.Wrap(pushErr, "Error pushing for DF1RequestProtectedTypedLogicalRead")
 		}
 
-		// Simple Field (byteSize)
-		byteSize := uint8(m.GetByteSize())
-		_byteSizeErr := writeBuffer.WriteUint8("byteSize", 8, (byteSize))
-		if _byteSizeErr != nil {
-			return errors.Wrap(_byteSizeErr, "Error serializing 'byteSize' field")
-		}
+	// Simple Field (byteSize)
+	byteSize := uint8(m.GetByteSize())
+	_byteSizeErr := writeBuffer.WriteUint8("byteSize", 8, (byteSize))
+	if _byteSizeErr != nil {
+		return errors.Wrap(_byteSizeErr, "Error serializing 'byteSize' field")
+	}
 
-		// Simple Field (fileNumber)
-		fileNumber := uint8(m.GetFileNumber())
-		_fileNumberErr := writeBuffer.WriteUint8("fileNumber", 8, (fileNumber))
-		if _fileNumberErr != nil {
-			return errors.Wrap(_fileNumberErr, "Error serializing 'fileNumber' field")
-		}
+	// Simple Field (fileNumber)
+	fileNumber := uint8(m.GetFileNumber())
+	_fileNumberErr := writeBuffer.WriteUint8("fileNumber", 8, (fileNumber))
+	if _fileNumberErr != nil {
+		return errors.Wrap(_fileNumberErr, "Error serializing 'fileNumber' field")
+	}
 
-		// Simple Field (fileType)
-		fileType := uint8(m.GetFileType())
-		_fileTypeErr := writeBuffer.WriteUint8("fileType", 8, (fileType))
-		if _fileTypeErr != nil {
-			return errors.Wrap(_fileTypeErr, "Error serializing 'fileType' field")
-		}
+	// Simple Field (fileType)
+	fileType := uint8(m.GetFileType())
+	_fileTypeErr := writeBuffer.WriteUint8("fileType", 8, (fileType))
+	if _fileTypeErr != nil {
+		return errors.Wrap(_fileTypeErr, "Error serializing 'fileType' field")
+	}
 
-		// Simple Field (elementNumber)
-		elementNumber := uint8(m.GetElementNumber())
-		_elementNumberErr := writeBuffer.WriteUint8("elementNumber", 8, (elementNumber))
-		if _elementNumberErr != nil {
-			return errors.Wrap(_elementNumberErr, "Error serializing 'elementNumber' field")
-		}
+	// Simple Field (elementNumber)
+	elementNumber := uint8(m.GetElementNumber())
+	_elementNumberErr := writeBuffer.WriteUint8("elementNumber", 8, (elementNumber))
+	if _elementNumberErr != nil {
+		return errors.Wrap(_elementNumberErr, "Error serializing 'elementNumber' field")
+	}
 
-		// Simple Field (subElementNumber)
-		subElementNumber := uint8(m.GetSubElementNumber())
-		_subElementNumberErr := writeBuffer.WriteUint8("subElementNumber", 8, (subElementNumber))
-		if _subElementNumberErr != nil {
-			return errors.Wrap(_subElementNumberErr, "Error serializing 'subElementNumber' field")
-		}
+	// Simple Field (subElementNumber)
+	subElementNumber := uint8(m.GetSubElementNumber())
+	_subElementNumberErr := writeBuffer.WriteUint8("subElementNumber", 8, (subElementNumber))
+	if _subElementNumberErr != nil {
+		return errors.Wrap(_subElementNumberErr, "Error serializing 'subElementNumber' field")
+	}
 
 		if popErr := writeBuffer.PopContext("DF1RequestProtectedTypedLogicalRead"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for DF1RequestProtectedTypedLogicalRead")
@@ -280,6 +285,7 @@ func (m *_DF1RequestProtectedTypedLogicalRead) Serialize(writeBuffer utils.Write
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_DF1RequestProtectedTypedLogicalRead) isDF1RequestProtectedTypedLogicalRead() bool {
 	return true
 }
@@ -294,3 +300,6 @@ func (m *_DF1RequestProtectedTypedLogicalRead) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go b/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go
index 7e873102b..f2487bdae 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go
@@ -19,13 +19,15 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // DF1ResponseMessage is the corresponding interface of DF1ResponseMessage
 type DF1ResponseMessage interface {
@@ -53,10 +55,10 @@ type DF1ResponseMessageExactly interface {
 // _DF1ResponseMessage is the data-structure of this message
 type _DF1ResponseMessage struct {
 	_DF1ResponseMessageChildRequirements
-	DestinationAddress uint8
-	SourceAddress      uint8
-	Status             uint8
-	TransactionCounter uint16
+        DestinationAddress uint8
+        SourceAddress uint8
+        Status uint8
+        TransactionCounter uint16
 
 	// Arguments.
 	PayloadLength uint16
@@ -72,6 +74,7 @@ type _DF1ResponseMessageChildRequirements interface {
 	GetCommandCode() uint8
 }
 
+
 type DF1ResponseMessageParent interface {
 	SerializeParent(writeBuffer utils.WriteBuffer, child DF1ResponseMessage, serializeChildFunction func() error) error
 	GetTypeName() string
@@ -79,13 +82,12 @@ type DF1ResponseMessageParent interface {
 
 type DF1ResponseMessageChild interface {
 	utils.Serializable
-	InitializeParent(parent DF1ResponseMessage, destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16)
+InitializeParent(parent DF1ResponseMessage , destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 )
 	GetParent() *DF1ResponseMessage
 
 	GetTypeName() string
 	DF1ResponseMessage
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -112,14 +114,15 @@ func (m *_DF1ResponseMessage) GetTransactionCounter() uint16 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewDF1ResponseMessage factory function for _DF1ResponseMessage
-func NewDF1ResponseMessage(destinationAddress uint8, sourceAddress uint8, status uint8, transactionCounter uint16, payloadLength uint16) *_DF1ResponseMessage {
-	return &_DF1ResponseMessage{DestinationAddress: destinationAddress, SourceAddress: sourceAddress, Status: status, TransactionCounter: transactionCounter, PayloadLength: payloadLength}
+func NewDF1ResponseMessage( destinationAddress uint8 , sourceAddress uint8 , status uint8 , transactionCounter uint16 , payloadLength uint16 ) *_DF1ResponseMessage {
+return &_DF1ResponseMessage{ DestinationAddress: destinationAddress , SourceAddress: sourceAddress , Status: status , TransactionCounter: transactionCounter , PayloadLength: payloadLength }
 }
 
 // Deprecated: use the interface for direct cast
 func CastDF1ResponseMessage(structType interface{}) DF1ResponseMessage {
-	if casted, ok := structType.(DF1ResponseMessage); ok {
+    if casted, ok := structType.(DF1ResponseMessage); ok {
 		return casted
 	}
 	if casted, ok := structType.(*DF1ResponseMessage); ok {
@@ -132,6 +135,8 @@ func (m *_DF1ResponseMessage) GetTypeName() string {
 	return "DF1ResponseMessage"
 }
 
+
+
 func (m *_DF1ResponseMessage) GetParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
 
@@ -139,21 +144,21 @@ func (m *_DF1ResponseMessage) GetParentLengthInBits() uint16 {
 	lengthInBits += 8
 
 	// Simple field (destinationAddress)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (sourceAddress)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Reserved Field (reserved)
 	lengthInBits += 8
 	// Discriminator Field (commandCode)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (status)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (transactionCounter)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	return lengthInBits
 }
@@ -181,7 +186,7 @@ func DF1ResponseMessageParse(readBuffer utils.ReadBuffer, payloadLength uint16)
 		if reserved != uint8(0x00) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint8(0x00),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField0 = &reserved
@@ -189,14 +194,14 @@ func DF1ResponseMessageParse(readBuffer utils.ReadBuffer, payloadLength uint16)
 	}
 
 	// Simple Field (destinationAddress)
-	_destinationAddress, _destinationAddressErr := readBuffer.ReadUint8("destinationAddress", 8)
+_destinationAddress, _destinationAddressErr := readBuffer.ReadUint8("destinationAddress", 8)
 	if _destinationAddressErr != nil {
 		return nil, errors.Wrap(_destinationAddressErr, "Error parsing 'destinationAddress' field of DF1ResponseMessage")
 	}
 	destinationAddress := _destinationAddress
 
 	// Simple Field (sourceAddress)
-	_sourceAddress, _sourceAddressErr := readBuffer.ReadUint8("sourceAddress", 8)
+_sourceAddress, _sourceAddressErr := readBuffer.ReadUint8("sourceAddress", 8)
 	if _sourceAddressErr != nil {
 		return nil, errors.Wrap(_sourceAddressErr, "Error parsing 'sourceAddress' field of DF1ResponseMessage")
 	}
@@ -212,7 +217,7 @@ func DF1ResponseMessageParse(readBuffer utils.ReadBuffer, payloadLength uint16)
 		if reserved != uint8(0x00) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint8(0x00),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField1 = &reserved
@@ -226,14 +231,14 @@ func DF1ResponseMessageParse(readBuffer utils.ReadBuffer, payloadLength uint16)
 	}
 
 	// Simple Field (status)
-	_status, _statusErr := readBuffer.ReadUint8("status", 8)
+_status, _statusErr := readBuffer.ReadUint8("status", 8)
 	if _statusErr != nil {
 		return nil, errors.Wrap(_statusErr, "Error parsing 'status' field of DF1ResponseMessage")
 	}
 	status := _status
 
 	// Simple Field (transactionCounter)
-	_transactionCounter, _transactionCounterErr := readBuffer.ReadUint16("transactionCounter", 16)
+_transactionCounter, _transactionCounterErr := readBuffer.ReadUint16("transactionCounter", 16)
 	if _transactionCounterErr != nil {
 		return nil, errors.Wrap(_transactionCounterErr, "Error parsing 'transactionCounter' field of DF1ResponseMessage")
 	}
@@ -242,14 +247,14 @@ func DF1ResponseMessageParse(readBuffer utils.ReadBuffer, payloadLength uint16)
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type DF1ResponseMessageChildSerializeRequirement interface {
 		DF1ResponseMessage
-		InitializeParent(DF1ResponseMessage, uint8, uint8, uint8, uint16)
+		InitializeParent(DF1ResponseMessage,  uint8, uint8, uint8, uint16)
 		GetParent() DF1ResponseMessage
 	}
 	var _childTemp interface{}
 	var _child DF1ResponseMessageChildSerializeRequirement
 	var typeSwitchError error
 	switch {
-	case commandCode == 0x4F: // DF1CommandResponseMessageProtectedTypedLogicalRead
+case commandCode == 0x4F : // DF1CommandResponseMessageProtectedTypedLogicalRead
 		_childTemp, typeSwitchError = DF1CommandResponseMessageProtectedTypedLogicalReadParse(readBuffer, payloadLength)
 	default:
 		typeSwitchError = errors.Errorf("Unmapped type for parameters [commandCode=%v]", commandCode)
@@ -264,7 +269,7 @@ func DF1ResponseMessageParse(readBuffer utils.ReadBuffer, payloadLength uint16)
 	}
 
 	// Finish initializing
-	_child.InitializeParent(_child, destinationAddress, sourceAddress, status, transactionCounter)
+_child.InitializeParent(_child , destinationAddress , sourceAddress , status , transactionCounter )
 	_child.GetParent().(*_DF1ResponseMessage).reservedField0 = reservedField0
 	_child.GetParent().(*_DF1ResponseMessage).reservedField1 = reservedField1
 	return _child, nil
@@ -276,7 +281,7 @@ func (pm *_DF1ResponseMessage) SerializeParent(writeBuffer utils.WriteBuffer, ch
 	_ = m
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("DF1ResponseMessage"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("DF1ResponseMessage"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for DF1ResponseMessage")
 	}
 
@@ -286,7 +291,7 @@ func (pm *_DF1ResponseMessage) SerializeParent(writeBuffer utils.WriteBuffer, ch
 		if pm.reservedField0 != nil {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint8(0x00),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Overriding reserved field with unexpected value.")
 			reserved = *pm.reservedField0
 		}
@@ -316,7 +321,7 @@ func (pm *_DF1ResponseMessage) SerializeParent(writeBuffer utils.WriteBuffer, ch
 		if pm.reservedField1 != nil {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint8(0x00),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Overriding reserved field with unexpected value.")
 			reserved = *pm.reservedField1
 		}
@@ -359,13 +364,13 @@ func (pm *_DF1ResponseMessage) SerializeParent(writeBuffer utils.WriteBuffer, ch
 	return nil
 }
 
+
 ////
 // Arguments Getter
 
 func (m *_DF1ResponseMessage) GetPayloadLength() uint16 {
 	return m.PayloadLength
 }
-
 //
 ////
 
@@ -383,3 +388,6 @@ func (m *_DF1ResponseMessage) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/ParserHelper.go b/plc4go/protocols/ads/readwrite/ParserHelper.go
index 86e18e668..c1854d46f 100644
--- a/plc4go/protocols/ads/readwrite/ParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/ParserHelper.go
@@ -20,8 +20,8 @@
 package readwrite
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/apache/plc4x/plc4go/protocols/ads/readwrite/model"
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
@@ -57,7 +57,7 @@ func (m AdsParserHelper) Parse(typeName string, arguments []string, io utils.Rea
 	case "AdsDataTypeArrayInfo":
 		return model.AdsDataTypeArrayInfoParse(io)
 	case "AdsData":
-		commandId, _ := model.CommandIdByName(arguments[0])
+        commandId, _ := model.CommandIdByName(arguments[0])
 		response, err := utils.StrToBool(arguments[1])
 		if err != nil {
 			return nil, errors.Wrap(err, "Error parsing")
diff --git a/plc4go/protocols/ads/readwrite/XmlParserHelper.go b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
index 780d1836b..9135b6601 100644
--- a/plc4go/protocols/ads/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
@@ -20,11 +20,11 @@
 package readwrite
 
 import (
-	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/apache/plc4x/plc4go/protocols/ads/readwrite/model"
+	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
-	"strconv"
-	"strings"
+    "strings"
+    "strconv"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
@@ -41,55 +41,55 @@ func init() {
 }
 
 func (m AdsXmlParserHelper) Parse(typeName string, xmlString string, parserArguments ...string) (interface{}, error) {
-	switch typeName {
-	case "AmsSerialFrame":
-		return model.AmsSerialFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "DataItem":
-		// TODO: find a way to parse the sub types
-		var dataFormatName string
-		parsedInt1, err := strconv.ParseInt(parserArguments[1], 10, 32)
-		if err != nil {
-			return nil, err
-		}
-		stringLength := int32(parsedInt1)
-		return model.DataItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), dataFormatName, stringLength)
-	case "AdsTableSizes":
-		return model.AdsTableSizesParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AdsMultiRequestItem":
-		parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 32)
-		if err != nil {
-			return nil, err
-		}
-		indexGroup := uint32(parsedUint0)
-		return model.AdsMultiRequestItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), indexGroup)
-	case "AmsSerialAcknowledgeFrame":
-		return model.AmsSerialAcknowledgeFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AdsDataTypeArrayInfo":
-		return model.AdsDataTypeArrayInfoParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AdsData":
-		commandId, _ := model.CommandIdByName(parserArguments[0])
-		response := parserArguments[1] == "true"
-		return model.AdsDataParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), commandId, response)
-	case "AdsDataTypeTableEntry":
-		return model.AdsDataTypeTableEntryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AmsNetId":
-		return model.AmsNetIdParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AdsStampHeader":
-		return model.AdsStampHeaderParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AmsSerialResetFrame":
-		return model.AmsSerialResetFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AdsConstants":
-		return model.AdsConstantsParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AdsNotificationSample":
-		return model.AdsNotificationSampleParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AdsSymbolTableEntry":
-		return model.AdsSymbolTableEntryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AmsTCPPacket":
-		return model.AmsTCPPacketParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "State":
-		return model.StateParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "AmsPacket":
-		return model.AmsPacketParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	}
-	return nil, errors.Errorf("Unsupported type %s", typeName)
+    switch typeName {
+        case "AmsSerialFrame":
+			return model.AmsSerialFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "DataItem":
+			// TODO: find a way to parse the sub types
+            var dataFormatName string
+            parsedInt1, err := strconv.ParseInt(parserArguments[1], 10, 32)
+            if err!=nil {
+                return nil, err
+            }
+            stringLength := int32(parsedInt1)
+            return model.DataItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), dataFormatName,  stringLength  )
+        case "AdsTableSizes":
+			return model.AdsTableSizesParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AdsMultiRequestItem":
+			parsedUint0, err := strconv.ParseUint(parserArguments[0], 10, 32)
+			if err!=nil {
+				return nil, err
+			}
+			indexGroup := uint32(parsedUint0)
+            return model.AdsMultiRequestItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), indexGroup  )
+        case "AmsSerialAcknowledgeFrame":
+			return model.AmsSerialAcknowledgeFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AdsDataTypeArrayInfo":
+			return model.AdsDataTypeArrayInfoParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AdsData":
+            commandId, _ := model.CommandIdByName(parserArguments[0])
+            response := parserArguments[1] == "true"
+            return model.AdsDataParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), commandId,  response  )
+        case "AdsDataTypeTableEntry":
+			return model.AdsDataTypeTableEntryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AmsNetId":
+			return model.AmsNetIdParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AdsStampHeader":
+			return model.AdsStampHeaderParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AmsSerialResetFrame":
+			return model.AmsSerialResetFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AdsConstants":
+			return model.AdsConstantsParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AdsNotificationSample":
+			return model.AdsNotificationSampleParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AdsSymbolTableEntry":
+			return model.AdsSymbolTableEntryParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AmsTCPPacket":
+			return model.AmsTCPPacketParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "State":
+			return model.StateParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+        case "AmsPacket":
+			return model.AmsPacketParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
+    }
+    return nil, errors.Errorf("Unsupported type %s", typeName)
 }
diff --git a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go
index c138738af..b6c5ba122 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go
@@ -19,13 +19,15 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsAddDeviceNotificationRequest is the corresponding interface of AdsAddDeviceNotificationRequest
 type AdsAddDeviceNotificationRequest interface {
@@ -56,41 +58,40 @@ type AdsAddDeviceNotificationRequestExactly interface {
 // _AdsAddDeviceNotificationRequest is the data-structure of this message
 type _AdsAddDeviceNotificationRequest struct {
 	*_AdsData
-	IndexGroup       uint32
-	IndexOffset      uint32
-	Length           uint32
-	TransmissionMode uint32
-	MaxDelay         uint32
-	CycleTime        uint32
+        IndexGroup uint32
+        IndexOffset uint32
+        Length uint32
+        TransmissionMode uint32
+        MaxDelay uint32
+        CycleTime uint32
 	// Reserved Fields
 	reservedField0 *uint64
 	reservedField1 *uint64
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsAddDeviceNotificationRequest) GetCommandId() CommandId {
-	return CommandId_ADS_ADD_DEVICE_NOTIFICATION
-}
+func (m *_AdsAddDeviceNotificationRequest)  GetCommandId() CommandId {
+return CommandId_ADS_ADD_DEVICE_NOTIFICATION}
 
-func (m *_AdsAddDeviceNotificationRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsAddDeviceNotificationRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsAddDeviceNotificationRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsAddDeviceNotificationRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsAddDeviceNotificationRequest) GetParent() AdsData {
+func (m *_AdsAddDeviceNotificationRequest)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -125,16 +126,17 @@ func (m *_AdsAddDeviceNotificationRequest) GetCycleTime() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsAddDeviceNotificationRequest factory function for _AdsAddDeviceNotificationRequest
-func NewAdsAddDeviceNotificationRequest(indexGroup uint32, indexOffset uint32, length uint32, transmissionMode uint32, maxDelay uint32, cycleTime uint32) *_AdsAddDeviceNotificationRequest {
+func NewAdsAddDeviceNotificationRequest( indexGroup uint32 , indexOffset uint32 , length uint32 , transmissionMode uint32 , maxDelay uint32 , cycleTime uint32 ) *_AdsAddDeviceNotificationRequest {
 	_result := &_AdsAddDeviceNotificationRequest{
-		IndexGroup:       indexGroup,
-		IndexOffset:      indexOffset,
-		Length:           length,
+		IndexGroup: indexGroup,
+		IndexOffset: indexOffset,
+		Length: length,
 		TransmissionMode: transmissionMode,
-		MaxDelay:         maxDelay,
-		CycleTime:        cycleTime,
-		_AdsData:         NewAdsData(),
+		MaxDelay: maxDelay,
+		CycleTime: cycleTime,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -142,7 +144,7 @@ func NewAdsAddDeviceNotificationRequest(indexGroup uint32, indexOffset uint32, l
 
 // Deprecated: use the interface for direct cast
 func CastAdsAddDeviceNotificationRequest(structType interface{}) AdsAddDeviceNotificationRequest {
-	if casted, ok := structType.(AdsAddDeviceNotificationRequest); ok {
+    if casted, ok := structType.(AdsAddDeviceNotificationRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsAddDeviceNotificationRequest); ok {
@@ -163,22 +165,22 @@ func (m *_AdsAddDeviceNotificationRequest) GetLengthInBitsConditional(lastItem b
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (indexGroup)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (indexOffset)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (length)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (transmissionMode)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (maxDelay)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (cycleTime)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Reserved Field (reserved)
 	lengthInBits += 64
@@ -189,6 +191,7 @@ func (m *_AdsAddDeviceNotificationRequest) GetLengthInBitsConditional(lastItem b
 	return lengthInBits
 }
 
+
 func (m *_AdsAddDeviceNotificationRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -203,42 +206,42 @@ func AdsAddDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, commandId
 	_ = currentPos
 
 	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
+_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
 	if _indexGroupErr != nil {
 		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsAddDeviceNotificationRequest")
 	}
 	indexGroup := _indexGroup
 
 	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
+_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
 	if _indexOffsetErr != nil {
 		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsAddDeviceNotificationRequest")
 	}
 	indexOffset := _indexOffset
 
 	// Simple Field (length)
-	_length, _lengthErr := readBuffer.ReadUint32("length", 32)
+_length, _lengthErr := readBuffer.ReadUint32("length", 32)
 	if _lengthErr != nil {
 		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsAddDeviceNotificationRequest")
 	}
 	length := _length
 
 	// Simple Field (transmissionMode)
-	_transmissionMode, _transmissionModeErr := readBuffer.ReadUint32("transmissionMode", 32)
+_transmissionMode, _transmissionModeErr := readBuffer.ReadUint32("transmissionMode", 32)
 	if _transmissionModeErr != nil {
 		return nil, errors.Wrap(_transmissionModeErr, "Error parsing 'transmissionMode' field of AdsAddDeviceNotificationRequest")
 	}
 	transmissionMode := _transmissionMode
 
 	// Simple Field (maxDelay)
-	_maxDelay, _maxDelayErr := readBuffer.ReadUint32("maxDelay", 32)
+_maxDelay, _maxDelayErr := readBuffer.ReadUint32("maxDelay", 32)
 	if _maxDelayErr != nil {
 		return nil, errors.Wrap(_maxDelayErr, "Error parsing 'maxDelay' field of AdsAddDeviceNotificationRequest")
 	}
 	maxDelay := _maxDelay
 
 	// Simple Field (cycleTime)
-	_cycleTime, _cycleTimeErr := readBuffer.ReadUint32("cycleTime", 32)
+_cycleTime, _cycleTimeErr := readBuffer.ReadUint32("cycleTime", 32)
 	if _cycleTimeErr != nil {
 		return nil, errors.Wrap(_cycleTimeErr, "Error parsing 'cycleTime' field of AdsAddDeviceNotificationRequest")
 	}
@@ -254,7 +257,7 @@ func AdsAddDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, commandId
 		if reserved != uint64(0x0000) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint64(0x0000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField0 = &reserved
@@ -271,7 +274,7 @@ func AdsAddDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, commandId
 		if reserved != uint64(0x0000) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint64(0x0000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField1 = &reserved
@@ -284,15 +287,16 @@ func AdsAddDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, commandId
 
 	// Create a partially initialized instance
 	_child := &_AdsAddDeviceNotificationRequest{
-		_AdsData:         &_AdsData{},
-		IndexGroup:       indexGroup,
-		IndexOffset:      indexOffset,
-		Length:           length,
+		_AdsData: &_AdsData{
+		},
+		IndexGroup: indexGroup,
+		IndexOffset: indexOffset,
+		Length: length,
 		TransmissionMode: transmissionMode,
-		MaxDelay:         maxDelay,
-		CycleTime:        cycleTime,
-		reservedField0:   reservedField0,
-		reservedField1:   reservedField1,
+		MaxDelay: maxDelay,
+		CycleTime: cycleTime,
+		reservedField0: reservedField0,
+		reservedField1: reservedField1,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -306,79 +310,79 @@ func (m *_AdsAddDeviceNotificationRequest) Serialize(writeBuffer utils.WriteBuff
 			return errors.Wrap(pushErr, "Error pushing for AdsAddDeviceNotificationRequest")
 		}
 
-		// Simple Field (indexGroup)
-		indexGroup := uint32(m.GetIndexGroup())
-		_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
-		if _indexGroupErr != nil {
-			return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
-		}
+	// Simple Field (indexGroup)
+	indexGroup := uint32(m.GetIndexGroup())
+	_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
+	if _indexGroupErr != nil {
+		return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
+	}
 
-		// Simple Field (indexOffset)
-		indexOffset := uint32(m.GetIndexOffset())
-		_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
-		if _indexOffsetErr != nil {
-			return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
-		}
+	// Simple Field (indexOffset)
+	indexOffset := uint32(m.GetIndexOffset())
+	_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
+	if _indexOffsetErr != nil {
+		return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
+	}
 
-		// Simple Field (length)
-		length := uint32(m.GetLength())
-		_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
-		if _lengthErr != nil {
-			return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-		}
+	// Simple Field (length)
+	length := uint32(m.GetLength())
+	_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
+	if _lengthErr != nil {
+		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
+	}
 
-		// Simple Field (transmissionMode)
-		transmissionMode := uint32(m.GetTransmissionMode())
-		_transmissionModeErr := writeBuffer.WriteUint32("transmissionMode", 32, (transmissionMode))
-		if _transmissionModeErr != nil {
-			return errors.Wrap(_transmissionModeErr, "Error serializing 'transmissionMode' field")
-		}
+	// Simple Field (transmissionMode)
+	transmissionMode := uint32(m.GetTransmissionMode())
+	_transmissionModeErr := writeBuffer.WriteUint32("transmissionMode", 32, (transmissionMode))
+	if _transmissionModeErr != nil {
+		return errors.Wrap(_transmissionModeErr, "Error serializing 'transmissionMode' field")
+	}
 
-		// Simple Field (maxDelay)
-		maxDelay := uint32(m.GetMaxDelay())
-		_maxDelayErr := writeBuffer.WriteUint32("maxDelay", 32, (maxDelay))
-		if _maxDelayErr != nil {
-			return errors.Wrap(_maxDelayErr, "Error serializing 'maxDelay' field")
-		}
+	// Simple Field (maxDelay)
+	maxDelay := uint32(m.GetMaxDelay())
+	_maxDelayErr := writeBuffer.WriteUint32("maxDelay", 32, (maxDelay))
+	if _maxDelayErr != nil {
+		return errors.Wrap(_maxDelayErr, "Error serializing 'maxDelay' field")
+	}
 
-		// Simple Field (cycleTime)
-		cycleTime := uint32(m.GetCycleTime())
-		_cycleTimeErr := writeBuffer.WriteUint32("cycleTime", 32, (cycleTime))
-		if _cycleTimeErr != nil {
-			return errors.Wrap(_cycleTimeErr, "Error serializing 'cycleTime' field")
-		}
+	// Simple Field (cycleTime)
+	cycleTime := uint32(m.GetCycleTime())
+	_cycleTimeErr := writeBuffer.WriteUint32("cycleTime", 32, (cycleTime))
+	if _cycleTimeErr != nil {
+		return errors.Wrap(_cycleTimeErr, "Error serializing 'cycleTime' field")
+	}
 
-		// Reserved Field (reserved)
-		{
-			var reserved uint64 = uint64(0x0000)
-			if m.reservedField0 != nil {
-				log.Info().Fields(map[string]interface{}{
-					"expected value": uint64(0x0000),
-					"got value":      reserved,
-				}).Msg("Overriding reserved field with unexpected value.")
-				reserved = *m.reservedField0
-			}
-			_err := writeBuffer.WriteUint64("reserved", 64, reserved)
-			if _err != nil {
-				return errors.Wrap(_err, "Error serializing 'reserved' field")
-			}
+	// Reserved Field (reserved)
+	{
+		var reserved uint64 = uint64(0x0000)
+		if m.reservedField0 != nil {
+			log.Info().Fields(map[string]interface{}{
+				"expected value": uint64(0x0000),
+				"got value": reserved,
+			}).Msg("Overriding reserved field with unexpected value.")
+			reserved = *m.reservedField0
+		}
+		_err := writeBuffer.WriteUint64("reserved", 64, reserved)
+		if _err != nil {
+			return errors.Wrap(_err, "Error serializing 'reserved' field")
 		}
+	}
 
-		// Reserved Field (reserved)
-		{
-			var reserved uint64 = uint64(0x0000)
-			if m.reservedField1 != nil {
-				log.Info().Fields(map[string]interface{}{
-					"expected value": uint64(0x0000),
-					"got value":      reserved,
-				}).Msg("Overriding reserved field with unexpected value.")
-				reserved = *m.reservedField1
-			}
-			_err := writeBuffer.WriteUint64("reserved", 64, reserved)
-			if _err != nil {
-				return errors.Wrap(_err, "Error serializing 'reserved' field")
-			}
+	// Reserved Field (reserved)
+	{
+		var reserved uint64 = uint64(0x0000)
+		if m.reservedField1 != nil {
+			log.Info().Fields(map[string]interface{}{
+				"expected value": uint64(0x0000),
+				"got value": reserved,
+			}).Msg("Overriding reserved field with unexpected value.")
+			reserved = *m.reservedField1
+		}
+		_err := writeBuffer.WriteUint64("reserved", 64, reserved)
+		if _err != nil {
+			return errors.Wrap(_err, "Error serializing 'reserved' field")
 		}
+	}
 
 		if popErr := writeBuffer.PopContext("AdsAddDeviceNotificationRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsAddDeviceNotificationRequest")
@@ -388,6 +392,7 @@ func (m *_AdsAddDeviceNotificationRequest) Serialize(writeBuffer utils.WriteBuff
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsAddDeviceNotificationRequest) isAdsAddDeviceNotificationRequest() bool {
 	return true
 }
@@ -402,3 +407,6 @@ func (m *_AdsAddDeviceNotificationRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go
index 866577843..4d4479060 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsAddDeviceNotificationResponse is the corresponding interface of AdsAddDeviceNotificationResponse
 type AdsAddDeviceNotificationResponse interface {
@@ -47,34 +49,33 @@ type AdsAddDeviceNotificationResponseExactly interface {
 // _AdsAddDeviceNotificationResponse is the data-structure of this message
 type _AdsAddDeviceNotificationResponse struct {
 	*_AdsData
-	Result             ReturnCode
-	NotificationHandle uint32
+        Result ReturnCode
+        NotificationHandle uint32
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsAddDeviceNotificationResponse) GetCommandId() CommandId {
-	return CommandId_ADS_ADD_DEVICE_NOTIFICATION
-}
+func (m *_AdsAddDeviceNotificationResponse)  GetCommandId() CommandId {
+return CommandId_ADS_ADD_DEVICE_NOTIFICATION}
 
-func (m *_AdsAddDeviceNotificationResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsAddDeviceNotificationResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsAddDeviceNotificationResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsAddDeviceNotificationResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsAddDeviceNotificationResponse) GetParent() AdsData {
+func (m *_AdsAddDeviceNotificationResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -93,12 +94,13 @@ func (m *_AdsAddDeviceNotificationResponse) GetNotificationHandle() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsAddDeviceNotificationResponse factory function for _AdsAddDeviceNotificationResponse
-func NewAdsAddDeviceNotificationResponse(result ReturnCode, notificationHandle uint32) *_AdsAddDeviceNotificationResponse {
+func NewAdsAddDeviceNotificationResponse( result ReturnCode , notificationHandle uint32 ) *_AdsAddDeviceNotificationResponse {
 	_result := &_AdsAddDeviceNotificationResponse{
-		Result:             result,
+		Result: result,
 		NotificationHandle: notificationHandle,
-		_AdsData:           NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -106,7 +108,7 @@ func NewAdsAddDeviceNotificationResponse(result ReturnCode, notificationHandle u
 
 // Deprecated: use the interface for direct cast
 func CastAdsAddDeviceNotificationResponse(structType interface{}) AdsAddDeviceNotificationResponse {
-	if casted, ok := structType.(AdsAddDeviceNotificationResponse); ok {
+    if casted, ok := structType.(AdsAddDeviceNotificationResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsAddDeviceNotificationResponse); ok {
@@ -130,11 +132,12 @@ func (m *_AdsAddDeviceNotificationResponse) GetLengthInBitsConditional(lastItem
 	lengthInBits += 32
 
 	// Simple field (notificationHandle)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	return lengthInBits
 }
 
+
 func (m *_AdsAddDeviceNotificationResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -152,7 +155,7 @@ func AdsAddDeviceNotificationResponseParse(readBuffer utils.ReadBuffer, commandI
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsAddDeviceNotificationResponse")
 	}
@@ -162,7 +165,7 @@ func AdsAddDeviceNotificationResponseParse(readBuffer utils.ReadBuffer, commandI
 	}
 
 	// Simple Field (notificationHandle)
-	_notificationHandle, _notificationHandleErr := readBuffer.ReadUint32("notificationHandle", 32)
+_notificationHandle, _notificationHandleErr := readBuffer.ReadUint32("notificationHandle", 32)
 	if _notificationHandleErr != nil {
 		return nil, errors.Wrap(_notificationHandleErr, "Error parsing 'notificationHandle' field of AdsAddDeviceNotificationResponse")
 	}
@@ -174,8 +177,9 @@ func AdsAddDeviceNotificationResponseParse(readBuffer utils.ReadBuffer, commandI
 
 	// Create a partially initialized instance
 	_child := &_AdsAddDeviceNotificationResponse{
-		_AdsData:           &_AdsData{},
-		Result:             result,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
 		NotificationHandle: notificationHandle,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
@@ -190,24 +194,24 @@ func (m *_AdsAddDeviceNotificationResponse) Serialize(writeBuffer utils.WriteBuf
 			return errors.Wrap(pushErr, "Error pushing for AdsAddDeviceNotificationResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
-		// Simple Field (notificationHandle)
-		notificationHandle := uint32(m.GetNotificationHandle())
-		_notificationHandleErr := writeBuffer.WriteUint32("notificationHandle", 32, (notificationHandle))
-		if _notificationHandleErr != nil {
-			return errors.Wrap(_notificationHandleErr, "Error serializing 'notificationHandle' field")
-		}
+	// Simple Field (notificationHandle)
+	notificationHandle := uint32(m.GetNotificationHandle())
+	_notificationHandleErr := writeBuffer.WriteUint32("notificationHandle", 32, (notificationHandle))
+	if _notificationHandleErr != nil {
+		return errors.Wrap(_notificationHandleErr, "Error serializing 'notificationHandle' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsAddDeviceNotificationResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsAddDeviceNotificationResponse")
@@ -217,6 +221,7 @@ func (m *_AdsAddDeviceNotificationResponse) Serialize(writeBuffer utils.WriteBuf
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsAddDeviceNotificationResponse) isAdsAddDeviceNotificationResponse() bool {
 	return true
 }
@@ -231,3 +236,6 @@ func (m *_AdsAddDeviceNotificationResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsConstants.go b/plc4go/protocols/ads/readwrite/model/AdsConstants.go
index ca7d6bd7c..2962f5362 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsConstants.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsConstants.go
@@ -19,13 +19,15 @@
 
 package model
 
+
 import (
 	"fmt"
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // Constant values.
 const AdsConstants_ADSTCPDEFAULTPORT uint16 = uint16(48898)
@@ -47,6 +49,7 @@ type AdsConstantsExactly interface {
 type _AdsConstants struct {
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for const fields.
@@ -61,14 +64,15 @@ func (m *_AdsConstants) GetAdsTcpDefaultPort() uint16 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsConstants factory function for _AdsConstants
-func NewAdsConstants() *_AdsConstants {
-	return &_AdsConstants{}
+func NewAdsConstants( ) *_AdsConstants {
+return &_AdsConstants{ }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsConstants(structType interface{}) AdsConstants {
-	if casted, ok := structType.(AdsConstants); ok {
+    if casted, ok := structType.(AdsConstants); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsConstants); ok {
@@ -94,6 +98,7 @@ func (m *_AdsConstants) GetLengthInBitsConditional(lastItem bool) uint16 {
 	return lengthInBits
 }
 
+
 func (m *_AdsConstants) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -121,13 +126,14 @@ func AdsConstantsParse(readBuffer utils.ReadBuffer) (AdsConstants, error) {
 	}
 
 	// Create the instance
-	return &_AdsConstants{}, nil
+	return &_AdsConstants{
+		}, nil
 }
 
 func (m *_AdsConstants) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsConstants"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsConstants"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsConstants")
 	}
 
@@ -143,6 +149,7 @@ func (m *_AdsConstants) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+
 func (m *_AdsConstants) isAdsConstants() bool {
 	return true
 }
@@ -157,3 +164,6 @@ func (m *_AdsConstants) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsData.go b/plc4go/protocols/ads/readwrite/model/AdsData.go
index 81d6567e6..d0eb3c3fb 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsData.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsData.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsData is the corresponding interface of AdsData
 type AdsData interface {
@@ -56,6 +58,7 @@ type _AdsDataChildRequirements interface {
 	GetResponse() bool
 }
 
+
 type AdsDataParent interface {
 	SerializeParent(writeBuffer utils.WriteBuffer, child AdsData, serializeChildFunction func() error) error
 	GetTypeName() string
@@ -63,21 +66,22 @@ type AdsDataParent interface {
 
 type AdsDataChild interface {
 	utils.Serializable
-	InitializeParent(parent AdsData)
+InitializeParent(parent AdsData )
 	GetParent() *AdsData
 
 	GetTypeName() string
 	AdsData
 }
 
+
 // NewAdsData factory function for _AdsData
-func NewAdsData() *_AdsData {
-	return &_AdsData{}
+func NewAdsData( ) *_AdsData {
+return &_AdsData{ }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsData(structType interface{}) AdsData {
-	if casted, ok := structType.(AdsData); ok {
+    if casted, ok := structType.(AdsData); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsData); ok {
@@ -90,6 +94,8 @@ func (m *_AdsData) GetTypeName() string {
 	return "AdsData"
 }
 
+
+
 func (m *_AdsData) GetParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
 
@@ -112,52 +118,52 @@ func AdsDataParse(readBuffer utils.ReadBuffer, commandId CommandId, response boo
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type AdsDataChildSerializeRequirement interface {
 		AdsData
-		InitializeParent(AdsData)
+		InitializeParent(AdsData )
 		GetParent() AdsData
 	}
 	var _childTemp interface{}
 	var _child AdsDataChildSerializeRequirement
 	var typeSwitchError error
 	switch {
-	case commandId == CommandId_INVALID && response == bool(false): // AdsInvalidRequest
+case commandId == CommandId_INVALID && response == bool(false) : // AdsInvalidRequest
 		_childTemp, typeSwitchError = AdsInvalidRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_INVALID && response == bool(true): // AdsInvalidResponse
+case commandId == CommandId_INVALID && response == bool(true) : // AdsInvalidResponse
 		_childTemp, typeSwitchError = AdsInvalidResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ_DEVICE_INFO && response == bool(false): // AdsReadDeviceInfoRequest
+case commandId == CommandId_ADS_READ_DEVICE_INFO && response == bool(false) : // AdsReadDeviceInfoRequest
 		_childTemp, typeSwitchError = AdsReadDeviceInfoRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ_DEVICE_INFO && response == bool(true): // AdsReadDeviceInfoResponse
+case commandId == CommandId_ADS_READ_DEVICE_INFO && response == bool(true) : // AdsReadDeviceInfoResponse
 		_childTemp, typeSwitchError = AdsReadDeviceInfoResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ && response == bool(false): // AdsReadRequest
+case commandId == CommandId_ADS_READ && response == bool(false) : // AdsReadRequest
 		_childTemp, typeSwitchError = AdsReadRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ && response == bool(true): // AdsReadResponse
+case commandId == CommandId_ADS_READ && response == bool(true) : // AdsReadResponse
 		_childTemp, typeSwitchError = AdsReadResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_WRITE && response == bool(false): // AdsWriteRequest
+case commandId == CommandId_ADS_WRITE && response == bool(false) : // AdsWriteRequest
 		_childTemp, typeSwitchError = AdsWriteRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_WRITE && response == bool(true): // AdsWriteResponse
+case commandId == CommandId_ADS_WRITE && response == bool(true) : // AdsWriteResponse
 		_childTemp, typeSwitchError = AdsWriteResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ_STATE && response == bool(false): // AdsReadStateRequest
+case commandId == CommandId_ADS_READ_STATE && response == bool(false) : // AdsReadStateRequest
 		_childTemp, typeSwitchError = AdsReadStateRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ_STATE && response == bool(true): // AdsReadStateResponse
+case commandId == CommandId_ADS_READ_STATE && response == bool(true) : // AdsReadStateResponse
 		_childTemp, typeSwitchError = AdsReadStateResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_WRITE_CONTROL && response == bool(false): // AdsWriteControlRequest
+case commandId == CommandId_ADS_WRITE_CONTROL && response == bool(false) : // AdsWriteControlRequest
 		_childTemp, typeSwitchError = AdsWriteControlRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_WRITE_CONTROL && response == bool(true): // AdsWriteControlResponse
+case commandId == CommandId_ADS_WRITE_CONTROL && response == bool(true) : // AdsWriteControlResponse
 		_childTemp, typeSwitchError = AdsWriteControlResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_ADD_DEVICE_NOTIFICATION && response == bool(false): // AdsAddDeviceNotificationRequest
+case commandId == CommandId_ADS_ADD_DEVICE_NOTIFICATION && response == bool(false) : // AdsAddDeviceNotificationRequest
 		_childTemp, typeSwitchError = AdsAddDeviceNotificationRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_ADD_DEVICE_NOTIFICATION && response == bool(true): // AdsAddDeviceNotificationResponse
+case commandId == CommandId_ADS_ADD_DEVICE_NOTIFICATION && response == bool(true) : // AdsAddDeviceNotificationResponse
 		_childTemp, typeSwitchError = AdsAddDeviceNotificationResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_DELETE_DEVICE_NOTIFICATION && response == bool(false): // AdsDeleteDeviceNotificationRequest
+case commandId == CommandId_ADS_DELETE_DEVICE_NOTIFICATION && response == bool(false) : // AdsDeleteDeviceNotificationRequest
 		_childTemp, typeSwitchError = AdsDeleteDeviceNotificationRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_DELETE_DEVICE_NOTIFICATION && response == bool(true): // AdsDeleteDeviceNotificationResponse
+case commandId == CommandId_ADS_DELETE_DEVICE_NOTIFICATION && response == bool(true) : // AdsDeleteDeviceNotificationResponse
 		_childTemp, typeSwitchError = AdsDeleteDeviceNotificationResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_DEVICE_NOTIFICATION && response == bool(false): // AdsDeviceNotificationRequest
+case commandId == CommandId_ADS_DEVICE_NOTIFICATION && response == bool(false) : // AdsDeviceNotificationRequest
 		_childTemp, typeSwitchError = AdsDeviceNotificationRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_DEVICE_NOTIFICATION && response == bool(true): // AdsDeviceNotificationResponse
+case commandId == CommandId_ADS_DEVICE_NOTIFICATION && response == bool(true) : // AdsDeviceNotificationResponse
 		_childTemp, typeSwitchError = AdsDeviceNotificationResponseParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ_WRITE && response == bool(false): // AdsReadWriteRequest
+case commandId == CommandId_ADS_READ_WRITE && response == bool(false) : // AdsReadWriteRequest
 		_childTemp, typeSwitchError = AdsReadWriteRequestParse(readBuffer, commandId, response)
-	case commandId == CommandId_ADS_READ_WRITE && response == bool(true): // AdsReadWriteResponse
+case commandId == CommandId_ADS_READ_WRITE && response == bool(true) : // AdsReadWriteResponse
 		_childTemp, typeSwitchError = AdsReadWriteResponseParse(readBuffer, commandId, response)
 	default:
 		typeSwitchError = errors.Errorf("Unmapped type for parameters [commandId=%v, response=%v]", commandId, response)
@@ -172,7 +178,7 @@ func AdsDataParse(readBuffer utils.ReadBuffer, commandId CommandId, response boo
 	}
 
 	// Finish initializing
-	_child.InitializeParent(_child)
+_child.InitializeParent(_child )
 	return _child, nil
 }
 
@@ -182,7 +188,7 @@ func (pm *_AdsData) SerializeParent(writeBuffer utils.WriteBuffer, child AdsData
 	_ = m
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsData"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsData"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsData")
 	}
 
@@ -197,6 +203,7 @@ func (pm *_AdsData) SerializeParent(writeBuffer utils.WriteBuffer, child AdsData
 	return nil
 }
 
+
 func (m *_AdsData) isAdsData() bool {
 	return true
 }
@@ -211,3 +218,6 @@ func (m *_AdsData) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataType.go b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
index ee17a4eac..082730e53 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataType.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
@@ -36,54 +36,54 @@ type IAdsDataType interface {
 	Serialize(writeBuffer utils.WriteBuffer) error
 }
 
-const (
-	AdsDataType_BOOL          AdsDataType = 0x01
-	AdsDataType_BIT           AdsDataType = 0x02
-	AdsDataType_BIT8          AdsDataType = 0x03
-	AdsDataType_BYTE          AdsDataType = 0x04
-	AdsDataType_BITARR8       AdsDataType = 0x05
-	AdsDataType_WORD          AdsDataType = 0x06
-	AdsDataType_BITARR16      AdsDataType = 0x07
-	AdsDataType_DWORD         AdsDataType = 0x08
-	AdsDataType_BITARR32      AdsDataType = 0x09
-	AdsDataType_SINT          AdsDataType = 0x0A
-	AdsDataType_INT8          AdsDataType = 0x0B
-	AdsDataType_USINT         AdsDataType = 0x0C
-	AdsDataType_UINT8         AdsDataType = 0x0D
-	AdsDataType_INT           AdsDataType = 0x0E
-	AdsDataType_INT16         AdsDataType = 0x0F
-	AdsDataType_UINT          AdsDataType = 0x10
-	AdsDataType_UINT16        AdsDataType = 0x11
-	AdsDataType_DINT          AdsDataType = 0x12
-	AdsDataType_INT32         AdsDataType = 0x13
-	AdsDataType_UDINT         AdsDataType = 0x14
-	AdsDataType_UINT32        AdsDataType = 0x15
-	AdsDataType_LINT          AdsDataType = 0x16
-	AdsDataType_INT64         AdsDataType = 0x17
-	AdsDataType_ULINT         AdsDataType = 0x18
-	AdsDataType_UINT64        AdsDataType = 0x19
-	AdsDataType_REAL          AdsDataType = 0x1A
-	AdsDataType_FLOAT         AdsDataType = 0x1B
-	AdsDataType_LREAL         AdsDataType = 0x1C
-	AdsDataType_DOUBLE        AdsDataType = 0x1D
-	AdsDataType_CHAR          AdsDataType = 0x1E
-	AdsDataType_WCHAR         AdsDataType = 0x1F
-	AdsDataType_STRING        AdsDataType = 0x20
-	AdsDataType_WSTRING       AdsDataType = 0x21
-	AdsDataType_TIME          AdsDataType = 0x22
-	AdsDataType_LTIME         AdsDataType = 0x23
-	AdsDataType_DATE          AdsDataType = 0x24
-	AdsDataType_TIME_OF_DAY   AdsDataType = 0x25
-	AdsDataType_TOD           AdsDataType = 0x26
+const(
+	AdsDataType_BOOL AdsDataType = 0x01
+	AdsDataType_BIT AdsDataType = 0x02
+	AdsDataType_BIT8 AdsDataType = 0x03
+	AdsDataType_BYTE AdsDataType = 0x04
+	AdsDataType_BITARR8 AdsDataType = 0x05
+	AdsDataType_WORD AdsDataType = 0x06
+	AdsDataType_BITARR16 AdsDataType = 0x07
+	AdsDataType_DWORD AdsDataType = 0x08
+	AdsDataType_BITARR32 AdsDataType = 0x09
+	AdsDataType_SINT AdsDataType = 0x0A
+	AdsDataType_INT8 AdsDataType = 0x0B
+	AdsDataType_USINT AdsDataType = 0x0C
+	AdsDataType_UINT8 AdsDataType = 0x0D
+	AdsDataType_INT AdsDataType = 0x0E
+	AdsDataType_INT16 AdsDataType = 0x0F
+	AdsDataType_UINT AdsDataType = 0x10
+	AdsDataType_UINT16 AdsDataType = 0x11
+	AdsDataType_DINT AdsDataType = 0x12
+	AdsDataType_INT32 AdsDataType = 0x13
+	AdsDataType_UDINT AdsDataType = 0x14
+	AdsDataType_UINT32 AdsDataType = 0x15
+	AdsDataType_LINT AdsDataType = 0x16
+	AdsDataType_INT64 AdsDataType = 0x17
+	AdsDataType_ULINT AdsDataType = 0x18
+	AdsDataType_UINT64 AdsDataType = 0x19
+	AdsDataType_REAL AdsDataType = 0x1A
+	AdsDataType_FLOAT AdsDataType = 0x1B
+	AdsDataType_LREAL AdsDataType = 0x1C
+	AdsDataType_DOUBLE AdsDataType = 0x1D
+	AdsDataType_CHAR AdsDataType = 0x1E
+	AdsDataType_WCHAR AdsDataType = 0x1F
+	AdsDataType_STRING AdsDataType = 0x20
+	AdsDataType_WSTRING AdsDataType = 0x21
+	AdsDataType_TIME AdsDataType = 0x22
+	AdsDataType_LTIME AdsDataType = 0x23
+	AdsDataType_DATE AdsDataType = 0x24
+	AdsDataType_TIME_OF_DAY AdsDataType = 0x25
+	AdsDataType_TOD AdsDataType = 0x26
 	AdsDataType_DATE_AND_TIME AdsDataType = 0x27
-	AdsDataType_DT            AdsDataType = 0x28
+	AdsDataType_DT AdsDataType = 0x28
 )
 
 var AdsDataTypeValues []AdsDataType
 
 func init() {
 	_ = errors.New
-	AdsDataTypeValues = []AdsDataType{
+	AdsDataTypeValues = []AdsDataType {
 		AdsDataType_BOOL,
 		AdsDataType_BIT,
 		AdsDataType_BIT8,
@@ -127,170 +127,130 @@ func init() {
 	}
 }
 
+
 func (e AdsDataType) NumBytes() uint16 {
-	switch e {
-	case 0x01:
-		{ /* '0x01' */
-			return 1
+	switch e  {
+		case 0x01: { /* '0x01' */
+            return 1
 		}
-	case 0x02:
-		{ /* '0x02' */
-			return 1
+		case 0x02: { /* '0x02' */
+            return 1
 		}
-	case 0x03:
-		{ /* '0x03' */
-			return 1
+		case 0x03: { /* '0x03' */
+            return 1
 		}
-	case 0x04:
-		{ /* '0x04' */
-			return 1
+		case 0x04: { /* '0x04' */
+            return 1
 		}
-	case 0x05:
-		{ /* '0x05' */
-			return 1
+		case 0x05: { /* '0x05' */
+            return 1
 		}
-	case 0x06:
-		{ /* '0x06' */
-			return 2
+		case 0x06: { /* '0x06' */
+            return 2
 		}
-	case 0x07:
-		{ /* '0x07' */
-			return 2
+		case 0x07: { /* '0x07' */
+            return 2
 		}
-	case 0x08:
-		{ /* '0x08' */
-			return 4
+		case 0x08: { /* '0x08' */
+            return 4
 		}
-	case 0x09:
-		{ /* '0x09' */
-			return 4
+		case 0x09: { /* '0x09' */
+            return 4
 		}
-	case 0x0A:
-		{ /* '0x0A' */
-			return 1
+		case 0x0A: { /* '0x0A' */
+            return 1
 		}
-	case 0x0B:
-		{ /* '0x0B' */
-			return 1
+		case 0x0B: { /* '0x0B' */
+            return 1
 		}
-	case 0x0C:
-		{ /* '0x0C' */
-			return 1
+		case 0x0C: { /* '0x0C' */
+            return 1
 		}
-	case 0x0D:
-		{ /* '0x0D' */
-			return 1
+		case 0x0D: { /* '0x0D' */
+            return 1
 		}
-	case 0x0E:
-		{ /* '0x0E' */
-			return 2
+		case 0x0E: { /* '0x0E' */
+            return 2
 		}
-	case 0x0F:
-		{ /* '0x0F' */
-			return 2
+		case 0x0F: { /* '0x0F' */
+            return 2
 		}
-	case 0x10:
-		{ /* '0x10' */
-			return 2
+		case 0x10: { /* '0x10' */
+            return 2
 		}
-	case 0x11:
-		{ /* '0x11' */
-			return 2
+		case 0x11: { /* '0x11' */
+            return 2
 		}
-	case 0x12:
-		{ /* '0x12' */
-			return 4
+		case 0x12: { /* '0x12' */
+            return 4
 		}
-	case 0x13:
-		{ /* '0x13' */
-			return 4
+		case 0x13: { /* '0x13' */
+            return 4
 		}
-	case 0x14:
-		{ /* '0x14' */
-			return 4
+		case 0x14: { /* '0x14' */
+            return 4
 		}
-	case 0x15:
-		{ /* '0x15' */
-			return 4
+		case 0x15: { /* '0x15' */
+            return 4
 		}
-	case 0x16:
-		{ /* '0x16' */
-			return 8
+		case 0x16: { /* '0x16' */
+            return 8
 		}
-	case 0x17:
-		{ /* '0x17' */
-			return 8
+		case 0x17: { /* '0x17' */
+            return 8
 		}
-	case 0x18:
-		{ /* '0x18' */
-			return 8
+		case 0x18: { /* '0x18' */
+            return 8
 		}
-	case 0x19:
-		{ /* '0x19' */
-			return 8
+		case 0x19: { /* '0x19' */
+            return 8
 		}
-	case 0x1A:
-		{ /* '0x1A' */
-			return 4
+		case 0x1A: { /* '0x1A' */
+            return 4
 		}
-	case 0x1B:
-		{ /* '0x1B' */
-			return 4
+		case 0x1B: { /* '0x1B' */
+            return 4
 		}
-	case 0x1C:
-		{ /* '0x1C' */
-			return 8
+		case 0x1C: { /* '0x1C' */
+            return 8
 		}
-	case 0x1D:
-		{ /* '0x1D' */
-			return 8
+		case 0x1D: { /* '0x1D' */
+            return 8
 		}
-	case 0x1E:
-		{ /* '0x1E' */
-			return 1
+		case 0x1E: { /* '0x1E' */
+            return 1
 		}
-	case 0x1F:
-		{ /* '0x1F' */
-			return 2
+		case 0x1F: { /* '0x1F' */
+            return 2
 		}
-	case 0x20:
-		{ /* '0x20' */
-			return 256
+		case 0x20: { /* '0x20' */
+            return 256
 		}
-	case 0x21:
-		{ /* '0x21' */
-			return 512
+		case 0x21: { /* '0x21' */
+            return 512
 		}
-	case 0x22:
-		{ /* '0x22' */
-			return 4
+		case 0x22: { /* '0x22' */
+            return 4
 		}
-	case 0x23:
-		{ /* '0x23' */
-			return 8
+		case 0x23: { /* '0x23' */
+            return 8
 		}
-	case 0x24:
-		{ /* '0x24' */
-			return 4
+		case 0x24: { /* '0x24' */
+            return 4
 		}
-	case 0x25:
-		{ /* '0x25' */
-			return 4
+		case 0x25: { /* '0x25' */
+            return 4
 		}
-	case 0x26:
-		{ /* '0x26' */
-			return 4
+		case 0x26: { /* '0x26' */
+            return 4
 		}
-	case 0x27:
-		{ /* '0x27' */
-			return 4
+		case 0x27: { /* '0x27' */
+            return 4
 		}
-	case 0x28:
-		{ /* '0x28' */
-			return 4
+		case 0x28: { /* '0x28' */
+            return 4
 		}
-	default:
-		{
+		default: {
 			return 0
 		}
 	}
@@ -306,169 +266,128 @@ func AdsDataTypeFirstEnumForFieldNumBytes(value uint16) (AdsDataType, error) {
 }
 
 func (e AdsDataType) DataFormatName() string {
-	switch e {
-	case 0x01:
-		{ /* '0x01' */
-			return "IEC61131_BOOL"
+	switch e  {
+		case 0x01: { /* '0x01' */
+            return "IEC61131_BOOL"
 		}
-	case 0x02:
-		{ /* '0x02' */
-			return "IEC61131_BOOL"
+		case 0x02: { /* '0x02' */
+            return "IEC61131_BOOL"
 		}
-	case 0x03:
-		{ /* '0x03' */
-			return "IEC61131_BYTE"
+		case 0x03: { /* '0x03' */
+            return "IEC61131_BYTE"
 		}
-	case 0x04:
-		{ /* '0x04' */
-			return "IEC61131_BYTE"
+		case 0x04: { /* '0x04' */
+            return "IEC61131_BYTE"
 		}
-	case 0x05:
-		{ /* '0x05' */
-			return "IEC61131_BYTE"
+		case 0x05: { /* '0x05' */
+            return "IEC61131_BYTE"
 		}
-	case 0x06:
-		{ /* '0x06' */
-			return "IEC61131_WORD"
+		case 0x06: { /* '0x06' */
+            return "IEC61131_WORD"
 		}
-	case 0x07:
-		{ /* '0x07' */
-			return "IEC61131_WORD"
+		case 0x07: { /* '0x07' */
+            return "IEC61131_WORD"
 		}
-	case 0x08:
-		{ /* '0x08' */
-			return "IEC61131_DWORD"
+		case 0x08: { /* '0x08' */
+            return "IEC61131_DWORD"
 		}
-	case 0x09:
-		{ /* '0x09' */
-			return "IEC61131_DWORD"
+		case 0x09: { /* '0x09' */
+            return "IEC61131_DWORD"
 		}
-	case 0x0A:
-		{ /* '0x0A' */
-			return "IEC61131_SINT"
+		case 0x0A: { /* '0x0A' */
+            return "IEC61131_SINT"
 		}
-	case 0x0B:
-		{ /* '0x0B' */
-			return "IEC61131_SINT"
+		case 0x0B: { /* '0x0B' */
+            return "IEC61131_SINT"
 		}
-	case 0x0C:
-		{ /* '0x0C' */
-			return "IEC61131_USINT"
+		case 0x0C: { /* '0x0C' */
+            return "IEC61131_USINT"
 		}
-	case 0x0D:
-		{ /* '0x0D' */
-			return "IEC61131_USINT"
+		case 0x0D: { /* '0x0D' */
+            return "IEC61131_USINT"
 		}
-	case 0x0E:
-		{ /* '0x0E' */
-			return "IEC61131_INT"
+		case 0x0E: { /* '0x0E' */
+            return "IEC61131_INT"
 		}
-	case 0x0F:
-		{ /* '0x0F' */
-			return "IEC61131_INT"
+		case 0x0F: { /* '0x0F' */
+            return "IEC61131_INT"
 		}
-	case 0x10:
-		{ /* '0x10' */
-			return "IEC61131_UINT"
+		case 0x10: { /* '0x10' */
+            return "IEC61131_UINT"
 		}
-	case 0x11:
-		{ /* '0x11' */
-			return "IEC61131_UINT"
+		case 0x11: { /* '0x11' */
+            return "IEC61131_UINT"
 		}
-	case 0x12:
-		{ /* '0x12' */
-			return "IEC61131_DINT"
+		case 0x12: { /* '0x12' */
+            return "IEC61131_DINT"
 		}
-	case 0x13:
-		{ /* '0x13' */
-			return "IEC61131_DINT"
+		case 0x13: { /* '0x13' */
+            return "IEC61131_DINT"
 		}
-	case 0x14:
-		{ /* '0x14' */
-			return "IEC61131_UDINT"
+		case 0x14: { /* '0x14' */
+            return "IEC61131_UDINT"
 		}
-	case 0x15:
-		{ /* '0x15' */
-			return "IEC61131_UDINT"
+		case 0x15: { /* '0x15' */
+            return "IEC61131_UDINT"
 		}
-	case 0x16:
-		{ /* '0x16' */
-			return "IEC61131_LINT"
+		case 0x16: { /* '0x16' */
+            return "IEC61131_LINT"
 		}
-	case 0x17:
-		{ /* '0x17' */
-			return "IEC61131_LINT"
+		case 0x17: { /* '0x17' */
+            return "IEC61131_LINT"
 		}
-	case 0x18:
-		{ /* '0x18' */
-			return "IEC61131_ULINT"
+		case 0x18: { /* '0x18' */
+            return "IEC61131_ULINT"
 		}
-	case 0x19:
-		{ /* '0x19' */
-			return "IEC61131_ULINT"
+		case 0x19: { /* '0x19' */
+            return "IEC61131_ULINT"
 		}
-	case 0x1A:
-		{ /* '0x1A' */
-			return "IEC61131_REAL"
+		case 0x1A: { /* '0x1A' */
+            return "IEC61131_REAL"
 		}
-	case 0x1B:
-		{ /* '0x1B' */
-			return "IEC61131_REAL"
+		case 0x1B: { /* '0x1B' */
+            return "IEC61131_REAL"
 		}
-	case 0x1C:
-		{ /* '0x1C' */
-			return "IEC61131_LREAL"
+		case 0x1C: { /* '0x1C' */
+            return "IEC61131_LREAL"
 		}
-	case 0x1D:
-		{ /* '0x1D' */
-			return "IEC61131_LREAL"
+		case 0x1D: { /* '0x1D' */
+            return "IEC61131_LREAL"
 		}
-	case 0x1E:
-		{ /* '0x1E' */
-			return "IEC61131_CHAR"
+		case 0x1E: { /* '0x1E' */
+            return "IEC61131_CHAR"
 		}
-	case 0x1F:
-		{ /* '0x1F' */
-			return "IEC61131_WCHAR"
+		case 0x1F: { /* '0x1F' */
+            return "IEC61131_WCHAR"
 		}
-	case 0x20:
-		{ /* '0x20' */
-			return "IEC61131_STRING"
+		case 0x20: { /* '0x20' */
+            return "IEC61131_STRING"
 		}
-	case 0x21:
-		{ /* '0x21' */
-			return "IEC61131_WSTRING"
+		case 0x21: { /* '0x21' */
+            return "IEC61131_WSTRING"
 		}
-	case 0x22:
-		{ /* '0x22' */
-			return "IEC61131_TIME"
+		case 0x22: { /* '0x22' */
+            return "IEC61131_TIME"
 		}
-	case 0x23:
-		{ /* '0x23' */
-			return "IEC61131_LTIME"
+		case 0x23: { /* '0x23' */
+            return "IEC61131_LTIME"
 		}
-	case 0x24:
-		{ /* '0x24' */
-			return "IEC61131_DATE"
+		case 0x24: { /* '0x24' */
+            return "IEC61131_DATE"
 		}
-	case 0x25:
-		{ /* '0x25' */
-			return "IEC61131_TIME_OF_DAY"
+		case 0x25: { /* '0x25' */
+            return "IEC61131_TIME_OF_DAY"
 		}
-	case 0x26:
-		{ /* '0x26' */
-			return "IEC61131_TIME_OF_DAY"
+		case 0x26: { /* '0x26' */
+            return "IEC61131_TIME_OF_DAY"
 		}
-	case 0x27:
-		{ /* '0x27' */
-			return "IEC61131_DATE_AND_TIME"
+		case 0x27: { /* '0x27' */
+            return "IEC61131_DATE_AND_TIME"
 		}
-	case 0x28:
-		{ /* '0x28' */
-			return "IEC61131_DATE_AND_TIME"
+		case 0x28: { /* '0x28' */
+            return "IEC61131_DATE_AND_TIME"
 		}
-	default:
-		{
+		default: {
 			return ""
 		}
 	}
@@ -484,86 +403,86 @@ func AdsDataTypeFirstEnumForFieldDataFormatName(value string) (AdsDataType, erro
 }
 func AdsDataTypeByValue(value int8) (enum AdsDataType, ok bool) {
 	switch value {
-	case 0x01:
-		return AdsDataType_BOOL, true
-	case 0x02:
-		return AdsDataType_BIT, true
-	case 0x03:
-		return AdsDataType_BIT8, true
-	case 0x04:
-		return AdsDataType_BYTE, true
-	case 0x05:
-		return AdsDataType_BITARR8, true
-	case 0x06:
-		return AdsDataType_WORD, true
-	case 0x07:
-		return AdsDataType_BITARR16, true
-	case 0x08:
-		return AdsDataType_DWORD, true
-	case 0x09:
-		return AdsDataType_BITARR32, true
-	case 0x0A:
-		return AdsDataType_SINT, true
-	case 0x0B:
-		return AdsDataType_INT8, true
-	case 0x0C:
-		return AdsDataType_USINT, true
-	case 0x0D:
-		return AdsDataType_UINT8, true
-	case 0x0E:
-		return AdsDataType_INT, true
-	case 0x0F:
-		return AdsDataType_INT16, true
-	case 0x10:
-		return AdsDataType_UINT, true
-	case 0x11:
-		return AdsDataType_UINT16, true
-	case 0x12:
-		return AdsDataType_DINT, true
-	case 0x13:
-		return AdsDataType_INT32, true
-	case 0x14:
-		return AdsDataType_UDINT, true
-	case 0x15:
-		return AdsDataType_UINT32, true
-	case 0x16:
-		return AdsDataType_LINT, true
-	case 0x17:
-		return AdsDataType_INT64, true
-	case 0x18:
-		return AdsDataType_ULINT, true
-	case 0x19:
-		return AdsDataType_UINT64, true
-	case 0x1A:
-		return AdsDataType_REAL, true
-	case 0x1B:
-		return AdsDataType_FLOAT, true
-	case 0x1C:
-		return AdsDataType_LREAL, true
-	case 0x1D:
-		return AdsDataType_DOUBLE, true
-	case 0x1E:
-		return AdsDataType_CHAR, true
-	case 0x1F:
-		return AdsDataType_WCHAR, true
-	case 0x20:
-		return AdsDataType_STRING, true
-	case 0x21:
-		return AdsDataType_WSTRING, true
-	case 0x22:
-		return AdsDataType_TIME, true
-	case 0x23:
-		return AdsDataType_LTIME, true
-	case 0x24:
-		return AdsDataType_DATE, true
-	case 0x25:
-		return AdsDataType_TIME_OF_DAY, true
-	case 0x26:
-		return AdsDataType_TOD, true
-	case 0x27:
-		return AdsDataType_DATE_AND_TIME, true
-	case 0x28:
-		return AdsDataType_DT, true
+		case 0x01:
+			return AdsDataType_BOOL, true
+		case 0x02:
+			return AdsDataType_BIT, true
+		case 0x03:
+			return AdsDataType_BIT8, true
+		case 0x04:
+			return AdsDataType_BYTE, true
+		case 0x05:
+			return AdsDataType_BITARR8, true
+		case 0x06:
+			return AdsDataType_WORD, true
+		case 0x07:
+			return AdsDataType_BITARR16, true
+		case 0x08:
+			return AdsDataType_DWORD, true
+		case 0x09:
+			return AdsDataType_BITARR32, true
+		case 0x0A:
+			return AdsDataType_SINT, true
+		case 0x0B:
+			return AdsDataType_INT8, true
+		case 0x0C:
+			return AdsDataType_USINT, true
+		case 0x0D:
+			return AdsDataType_UINT8, true
+		case 0x0E:
+			return AdsDataType_INT, true
+		case 0x0F:
+			return AdsDataType_INT16, true
+		case 0x10:
+			return AdsDataType_UINT, true
+		case 0x11:
+			return AdsDataType_UINT16, true
+		case 0x12:
+			return AdsDataType_DINT, true
+		case 0x13:
+			return AdsDataType_INT32, true
+		case 0x14:
+			return AdsDataType_UDINT, true
+		case 0x15:
+			return AdsDataType_UINT32, true
+		case 0x16:
+			return AdsDataType_LINT, true
+		case 0x17:
+			return AdsDataType_INT64, true
+		case 0x18:
+			return AdsDataType_ULINT, true
+		case 0x19:
+			return AdsDataType_UINT64, true
+		case 0x1A:
+			return AdsDataType_REAL, true
+		case 0x1B:
+			return AdsDataType_FLOAT, true
+		case 0x1C:
+			return AdsDataType_LREAL, true
+		case 0x1D:
+			return AdsDataType_DOUBLE, true
+		case 0x1E:
+			return AdsDataType_CHAR, true
+		case 0x1F:
+			return AdsDataType_WCHAR, true
+		case 0x20:
+			return AdsDataType_STRING, true
+		case 0x21:
+			return AdsDataType_WSTRING, true
+		case 0x22:
+			return AdsDataType_TIME, true
+		case 0x23:
+			return AdsDataType_LTIME, true
+		case 0x24:
+			return AdsDataType_DATE, true
+		case 0x25:
+			return AdsDataType_TIME_OF_DAY, true
+		case 0x26:
+			return AdsDataType_TOD, true
+		case 0x27:
+			return AdsDataType_DATE_AND_TIME, true
+		case 0x28:
+			return AdsDataType_DT, true
 	}
 	return 0, false
 }
@@ -654,13 +573,13 @@ func AdsDataTypeByName(value string) (enum AdsDataType, ok bool) {
 	return 0, false
 }
 
-func AdsDataTypeKnows(value int8) bool {
+func AdsDataTypeKnows(value int8)  bool {
 	for _, typeValue := range AdsDataTypeValues {
 		if int8(typeValue) == value {
 			return true
 		}
 	}
-	return false
+	return false;
 }
 
 func CastAdsDataType(structType interface{}) AdsDataType {
@@ -788,3 +707,4 @@ func (e AdsDataType) PLC4XEnumName() string {
 func (e AdsDataType) String() string {
 	return e.PLC4XEnumName()
 }
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
index 9d997e1ba..47ca5603d 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsDataTypeArrayInfo is the corresponding interface of AdsDataTypeArrayInfo
 type AdsDataTypeArrayInfo interface {
@@ -47,10 +49,11 @@ type AdsDataTypeArrayInfoExactly interface {
 
 // _AdsDataTypeArrayInfo is the data-structure of this message
 type _AdsDataTypeArrayInfo struct {
-	LowerBound  uint32
-	NumElements uint32
+        LowerBound uint32
+        NumElements uint32
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -82,14 +85,15 @@ func (m *_AdsDataTypeArrayInfo) GetUpperBound() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsDataTypeArrayInfo factory function for _AdsDataTypeArrayInfo
-func NewAdsDataTypeArrayInfo(lowerBound uint32, numElements uint32) *_AdsDataTypeArrayInfo {
-	return &_AdsDataTypeArrayInfo{LowerBound: lowerBound, NumElements: numElements}
+func NewAdsDataTypeArrayInfo( lowerBound uint32 , numElements uint32 ) *_AdsDataTypeArrayInfo {
+return &_AdsDataTypeArrayInfo{ LowerBound: lowerBound , NumElements: numElements }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsDataTypeArrayInfo(structType interface{}) AdsDataTypeArrayInfo {
-	if casted, ok := structType.(AdsDataTypeArrayInfo); ok {
+    if casted, ok := structType.(AdsDataTypeArrayInfo); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsDataTypeArrayInfo); ok {
@@ -110,16 +114,17 @@ func (m *_AdsDataTypeArrayInfo) GetLengthInBitsConditional(lastItem bool) uint16
 	lengthInBits := uint16(0)
 
 	// Simple field (lowerBound)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (numElements)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// A virtual field doesn't have any in- or output.
 
 	return lengthInBits
 }
 
+
 func (m *_AdsDataTypeArrayInfo) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -134,14 +139,14 @@ func AdsDataTypeArrayInfoParse(readBuffer utils.ReadBuffer) (AdsDataTypeArrayInf
 	_ = currentPos
 
 	// Simple Field (lowerBound)
-	_lowerBound, _lowerBoundErr := readBuffer.ReadUint32("lowerBound", 32)
+_lowerBound, _lowerBoundErr := readBuffer.ReadUint32("lowerBound", 32)
 	if _lowerBoundErr != nil {
 		return nil, errors.Wrap(_lowerBoundErr, "Error parsing 'lowerBound' field of AdsDataTypeArrayInfo")
 	}
 	lowerBound := _lowerBound
 
 	// Simple Field (numElements)
-	_numElements, _numElementsErr := readBuffer.ReadUint32("numElements", 32)
+_numElements, _numElementsErr := readBuffer.ReadUint32("numElements", 32)
 	if _numElementsErr != nil {
 		return nil, errors.Wrap(_numElementsErr, "Error parsing 'numElements' field of AdsDataTypeArrayInfo")
 	}
@@ -158,15 +163,15 @@ func AdsDataTypeArrayInfoParse(readBuffer utils.ReadBuffer) (AdsDataTypeArrayInf
 
 	// Create the instance
 	return &_AdsDataTypeArrayInfo{
-		LowerBound:  lowerBound,
-		NumElements: numElements,
-	}, nil
+			LowerBound: lowerBound,
+			NumElements: numElements,
+		}, nil
 }
 
 func (m *_AdsDataTypeArrayInfo) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsDataTypeArrayInfo"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsDataTypeArrayInfo"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsDataTypeArrayInfo")
 	}
 
@@ -194,6 +199,7 @@ func (m *_AdsDataTypeArrayInfo) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+
 func (m *_AdsDataTypeArrayInfo) isAdsDataTypeArrayInfo() bool {
 	return true
 }
@@ -208,3 +214,6 @@ func (m *_AdsDataTypeArrayInfo) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
index aa8c945e8..ecd27cf91 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
@@ -19,13 +19,15 @@
 
 package model
 
+
 import (
 	"fmt"
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // Constant values.
 const AdsDataTypeTableEntry_NAMETERMINATOR uint8 = 0x00
@@ -79,24 +81,25 @@ type AdsDataTypeTableEntryExactly interface {
 
 // _AdsDataTypeTableEntry is the data-structure of this message
 type _AdsDataTypeTableEntry struct {
-	EntryLength     uint32
-	Version         uint32
-	HashValue       uint32
-	TypeHashValue   uint32
-	Size            uint32
-	Offs            uint32
-	DataType        uint32
-	Flags           uint32
-	ArrayDimensions uint16
-	NumChildren     uint16
-	Name            string
-	TypeName        string
-	Comment         string
-	ArrayInfo       []AdsDataTypeArrayInfo
-	Children        []AdsDataTypeTableEntry
-	Rest            []byte
+        EntryLength uint32
+        Version uint32
+        HashValue uint32
+        TypeHashValue uint32
+        Size uint32
+        Offs uint32
+        DataType uint32
+        Flags uint32
+        ArrayDimensions uint16
+        NumChildren uint16
+        Name string
+        TypeName string
+        Comment string
+        ArrayInfo []AdsDataTypeArrayInfo
+        Children []AdsDataTypeTableEntry
+        Rest []byte
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -192,14 +195,15 @@ func (m *_AdsDataTypeTableEntry) GetCommentTerminator() uint8 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsDataTypeTableEntry factory function for _AdsDataTypeTableEntry
-func NewAdsDataTypeTableEntry(entryLength uint32, version uint32, hashValue uint32, typeHashValue uint32, size uint32, offs uint32, dataType uint32, flags uint32, arrayDimensions uint16, numChildren uint16, name string, typeName string, comment string, arrayInfo []AdsDataTypeArrayInfo, children []AdsDataTypeTableEntry, rest []byte) *_AdsDataTypeTableEntry {
-	return &_AdsDataTypeTableEntry{EntryLength: entryLength, Version: version, HashValue: hashValue, TypeHashValue: typeHashValue, Size: size, Offs: offs, DataType: dataType, Flags: flags, ArrayDimensions: arrayDimensions, NumChildren: numChildren, Name: name, TypeName: typeName, Comment: comment, ArrayInfo: arrayInfo, Children: children, Rest: rest}
+func NewAdsDataTypeTableEntry( entryLength uint32 , version uint32 , hashValue uint32 , typeHashValue uint32 , size uint32 , offs uint32 , dataType uint32 , flags uint32 , arrayDimensions uint16 , numChildren uint16 , name string , typeName string , comment string , arrayInfo []AdsDataTypeArrayInfo , children []AdsDataTypeTableEntry , rest []byte ) *_AdsDataTypeTableEntry {
+return &_AdsDataTypeTableEntry{ EntryLength: entryLength , Version: version , HashValue: hashValue , TypeHashValue: typeHashValue , Size: size , Offs: offs , DataType: dataType , Flags: flags , ArrayDimensions: arrayDimensions , NumChildren: numChildren , Name: name , TypeName: typeName , Comment: comment , ArrayInfo: arrayInfo , Children: children , Rest: rest }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsDataTypeTableEntry(structType interface{}) AdsDataTypeTableEntry {
-	if casted, ok := structType.(AdsDataTypeTableEntry); ok {
+    if casted, ok := structType.(AdsDataTypeTableEntry); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsDataTypeTableEntry); ok {
@@ -220,28 +224,28 @@ func (m *_AdsDataTypeTableEntry) GetLengthInBitsConditional(lastItem bool) uint1
 	lengthInBits := uint16(0)
 
 	// Simple field (entryLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (version)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (hashValue)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (typeHashValue)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (size)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (offs)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (dataType)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (flags)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Implicit Field (nameLength)
 	lengthInBits += 16
@@ -253,10 +257,10 @@ func (m *_AdsDataTypeTableEntry) GetLengthInBitsConditional(lastItem bool) uint1
 	lengthInBits += 16
 
 	// Simple field (arrayDimensions)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Simple field (numChildren)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Simple field (name)
 	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetName())) * int32(int32(8)))
@@ -279,16 +283,16 @@ func (m *_AdsDataTypeTableEntry) GetLengthInBitsConditional(lastItem bool) uint1
 	// Array field
 	if len(m.ArrayInfo) > 0 {
 		for i, element := range m.ArrayInfo {
-			last := i == len(m.ArrayInfo)-1
-			lengthInBits += element.(interface{ GetLengthInBitsConditional(bool) uint16 }).GetLengthInBitsConditional(last)
+			last := i == len(m.ArrayInfo) -1
+			lengthInBits += element.(interface{GetLengthInBitsConditional(bool) uint16}).GetLengthInBitsConditional(last)
 		}
 	}
 
 	// Array field
 	if len(m.Children) > 0 {
 		for i, element := range m.Children {
-			last := i == len(m.Children)-1
-			lengthInBits += element.(interface{ GetLengthInBitsConditional(bool) uint16 }).GetLengthInBitsConditional(last)
+			last := i == len(m.Children) -1
+			lengthInBits += element.(interface{GetLengthInBitsConditional(bool) uint16}).GetLengthInBitsConditional(last)
 		}
 	}
 
@@ -300,6 +304,7 @@ func (m *_AdsDataTypeTableEntry) GetLengthInBitsConditional(lastItem bool) uint1
 	return lengthInBits
 }
 
+
 func (m *_AdsDataTypeTableEntry) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -316,56 +321,56 @@ func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEn
 	var curPos uint16
 
 	// Simple Field (entryLength)
-	_entryLength, _entryLengthErr := readBuffer.ReadUint32("entryLength", 32)
+_entryLength, _entryLengthErr := readBuffer.ReadUint32("entryLength", 32)
 	if _entryLengthErr != nil {
 		return nil, errors.Wrap(_entryLengthErr, "Error parsing 'entryLength' field of AdsDataTypeTableEntry")
 	}
 	entryLength := _entryLength
 
 	// Simple Field (version)
-	_version, _versionErr := readBuffer.ReadUint32("version", 32)
+_version, _versionErr := readBuffer.ReadUint32("version", 32)
 	if _versionErr != nil {
 		return nil, errors.Wrap(_versionErr, "Error parsing 'version' field of AdsDataTypeTableEntry")
 	}
 	version := _version
 
 	// Simple Field (hashValue)
-	_hashValue, _hashValueErr := readBuffer.ReadUint32("hashValue", 32)
+_hashValue, _hashValueErr := readBuffer.ReadUint32("hashValue", 32)
 	if _hashValueErr != nil {
 		return nil, errors.Wrap(_hashValueErr, "Error parsing 'hashValue' field of AdsDataTypeTableEntry")
 	}
 	hashValue := _hashValue
 
 	// Simple Field (typeHashValue)
-	_typeHashValue, _typeHashValueErr := readBuffer.ReadUint32("typeHashValue", 32)
+_typeHashValue, _typeHashValueErr := readBuffer.ReadUint32("typeHashValue", 32)
 	if _typeHashValueErr != nil {
 		return nil, errors.Wrap(_typeHashValueErr, "Error parsing 'typeHashValue' field of AdsDataTypeTableEntry")
 	}
 	typeHashValue := _typeHashValue
 
 	// Simple Field (size)
-	_size, _sizeErr := readBuffer.ReadUint32("size", 32)
+_size, _sizeErr := readBuffer.ReadUint32("size", 32)
 	if _sizeErr != nil {
 		return nil, errors.Wrap(_sizeErr, "Error parsing 'size' field of AdsDataTypeTableEntry")
 	}
 	size := _size
 
 	// Simple Field (offs)
-	_offs, _offsErr := readBuffer.ReadUint32("offs", 32)
+_offs, _offsErr := readBuffer.ReadUint32("offs", 32)
 	if _offsErr != nil {
 		return nil, errors.Wrap(_offsErr, "Error parsing 'offs' field of AdsDataTypeTableEntry")
 	}
 	offs := _offs
 
 	// Simple Field (dataType)
-	_dataType, _dataTypeErr := readBuffer.ReadUint32("dataType", 32)
+_dataType, _dataTypeErr := readBuffer.ReadUint32("dataType", 32)
 	if _dataTypeErr != nil {
 		return nil, errors.Wrap(_dataTypeErr, "Error parsing 'dataType' field of AdsDataTypeTableEntry")
 	}
 	dataType := _dataType
 
 	// Simple Field (flags)
-	_flags, _flagsErr := readBuffer.ReadUint32("flags", 32)
+_flags, _flagsErr := readBuffer.ReadUint32("flags", 32)
 	if _flagsErr != nil {
 		return nil, errors.Wrap(_flagsErr, "Error parsing 'flags' field of AdsDataTypeTableEntry")
 	}
@@ -393,21 +398,21 @@ func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEn
 	}
 
 	// Simple Field (arrayDimensions)
-	_arrayDimensions, _arrayDimensionsErr := readBuffer.ReadUint16("arrayDimensions", 16)
+_arrayDimensions, _arrayDimensionsErr := readBuffer.ReadUint16("arrayDimensions", 16)
 	if _arrayDimensionsErr != nil {
 		return nil, errors.Wrap(_arrayDimensionsErr, "Error parsing 'arrayDimensions' field of AdsDataTypeTableEntry")
 	}
 	arrayDimensions := _arrayDimensions
 
 	// Simple Field (numChildren)
-	_numChildren, _numChildrenErr := readBuffer.ReadUint16("numChildren", 16)
+_numChildren, _numChildrenErr := readBuffer.ReadUint16("numChildren", 16)
 	if _numChildrenErr != nil {
 		return nil, errors.Wrap(_numChildrenErr, "Error parsing 'numChildren' field of AdsDataTypeTableEntry")
 	}
 	numChildren := _numChildren
 
 	// Simple Field (name)
-	_name, _nameErr := readBuffer.ReadString("name", uint32((nameLength)*(8)))
+_name, _nameErr := readBuffer.ReadString("name", uint32((nameLength) * ((8))))
 	if _nameErr != nil {
 		return nil, errors.Wrap(_nameErr, "Error parsing 'name' field of AdsDataTypeTableEntry")
 	}
@@ -423,7 +428,7 @@ func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEn
 	}
 
 	// Simple Field (typeName)
-	_typeName, _typeNameErr := readBuffer.ReadString("typeName", uint32((typeNameLength)*(8)))
+_typeName, _typeNameErr := readBuffer.ReadString("typeName", uint32((typeNameLength) * ((8))))
 	if _typeNameErr != nil {
 		return nil, errors.Wrap(_typeNameErr, "Error parsing 'typeName' field of AdsDataTypeTableEntry")
 	}
@@ -439,7 +444,7 @@ func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEn
 	}
 
 	// Simple Field (comment)
-	_comment, _commentErr := readBuffer.ReadString("comment", uint32((commentLength)*(8)))
+_comment, _commentErr := readBuffer.ReadString("comment", uint32((commentLength) * ((8))))
 	if _commentErr != nil {
 		return nil, errors.Wrap(_commentErr, "Error parsing 'comment' field of AdsDataTypeTableEntry")
 	}
@@ -466,7 +471,7 @@ func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEn
 	}
 	{
 		for curItem := uint16(0); curItem < uint16(arrayDimensions); curItem++ {
-			_item, _err := AdsDataTypeArrayInfoParse(readBuffer)
+_item, _err := AdsDataTypeArrayInfoParse(readBuffer)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'arrayInfo' field of AdsDataTypeTableEntry")
 			}
@@ -489,7 +494,7 @@ func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEn
 	}
 	{
 		for curItem := uint16(0); curItem < uint16(numChildren); curItem++ {
-			_item, _err := AdsDataTypeTableEntryParse(readBuffer)
+_item, _err := AdsDataTypeTableEntryParse(readBuffer)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'children' field of AdsDataTypeTableEntry")
 			}
@@ -512,29 +517,29 @@ func AdsDataTypeTableEntryParse(readBuffer utils.ReadBuffer) (AdsDataTypeTableEn
 
 	// Create the instance
 	return &_AdsDataTypeTableEntry{
-		EntryLength:     entryLength,
-		Version:         version,
-		HashValue:       hashValue,
-		TypeHashValue:   typeHashValue,
-		Size:            size,
-		Offs:            offs,
-		DataType:        dataType,
-		Flags:           flags,
-		ArrayDimensions: arrayDimensions,
-		NumChildren:     numChildren,
-		Name:            name,
-		TypeName:        typeName,
-		Comment:         comment,
-		ArrayInfo:       arrayInfo,
-		Children:        children,
-		Rest:            rest,
-	}, nil
+			EntryLength: entryLength,
+			Version: version,
+			HashValue: hashValue,
+			TypeHashValue: typeHashValue,
+			Size: size,
+			Offs: offs,
+			DataType: dataType,
+			Flags: flags,
+			ArrayDimensions: arrayDimensions,
+			NumChildren: numChildren,
+			Name: name,
+			TypeName: typeName,
+			Comment: comment,
+			ArrayInfo: arrayInfo,
+			Children: children,
+			Rest: rest,
+		}, nil
 }
 
 func (m *_AdsDataTypeTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsDataTypeTableEntry"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsDataTypeTableEntry"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsDataTypeTableEntry")
 	}
 
@@ -631,7 +636,7 @@ func (m *_AdsDataTypeTableEntry) Serialize(writeBuffer utils.WriteBuffer) error
 
 	// Simple Field (name)
 	name := string(m.GetName())
-	_nameErr := writeBuffer.WriteString("name", uint32((GetSTR_LEN()(m.GetName()))*(8)), "UTF-8", (name))
+	_nameErr := writeBuffer.WriteString("name", uint32((GetSTR_LEN()(m.GetName())) * ((8))), "UTF-8", (name))
 	if _nameErr != nil {
 		return errors.Wrap(_nameErr, "Error serializing 'name' field")
 	}
@@ -644,7 +649,7 @@ func (m *_AdsDataTypeTableEntry) Serialize(writeBuffer utils.WriteBuffer) error
 
 	// Simple Field (typeName)
 	typeName := string(m.GetTypeName())
-	_typeNameErr := writeBuffer.WriteString("typeName", uint32((GetSTR_LEN()(m.GetTypeName()))*(8)), "UTF-8", (typeName))
+	_typeNameErr := writeBuffer.WriteString("typeName", uint32((GetSTR_LEN()(m.GetTypeName())) * ((8))), "UTF-8", (typeName))
 	if _typeNameErr != nil {
 		return errors.Wrap(_typeNameErr, "Error serializing 'typeName' field")
 	}
@@ -657,7 +662,7 @@ func (m *_AdsDataTypeTableEntry) Serialize(writeBuffer utils.WriteBuffer) error
 
 	// Simple Field (comment)
 	comment := string(m.GetComment())
-	_commentErr := writeBuffer.WriteString("comment", uint32((GetSTR_LEN()(m.GetComment()))*(8)), "UTF-8", (comment))
+	_commentErr := writeBuffer.WriteString("comment", uint32((GetSTR_LEN()(m.GetComment())) * ((8))), "UTF-8", (comment))
 	if _commentErr != nil {
 		return errors.Wrap(_commentErr, "Error serializing 'comment' field")
 	}
@@ -708,6 +713,7 @@ func (m *_AdsDataTypeTableEntry) Serialize(writeBuffer utils.WriteBuffer) error
 	return nil
 }
 
+
 func (m *_AdsDataTypeTableEntry) isAdsDataTypeTableEntry() bool {
 	return true
 }
@@ -722,3 +728,6 @@ func (m *_AdsDataTypeTableEntry) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go
index 8efecd629..358173744 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsDeleteDeviceNotificationRequest is the corresponding interface of AdsDeleteDeviceNotificationRequest
 type AdsDeleteDeviceNotificationRequest interface {
@@ -45,33 +47,32 @@ type AdsDeleteDeviceNotificationRequestExactly interface {
 // _AdsDeleteDeviceNotificationRequest is the data-structure of this message
 type _AdsDeleteDeviceNotificationRequest struct {
 	*_AdsData
-	NotificationHandle uint32
+        NotificationHandle uint32
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsDeleteDeviceNotificationRequest) GetCommandId() CommandId {
-	return CommandId_ADS_DELETE_DEVICE_NOTIFICATION
-}
+func (m *_AdsDeleteDeviceNotificationRequest)  GetCommandId() CommandId {
+return CommandId_ADS_DELETE_DEVICE_NOTIFICATION}
 
-func (m *_AdsDeleteDeviceNotificationRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsDeleteDeviceNotificationRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsDeleteDeviceNotificationRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsDeleteDeviceNotificationRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsDeleteDeviceNotificationRequest) GetParent() AdsData {
+func (m *_AdsDeleteDeviceNotificationRequest)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -86,11 +87,12 @@ func (m *_AdsDeleteDeviceNotificationRequest) GetNotificationHandle() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsDeleteDeviceNotificationRequest factory function for _AdsDeleteDeviceNotificationRequest
-func NewAdsDeleteDeviceNotificationRequest(notificationHandle uint32) *_AdsDeleteDeviceNotificationRequest {
+func NewAdsDeleteDeviceNotificationRequest( notificationHandle uint32 ) *_AdsDeleteDeviceNotificationRequest {
 	_result := &_AdsDeleteDeviceNotificationRequest{
 		NotificationHandle: notificationHandle,
-		_AdsData:           NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -98,7 +100,7 @@ func NewAdsDeleteDeviceNotificationRequest(notificationHandle uint32) *_AdsDelet
 
 // Deprecated: use the interface for direct cast
 func CastAdsDeleteDeviceNotificationRequest(structType interface{}) AdsDeleteDeviceNotificationRequest {
-	if casted, ok := structType.(AdsDeleteDeviceNotificationRequest); ok {
+    if casted, ok := structType.(AdsDeleteDeviceNotificationRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsDeleteDeviceNotificationRequest); ok {
@@ -119,11 +121,12 @@ func (m *_AdsDeleteDeviceNotificationRequest) GetLengthInBitsConditional(lastIte
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (notificationHandle)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	return lengthInBits
 }
 
+
 func (m *_AdsDeleteDeviceNotificationRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -138,7 +141,7 @@ func AdsDeleteDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, comman
 	_ = currentPos
 
 	// Simple Field (notificationHandle)
-	_notificationHandle, _notificationHandleErr := readBuffer.ReadUint32("notificationHandle", 32)
+_notificationHandle, _notificationHandleErr := readBuffer.ReadUint32("notificationHandle", 32)
 	if _notificationHandleErr != nil {
 		return nil, errors.Wrap(_notificationHandleErr, "Error parsing 'notificationHandle' field of AdsDeleteDeviceNotificationRequest")
 	}
@@ -150,7 +153,8 @@ func AdsDeleteDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, comman
 
 	// Create a partially initialized instance
 	_child := &_AdsDeleteDeviceNotificationRequest{
-		_AdsData:           &_AdsData{},
+		_AdsData: &_AdsData{
+		},
 		NotificationHandle: notificationHandle,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
@@ -165,12 +169,12 @@ func (m *_AdsDeleteDeviceNotificationRequest) Serialize(writeBuffer utils.WriteB
 			return errors.Wrap(pushErr, "Error pushing for AdsDeleteDeviceNotificationRequest")
 		}
 
-		// Simple Field (notificationHandle)
-		notificationHandle := uint32(m.GetNotificationHandle())
-		_notificationHandleErr := writeBuffer.WriteUint32("notificationHandle", 32, (notificationHandle))
-		if _notificationHandleErr != nil {
-			return errors.Wrap(_notificationHandleErr, "Error serializing 'notificationHandle' field")
-		}
+	// Simple Field (notificationHandle)
+	notificationHandle := uint32(m.GetNotificationHandle())
+	_notificationHandleErr := writeBuffer.WriteUint32("notificationHandle", 32, (notificationHandle))
+	if _notificationHandleErr != nil {
+		return errors.Wrap(_notificationHandleErr, "Error serializing 'notificationHandle' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsDeleteDeviceNotificationRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsDeleteDeviceNotificationRequest")
@@ -180,6 +184,7 @@ func (m *_AdsDeleteDeviceNotificationRequest) Serialize(writeBuffer utils.WriteB
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsDeleteDeviceNotificationRequest) isAdsDeleteDeviceNotificationRequest() bool {
 	return true
 }
@@ -194,3 +199,6 @@ func (m *_AdsDeleteDeviceNotificationRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go
index cabbe3415..dfa000538 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsDeleteDeviceNotificationResponse is the corresponding interface of AdsDeleteDeviceNotificationResponse
 type AdsDeleteDeviceNotificationResponse interface {
@@ -45,33 +47,32 @@ type AdsDeleteDeviceNotificationResponseExactly interface {
 // _AdsDeleteDeviceNotificationResponse is the data-structure of this message
 type _AdsDeleteDeviceNotificationResponse struct {
 	*_AdsData
-	Result ReturnCode
+        Result ReturnCode
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsDeleteDeviceNotificationResponse) GetCommandId() CommandId {
-	return CommandId_ADS_DELETE_DEVICE_NOTIFICATION
-}
+func (m *_AdsDeleteDeviceNotificationResponse)  GetCommandId() CommandId {
+return CommandId_ADS_DELETE_DEVICE_NOTIFICATION}
 
-func (m *_AdsDeleteDeviceNotificationResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsDeleteDeviceNotificationResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsDeleteDeviceNotificationResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsDeleteDeviceNotificationResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsDeleteDeviceNotificationResponse) GetParent() AdsData {
+func (m *_AdsDeleteDeviceNotificationResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -86,11 +87,12 @@ func (m *_AdsDeleteDeviceNotificationResponse) GetResult() ReturnCode {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsDeleteDeviceNotificationResponse factory function for _AdsDeleteDeviceNotificationResponse
-func NewAdsDeleteDeviceNotificationResponse(result ReturnCode) *_AdsDeleteDeviceNotificationResponse {
+func NewAdsDeleteDeviceNotificationResponse( result ReturnCode ) *_AdsDeleteDeviceNotificationResponse {
 	_result := &_AdsDeleteDeviceNotificationResponse{
-		Result:   result,
-		_AdsData: NewAdsData(),
+		Result: result,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -98,7 +100,7 @@ func NewAdsDeleteDeviceNotificationResponse(result ReturnCode) *_AdsDeleteDevice
 
 // Deprecated: use the interface for direct cast
 func CastAdsDeleteDeviceNotificationResponse(structType interface{}) AdsDeleteDeviceNotificationResponse {
-	if casted, ok := structType.(AdsDeleteDeviceNotificationResponse); ok {
+    if casted, ok := structType.(AdsDeleteDeviceNotificationResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsDeleteDeviceNotificationResponse); ok {
@@ -124,6 +126,7 @@ func (m *_AdsDeleteDeviceNotificationResponse) GetLengthInBitsConditional(lastIt
 	return lengthInBits
 }
 
+
 func (m *_AdsDeleteDeviceNotificationResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -141,7 +144,7 @@ func AdsDeleteDeviceNotificationResponseParse(readBuffer utils.ReadBuffer, comma
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsDeleteDeviceNotificationResponse")
 	}
@@ -156,8 +159,9 @@ func AdsDeleteDeviceNotificationResponseParse(readBuffer utils.ReadBuffer, comma
 
 	// Create a partially initialized instance
 	_child := &_AdsDeleteDeviceNotificationResponse{
-		_AdsData: &_AdsData{},
-		Result:   result,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -171,17 +175,17 @@ func (m *_AdsDeleteDeviceNotificationResponse) Serialize(writeBuffer utils.Write
 			return errors.Wrap(pushErr, "Error pushing for AdsDeleteDeviceNotificationResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsDeleteDeviceNotificationResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsDeleteDeviceNotificationResponse")
@@ -191,6 +195,7 @@ func (m *_AdsDeleteDeviceNotificationResponse) Serialize(writeBuffer utils.Write
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsDeleteDeviceNotificationResponse) isAdsDeleteDeviceNotificationResponse() bool {
 	return true
 }
@@ -205,3 +210,6 @@ func (m *_AdsDeleteDeviceNotificationResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go
index f19cb0c79..dafbdaa20 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsDeviceNotificationRequest is the corresponding interface of AdsDeviceNotificationRequest
 type AdsDeviceNotificationRequest interface {
@@ -49,35 +51,34 @@ type AdsDeviceNotificationRequestExactly interface {
 // _AdsDeviceNotificationRequest is the data-structure of this message
 type _AdsDeviceNotificationRequest struct {
 	*_AdsData
-	Length          uint32
-	Stamps          uint32
-	AdsStampHeaders []AdsStampHeader
+        Length uint32
+        Stamps uint32
+        AdsStampHeaders []AdsStampHeader
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsDeviceNotificationRequest) GetCommandId() CommandId {
-	return CommandId_ADS_DEVICE_NOTIFICATION
-}
+func (m *_AdsDeviceNotificationRequest)  GetCommandId() CommandId {
+return CommandId_ADS_DEVICE_NOTIFICATION}
 
-func (m *_AdsDeviceNotificationRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsDeviceNotificationRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsDeviceNotificationRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsDeviceNotificationRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsDeviceNotificationRequest) GetParent() AdsData {
+func (m *_AdsDeviceNotificationRequest)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -100,13 +101,14 @@ func (m *_AdsDeviceNotificationRequest) GetAdsStampHeaders() []AdsStampHeader {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsDeviceNotificationRequest factory function for _AdsDeviceNotificationRequest
-func NewAdsDeviceNotificationRequest(length uint32, stamps uint32, adsStampHeaders []AdsStampHeader) *_AdsDeviceNotificationRequest {
+func NewAdsDeviceNotificationRequest( length uint32 , stamps uint32 , adsStampHeaders []AdsStampHeader ) *_AdsDeviceNotificationRequest {
 	_result := &_AdsDeviceNotificationRequest{
-		Length:          length,
-		Stamps:          stamps,
+		Length: length,
+		Stamps: stamps,
 		AdsStampHeaders: adsStampHeaders,
-		_AdsData:        NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -114,7 +116,7 @@ func NewAdsDeviceNotificationRequest(length uint32, stamps uint32, adsStampHeade
 
 // Deprecated: use the interface for direct cast
 func CastAdsDeviceNotificationRequest(structType interface{}) AdsDeviceNotificationRequest {
-	if casted, ok := structType.(AdsDeviceNotificationRequest); ok {
+    if casted, ok := structType.(AdsDeviceNotificationRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsDeviceNotificationRequest); ok {
@@ -135,22 +137,23 @@ func (m *_AdsDeviceNotificationRequest) GetLengthInBitsConditional(lastItem bool
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (length)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (stamps)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Array field
 	if len(m.AdsStampHeaders) > 0 {
 		for i, element := range m.AdsStampHeaders {
-			last := i == len(m.AdsStampHeaders)-1
-			lengthInBits += element.(interface{ GetLengthInBitsConditional(bool) uint16 }).GetLengthInBitsConditional(last)
+			last := i == len(m.AdsStampHeaders) -1
+			lengthInBits += element.(interface{GetLengthInBitsConditional(bool) uint16}).GetLengthInBitsConditional(last)
 		}
 	}
 
 	return lengthInBits
 }
 
+
 func (m *_AdsDeviceNotificationRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -165,14 +168,14 @@ func AdsDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, commandId Co
 	_ = currentPos
 
 	// Simple Field (length)
-	_length, _lengthErr := readBuffer.ReadUint32("length", 32)
+_length, _lengthErr := readBuffer.ReadUint32("length", 32)
 	if _lengthErr != nil {
 		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsDeviceNotificationRequest")
 	}
 	length := _length
 
 	// Simple Field (stamps)
-	_stamps, _stampsErr := readBuffer.ReadUint32("stamps", 32)
+_stamps, _stampsErr := readBuffer.ReadUint32("stamps", 32)
 	if _stampsErr != nil {
 		return nil, errors.Wrap(_stampsErr, "Error parsing 'stamps' field of AdsDeviceNotificationRequest")
 	}
@@ -190,7 +193,7 @@ func AdsDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, commandId Co
 	}
 	{
 		for curItem := uint16(0); curItem < uint16(stamps); curItem++ {
-			_item, _err := AdsStampHeaderParse(readBuffer)
+_item, _err := AdsStampHeaderParse(readBuffer)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'adsStampHeaders' field of AdsDeviceNotificationRequest")
 			}
@@ -207,9 +210,10 @@ func AdsDeviceNotificationRequestParse(readBuffer utils.ReadBuffer, commandId Co
 
 	// Create a partially initialized instance
 	_child := &_AdsDeviceNotificationRequest{
-		_AdsData:        &_AdsData{},
-		Length:          length,
-		Stamps:          stamps,
+		_AdsData: &_AdsData{
+		},
+		Length: length,
+		Stamps: stamps,
 		AdsStampHeaders: adsStampHeaders,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
@@ -224,33 +228,33 @@ func (m *_AdsDeviceNotificationRequest) Serialize(writeBuffer utils.WriteBuffer)
 			return errors.Wrap(pushErr, "Error pushing for AdsDeviceNotificationRequest")
 		}
 
-		// Simple Field (length)
-		length := uint32(m.GetLength())
-		_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
-		if _lengthErr != nil {
-			return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-		}
+	// Simple Field (length)
+	length := uint32(m.GetLength())
+	_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
+	if _lengthErr != nil {
+		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
+	}
 
-		// Simple Field (stamps)
-		stamps := uint32(m.GetStamps())
-		_stampsErr := writeBuffer.WriteUint32("stamps", 32, (stamps))
-		if _stampsErr != nil {
-			return errors.Wrap(_stampsErr, "Error serializing 'stamps' field")
-		}
+	// Simple Field (stamps)
+	stamps := uint32(m.GetStamps())
+	_stampsErr := writeBuffer.WriteUint32("stamps", 32, (stamps))
+	if _stampsErr != nil {
+		return errors.Wrap(_stampsErr, "Error serializing 'stamps' field")
+	}
 
-		// Array Field (adsStampHeaders)
-		if pushErr := writeBuffer.PushContext("adsStampHeaders", utils.WithRenderAsList(true)); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for adsStampHeaders")
-		}
-		for _, _element := range m.GetAdsStampHeaders() {
-			_elementErr := writeBuffer.WriteSerializable(_element)
-			if _elementErr != nil {
-				return errors.Wrap(_elementErr, "Error serializing 'adsStampHeaders' field")
-			}
-		}
-		if popErr := writeBuffer.PopContext("adsStampHeaders", utils.WithRenderAsList(true)); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for adsStampHeaders")
+	// Array Field (adsStampHeaders)
+	if pushErr := writeBuffer.PushContext("adsStampHeaders", utils.WithRenderAsList(true)); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for adsStampHeaders")
+	}
+	for _, _element := range m.GetAdsStampHeaders() {
+		_elementErr := writeBuffer.WriteSerializable(_element)
+		if _elementErr != nil {
+			return errors.Wrap(_elementErr, "Error serializing 'adsStampHeaders' field")
 		}
+	}
+	if popErr := writeBuffer.PopContext("adsStampHeaders", utils.WithRenderAsList(true)); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for adsStampHeaders")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsDeviceNotificationRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsDeviceNotificationRequest")
@@ -260,6 +264,7 @@ func (m *_AdsDeviceNotificationRequest) Serialize(writeBuffer utils.WriteBuffer)
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsDeviceNotificationRequest) isAdsDeviceNotificationRequest() bool {
 	return true
 }
@@ -274,3 +279,6 @@ func (m *_AdsDeviceNotificationRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go
index 08b62eb62..b4006fe8d 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsDeviceNotificationResponse is the corresponding interface of AdsDeviceNotificationResponse
 type AdsDeviceNotificationResponse interface {
@@ -45,34 +47,35 @@ type _AdsDeviceNotificationResponse struct {
 	*_AdsData
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsDeviceNotificationResponse) GetCommandId() CommandId {
-	return CommandId_ADS_DEVICE_NOTIFICATION
-}
+func (m *_AdsDeviceNotificationResponse)  GetCommandId() CommandId {
+return CommandId_ADS_DEVICE_NOTIFICATION}
 
-func (m *_AdsDeviceNotificationResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsDeviceNotificationResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsDeviceNotificationResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsDeviceNotificationResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsDeviceNotificationResponse) GetParent() AdsData {
+func (m *_AdsDeviceNotificationResponse)  GetParent() AdsData {
 	return m._AdsData
 }
 
+
 // NewAdsDeviceNotificationResponse factory function for _AdsDeviceNotificationResponse
-func NewAdsDeviceNotificationResponse() *_AdsDeviceNotificationResponse {
+func NewAdsDeviceNotificationResponse( ) *_AdsDeviceNotificationResponse {
 	_result := &_AdsDeviceNotificationResponse{
-		_AdsData: NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -80,7 +83,7 @@ func NewAdsDeviceNotificationResponse() *_AdsDeviceNotificationResponse {
 
 // Deprecated: use the interface for direct cast
 func CastAdsDeviceNotificationResponse(structType interface{}) AdsDeviceNotificationResponse {
-	if casted, ok := structType.(AdsDeviceNotificationResponse); ok {
+    if casted, ok := structType.(AdsDeviceNotificationResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsDeviceNotificationResponse); ok {
@@ -103,6 +106,7 @@ func (m *_AdsDeviceNotificationResponse) GetLengthInBitsConditional(lastItem boo
 	return lengthInBits
 }
 
+
 func (m *_AdsDeviceNotificationResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -122,7 +126,8 @@ func AdsDeviceNotificationResponseParse(readBuffer utils.ReadBuffer, commandId C
 
 	// Create a partially initialized instance
 	_child := &_AdsDeviceNotificationResponse{
-		_AdsData: &_AdsData{},
+		_AdsData: &_AdsData{
+		},
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -144,6 +149,7 @@ func (m *_AdsDeviceNotificationResponse) Serialize(writeBuffer utils.WriteBuffer
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsDeviceNotificationResponse) isAdsDeviceNotificationResponse() bool {
 	return true
 }
@@ -158,3 +164,6 @@ func (m *_AdsDeviceNotificationResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go b/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go
index 5b2eac606..ea12c1d62 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsInvalidRequest is the corresponding interface of AdsInvalidRequest
 type AdsInvalidRequest interface {
@@ -45,34 +47,35 @@ type _AdsInvalidRequest struct {
 	*_AdsData
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsInvalidRequest) GetCommandId() CommandId {
-	return CommandId_INVALID
-}
+func (m *_AdsInvalidRequest)  GetCommandId() CommandId {
+return CommandId_INVALID}
 
-func (m *_AdsInvalidRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsInvalidRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsInvalidRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsInvalidRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsInvalidRequest) GetParent() AdsData {
+func (m *_AdsInvalidRequest)  GetParent() AdsData {
 	return m._AdsData
 }
 
+
 // NewAdsInvalidRequest factory function for _AdsInvalidRequest
-func NewAdsInvalidRequest() *_AdsInvalidRequest {
+func NewAdsInvalidRequest( ) *_AdsInvalidRequest {
 	_result := &_AdsInvalidRequest{
-		_AdsData: NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -80,7 +83,7 @@ func NewAdsInvalidRequest() *_AdsInvalidRequest {
 
 // Deprecated: use the interface for direct cast
 func CastAdsInvalidRequest(structType interface{}) AdsInvalidRequest {
-	if casted, ok := structType.(AdsInvalidRequest); ok {
+    if casted, ok := structType.(AdsInvalidRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsInvalidRequest); ok {
@@ -103,6 +106,7 @@ func (m *_AdsInvalidRequest) GetLengthInBitsConditional(lastItem bool) uint16 {
 	return lengthInBits
 }
 
+
 func (m *_AdsInvalidRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -122,7 +126,8 @@ func AdsInvalidRequestParse(readBuffer utils.ReadBuffer, commandId CommandId, re
 
 	// Create a partially initialized instance
 	_child := &_AdsInvalidRequest{
-		_AdsData: &_AdsData{},
+		_AdsData: &_AdsData{
+		},
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -144,6 +149,7 @@ func (m *_AdsInvalidRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsInvalidRequest) isAdsInvalidRequest() bool {
 	return true
 }
@@ -158,3 +164,6 @@ func (m *_AdsInvalidRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go b/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go
index 285f4cf82..14d1ad8c6 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsInvalidResponse is the corresponding interface of AdsInvalidResponse
 type AdsInvalidResponse interface {
@@ -45,34 +47,35 @@ type _AdsInvalidResponse struct {
 	*_AdsData
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsInvalidResponse) GetCommandId() CommandId {
-	return CommandId_INVALID
-}
+func (m *_AdsInvalidResponse)  GetCommandId() CommandId {
+return CommandId_INVALID}
 
-func (m *_AdsInvalidResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsInvalidResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsInvalidResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsInvalidResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsInvalidResponse) GetParent() AdsData {
+func (m *_AdsInvalidResponse)  GetParent() AdsData {
 	return m._AdsData
 }
 
+
 // NewAdsInvalidResponse factory function for _AdsInvalidResponse
-func NewAdsInvalidResponse() *_AdsInvalidResponse {
+func NewAdsInvalidResponse( ) *_AdsInvalidResponse {
 	_result := &_AdsInvalidResponse{
-		_AdsData: NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -80,7 +83,7 @@ func NewAdsInvalidResponse() *_AdsInvalidResponse {
 
 // Deprecated: use the interface for direct cast
 func CastAdsInvalidResponse(structType interface{}) AdsInvalidResponse {
-	if casted, ok := structType.(AdsInvalidResponse); ok {
+    if casted, ok := structType.(AdsInvalidResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsInvalidResponse); ok {
@@ -103,6 +106,7 @@ func (m *_AdsInvalidResponse) GetLengthInBitsConditional(lastItem bool) uint16 {
 	return lengthInBits
 }
 
+
 func (m *_AdsInvalidResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -122,7 +126,8 @@ func AdsInvalidResponseParse(readBuffer utils.ReadBuffer, commandId CommandId, r
 
 	// Create a partially initialized instance
 	_child := &_AdsInvalidResponse{
-		_AdsData: &_AdsData{},
+		_AdsData: &_AdsData{
+		},
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -144,6 +149,7 @@ func (m *_AdsInvalidResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsInvalidResponse) isAdsInvalidResponse() bool {
 	return true
 }
@@ -158,3 +164,6 @@ func (m *_AdsInvalidResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go
index 996fac631..241b10363 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsMultiRequestItem is the corresponding interface of AdsMultiRequestItem
 type AdsMultiRequestItem interface {
@@ -53,6 +55,7 @@ type _AdsMultiRequestItemChildRequirements interface {
 	GetIndexGroup() uint32
 }
 
+
 type AdsMultiRequestItemParent interface {
 	SerializeParent(writeBuffer utils.WriteBuffer, child AdsMultiRequestItem, serializeChildFunction func() error) error
 	GetTypeName() string
@@ -60,21 +63,22 @@ type AdsMultiRequestItemParent interface {
 
 type AdsMultiRequestItemChild interface {
 	utils.Serializable
-	InitializeParent(parent AdsMultiRequestItem)
+InitializeParent(parent AdsMultiRequestItem )
 	GetParent() *AdsMultiRequestItem
 
 	GetTypeName() string
 	AdsMultiRequestItem
 }
 
+
 // NewAdsMultiRequestItem factory function for _AdsMultiRequestItem
-func NewAdsMultiRequestItem() *_AdsMultiRequestItem {
-	return &_AdsMultiRequestItem{}
+func NewAdsMultiRequestItem( ) *_AdsMultiRequestItem {
+return &_AdsMultiRequestItem{ }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsMultiRequestItem(structType interface{}) AdsMultiRequestItem {
-	if casted, ok := structType.(AdsMultiRequestItem); ok {
+    if casted, ok := structType.(AdsMultiRequestItem); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsMultiRequestItem); ok {
@@ -87,6 +91,8 @@ func (m *_AdsMultiRequestItem) GetTypeName() string {
 	return "AdsMultiRequestItem"
 }
 
+
+
 func (m *_AdsMultiRequestItem) GetParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
 
@@ -109,18 +115,18 @@ func AdsMultiRequestItemParse(readBuffer utils.ReadBuffer, indexGroup uint32) (A
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type AdsMultiRequestItemChildSerializeRequirement interface {
 		AdsMultiRequestItem
-		InitializeParent(AdsMultiRequestItem)
+		InitializeParent(AdsMultiRequestItem )
 		GetParent() AdsMultiRequestItem
 	}
 	var _childTemp interface{}
 	var _child AdsMultiRequestItemChildSerializeRequirement
 	var typeSwitchError error
 	switch {
-	case indexGroup == uint32(61568): // AdsMultiRequestItemRead
+case indexGroup == uint32(61568) : // AdsMultiRequestItemRead
 		_childTemp, typeSwitchError = AdsMultiRequestItemReadParse(readBuffer, indexGroup)
-	case indexGroup == uint32(61569): // AdsMultiRequestItemWrite
+case indexGroup == uint32(61569) : // AdsMultiRequestItemWrite
 		_childTemp, typeSwitchError = AdsMultiRequestItemWriteParse(readBuffer, indexGroup)
-	case indexGroup == uint32(61570): // AdsMultiRequestItemReadWrite
+case indexGroup == uint32(61570) : // AdsMultiRequestItemReadWrite
 		_childTemp, typeSwitchError = AdsMultiRequestItemReadWriteParse(readBuffer, indexGroup)
 	default:
 		typeSwitchError = errors.Errorf("Unmapped type for parameters [indexGroup=%v]", indexGroup)
@@ -135,7 +141,7 @@ func AdsMultiRequestItemParse(readBuffer utils.ReadBuffer, indexGroup uint32) (A
 	}
 
 	// Finish initializing
-	_child.InitializeParent(_child)
+_child.InitializeParent(_child )
 	return _child, nil
 }
 
@@ -145,7 +151,7 @@ func (pm *_AdsMultiRequestItem) SerializeParent(writeBuffer utils.WriteBuffer, c
 	_ = m
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsMultiRequestItem"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsMultiRequestItem"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsMultiRequestItem")
 	}
 
@@ -160,6 +166,7 @@ func (pm *_AdsMultiRequestItem) SerializeParent(writeBuffer utils.WriteBuffer, c
 	return nil
 }
 
+
 func (m *_AdsMultiRequestItem) isAdsMultiRequestItem() bool {
 	return true
 }
@@ -174,3 +181,6 @@ func (m *_AdsMultiRequestItem) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go
index d7d85eb8b..29704ef0b 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsMultiRequestItemRead is the corresponding interface of AdsMultiRequestItemRead
 type AdsMultiRequestItemRead interface {
@@ -49,31 +51,31 @@ type AdsMultiRequestItemReadExactly interface {
 // _AdsMultiRequestItemRead is the data-structure of this message
 type _AdsMultiRequestItemRead struct {
 	*_AdsMultiRequestItem
-	ItemIndexGroup  uint32
-	ItemIndexOffset uint32
-	ItemReadLength  uint32
+        ItemIndexGroup uint32
+        ItemIndexOffset uint32
+        ItemReadLength uint32
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsMultiRequestItemRead) GetIndexGroup() uint32 {
-	return uint32(61568)
-}
+func (m *_AdsMultiRequestItemRead)  GetIndexGroup() uint32 {
+return uint32(61568)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsMultiRequestItemRead) InitializeParent(parent AdsMultiRequestItem) {}
+func (m *_AdsMultiRequestItemRead) InitializeParent(parent AdsMultiRequestItem ) {}
 
-func (m *_AdsMultiRequestItemRead) GetParent() AdsMultiRequestItem {
+func (m *_AdsMultiRequestItemRead)  GetParent() AdsMultiRequestItem {
 	return m._AdsMultiRequestItem
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -96,13 +98,14 @@ func (m *_AdsMultiRequestItemRead) GetItemReadLength() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsMultiRequestItemRead factory function for _AdsMultiRequestItemRead
-func NewAdsMultiRequestItemRead(itemIndexGroup uint32, itemIndexOffset uint32, itemReadLength uint32) *_AdsMultiRequestItemRead {
+func NewAdsMultiRequestItemRead( itemIndexGroup uint32 , itemIndexOffset uint32 , itemReadLength uint32 ) *_AdsMultiRequestItemRead {
 	_result := &_AdsMultiRequestItemRead{
-		ItemIndexGroup:       itemIndexGroup,
-		ItemIndexOffset:      itemIndexOffset,
-		ItemReadLength:       itemReadLength,
-		_AdsMultiRequestItem: NewAdsMultiRequestItem(),
+		ItemIndexGroup: itemIndexGroup,
+		ItemIndexOffset: itemIndexOffset,
+		ItemReadLength: itemReadLength,
+    	_AdsMultiRequestItem: NewAdsMultiRequestItem(),
 	}
 	_result._AdsMultiRequestItem._AdsMultiRequestItemChildRequirements = _result
 	return _result
@@ -110,7 +113,7 @@ func NewAdsMultiRequestItemRead(itemIndexGroup uint32, itemIndexOffset uint32, i
 
 // Deprecated: use the interface for direct cast
 func CastAdsMultiRequestItemRead(structType interface{}) AdsMultiRequestItemRead {
-	if casted, ok := structType.(AdsMultiRequestItemRead); ok {
+    if casted, ok := structType.(AdsMultiRequestItemRead); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsMultiRequestItemRead); ok {
@@ -131,17 +134,18 @@ func (m *_AdsMultiRequestItemRead) GetLengthInBitsConditional(lastItem bool) uin
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (itemIndexGroup)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (itemIndexOffset)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (itemReadLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	return lengthInBits
 }
 
+
 func (m *_AdsMultiRequestItemRead) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -156,21 +160,21 @@ func AdsMultiRequestItemReadParse(readBuffer utils.ReadBuffer, indexGroup uint32
 	_ = currentPos
 
 	// Simple Field (itemIndexGroup)
-	_itemIndexGroup, _itemIndexGroupErr := readBuffer.ReadUint32("itemIndexGroup", 32)
+_itemIndexGroup, _itemIndexGroupErr := readBuffer.ReadUint32("itemIndexGroup", 32)
 	if _itemIndexGroupErr != nil {
 		return nil, errors.Wrap(_itemIndexGroupErr, "Error parsing 'itemIndexGroup' field of AdsMultiRequestItemRead")
 	}
 	itemIndexGroup := _itemIndexGroup
 
 	// Simple Field (itemIndexOffset)
-	_itemIndexOffset, _itemIndexOffsetErr := readBuffer.ReadUint32("itemIndexOffset", 32)
+_itemIndexOffset, _itemIndexOffsetErr := readBuffer.ReadUint32("itemIndexOffset", 32)
 	if _itemIndexOffsetErr != nil {
 		return nil, errors.Wrap(_itemIndexOffsetErr, "Error parsing 'itemIndexOffset' field of AdsMultiRequestItemRead")
 	}
 	itemIndexOffset := _itemIndexOffset
 
 	// Simple Field (itemReadLength)
-	_itemReadLength, _itemReadLengthErr := readBuffer.ReadUint32("itemReadLength", 32)
+_itemReadLength, _itemReadLengthErr := readBuffer.ReadUint32("itemReadLength", 32)
 	if _itemReadLengthErr != nil {
 		return nil, errors.Wrap(_itemReadLengthErr, "Error parsing 'itemReadLength' field of AdsMultiRequestItemRead")
 	}
@@ -182,10 +186,11 @@ func AdsMultiRequestItemReadParse(readBuffer utils.ReadBuffer, indexGroup uint32
 
 	// Create a partially initialized instance
 	_child := &_AdsMultiRequestItemRead{
-		_AdsMultiRequestItem: &_AdsMultiRequestItem{},
-		ItemIndexGroup:       itemIndexGroup,
-		ItemIndexOffset:      itemIndexOffset,
-		ItemReadLength:       itemReadLength,
+		_AdsMultiRequestItem: &_AdsMultiRequestItem{
+		},
+		ItemIndexGroup: itemIndexGroup,
+		ItemIndexOffset: itemIndexOffset,
+		ItemReadLength: itemReadLength,
 	}
 	_child._AdsMultiRequestItem._AdsMultiRequestItemChildRequirements = _child
 	return _child, nil
@@ -199,26 +204,26 @@ func (m *_AdsMultiRequestItemRead) Serialize(writeBuffer utils.WriteBuffer) erro
 			return errors.Wrap(pushErr, "Error pushing for AdsMultiRequestItemRead")
 		}
 
-		// Simple Field (itemIndexGroup)
-		itemIndexGroup := uint32(m.GetItemIndexGroup())
-		_itemIndexGroupErr := writeBuffer.WriteUint32("itemIndexGroup", 32, (itemIndexGroup))
-		if _itemIndexGroupErr != nil {
-			return errors.Wrap(_itemIndexGroupErr, "Error serializing 'itemIndexGroup' field")
-		}
+	// Simple Field (itemIndexGroup)
+	itemIndexGroup := uint32(m.GetItemIndexGroup())
+	_itemIndexGroupErr := writeBuffer.WriteUint32("itemIndexGroup", 32, (itemIndexGroup))
+	if _itemIndexGroupErr != nil {
+		return errors.Wrap(_itemIndexGroupErr, "Error serializing 'itemIndexGroup' field")
+	}
 
-		// Simple Field (itemIndexOffset)
-		itemIndexOffset := uint32(m.GetItemIndexOffset())
-		_itemIndexOffsetErr := writeBuffer.WriteUint32("itemIndexOffset", 32, (itemIndexOffset))
-		if _itemIndexOffsetErr != nil {
-			return errors.Wrap(_itemIndexOffsetErr, "Error serializing 'itemIndexOffset' field")
-		}
+	// Simple Field (itemIndexOffset)
+	itemIndexOffset := uint32(m.GetItemIndexOffset())
+	_itemIndexOffsetErr := writeBuffer.WriteUint32("itemIndexOffset", 32, (itemIndexOffset))
+	if _itemIndexOffsetErr != nil {
+		return errors.Wrap(_itemIndexOffsetErr, "Error serializing 'itemIndexOffset' field")
+	}
 
-		// Simple Field (itemReadLength)
-		itemReadLength := uint32(m.GetItemReadLength())
-		_itemReadLengthErr := writeBuffer.WriteUint32("itemReadLength", 32, (itemReadLength))
-		if _itemReadLengthErr != nil {
-			return errors.Wrap(_itemReadLengthErr, "Error serializing 'itemReadLength' field")
-		}
+	// Simple Field (itemReadLength)
+	itemReadLength := uint32(m.GetItemReadLength())
+	_itemReadLengthErr := writeBuffer.WriteUint32("itemReadLength", 32, (itemReadLength))
+	if _itemReadLengthErr != nil {
+		return errors.Wrap(_itemReadLengthErr, "Error serializing 'itemReadLength' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsMultiRequestItemRead"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsMultiRequestItemRead")
@@ -228,6 +233,7 @@ func (m *_AdsMultiRequestItemRead) Serialize(writeBuffer utils.WriteBuffer) erro
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsMultiRequestItemRead) isAdsMultiRequestItemRead() bool {
 	return true
 }
@@ -242,3 +248,6 @@ func (m *_AdsMultiRequestItemRead) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go
index d1a2655b4..146dd551c 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsMultiRequestItemWrite is the corresponding interface of AdsMultiRequestItemWrite
 type AdsMultiRequestItemWrite interface {
@@ -49,31 +51,31 @@ type AdsMultiRequestItemWriteExactly interface {
 // _AdsMultiRequestItemWrite is the data-structure of this message
 type _AdsMultiRequestItemWrite struct {
 	*_AdsMultiRequestItem
-	ItemIndexGroup  uint32
-	ItemIndexOffset uint32
-	ItemWriteLength uint32
+        ItemIndexGroup uint32
+        ItemIndexOffset uint32
+        ItemWriteLength uint32
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsMultiRequestItemWrite) GetIndexGroup() uint32 {
-	return uint32(61569)
-}
+func (m *_AdsMultiRequestItemWrite)  GetIndexGroup() uint32 {
+return uint32(61569)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsMultiRequestItemWrite) InitializeParent(parent AdsMultiRequestItem) {}
+func (m *_AdsMultiRequestItemWrite) InitializeParent(parent AdsMultiRequestItem ) {}
 
-func (m *_AdsMultiRequestItemWrite) GetParent() AdsMultiRequestItem {
+func (m *_AdsMultiRequestItemWrite)  GetParent() AdsMultiRequestItem {
 	return m._AdsMultiRequestItem
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -96,13 +98,14 @@ func (m *_AdsMultiRequestItemWrite) GetItemWriteLength() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsMultiRequestItemWrite factory function for _AdsMultiRequestItemWrite
-func NewAdsMultiRequestItemWrite(itemIndexGroup uint32, itemIndexOffset uint32, itemWriteLength uint32) *_AdsMultiRequestItemWrite {
+func NewAdsMultiRequestItemWrite( itemIndexGroup uint32 , itemIndexOffset uint32 , itemWriteLength uint32 ) *_AdsMultiRequestItemWrite {
 	_result := &_AdsMultiRequestItemWrite{
-		ItemIndexGroup:       itemIndexGroup,
-		ItemIndexOffset:      itemIndexOffset,
-		ItemWriteLength:      itemWriteLength,
-		_AdsMultiRequestItem: NewAdsMultiRequestItem(),
+		ItemIndexGroup: itemIndexGroup,
+		ItemIndexOffset: itemIndexOffset,
+		ItemWriteLength: itemWriteLength,
+    	_AdsMultiRequestItem: NewAdsMultiRequestItem(),
 	}
 	_result._AdsMultiRequestItem._AdsMultiRequestItemChildRequirements = _result
 	return _result
@@ -110,7 +113,7 @@ func NewAdsMultiRequestItemWrite(itemIndexGroup uint32, itemIndexOffset uint32,
 
 // Deprecated: use the interface for direct cast
 func CastAdsMultiRequestItemWrite(structType interface{}) AdsMultiRequestItemWrite {
-	if casted, ok := structType.(AdsMultiRequestItemWrite); ok {
+    if casted, ok := structType.(AdsMultiRequestItemWrite); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsMultiRequestItemWrite); ok {
@@ -131,17 +134,18 @@ func (m *_AdsMultiRequestItemWrite) GetLengthInBitsConditional(lastItem bool) ui
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (itemIndexGroup)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (itemIndexOffset)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (itemWriteLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	return lengthInBits
 }
 
+
 func (m *_AdsMultiRequestItemWrite) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -156,21 +160,21 @@ func AdsMultiRequestItemWriteParse(readBuffer utils.ReadBuffer, indexGroup uint3
 	_ = currentPos
 
 	// Simple Field (itemIndexGroup)
-	_itemIndexGroup, _itemIndexGroupErr := readBuffer.ReadUint32("itemIndexGroup", 32)
+_itemIndexGroup, _itemIndexGroupErr := readBuffer.ReadUint32("itemIndexGroup", 32)
 	if _itemIndexGroupErr != nil {
 		return nil, errors.Wrap(_itemIndexGroupErr, "Error parsing 'itemIndexGroup' field of AdsMultiRequestItemWrite")
 	}
 	itemIndexGroup := _itemIndexGroup
 
 	// Simple Field (itemIndexOffset)
-	_itemIndexOffset, _itemIndexOffsetErr := readBuffer.ReadUint32("itemIndexOffset", 32)
+_itemIndexOffset, _itemIndexOffsetErr := readBuffer.ReadUint32("itemIndexOffset", 32)
 	if _itemIndexOffsetErr != nil {
 		return nil, errors.Wrap(_itemIndexOffsetErr, "Error parsing 'itemIndexOffset' field of AdsMultiRequestItemWrite")
 	}
 	itemIndexOffset := _itemIndexOffset
 
 	// Simple Field (itemWriteLength)
-	_itemWriteLength, _itemWriteLengthErr := readBuffer.ReadUint32("itemWriteLength", 32)
+_itemWriteLength, _itemWriteLengthErr := readBuffer.ReadUint32("itemWriteLength", 32)
 	if _itemWriteLengthErr != nil {
 		return nil, errors.Wrap(_itemWriteLengthErr, "Error parsing 'itemWriteLength' field of AdsMultiRequestItemWrite")
 	}
@@ -182,10 +186,11 @@ func AdsMultiRequestItemWriteParse(readBuffer utils.ReadBuffer, indexGroup uint3
 
 	// Create a partially initialized instance
 	_child := &_AdsMultiRequestItemWrite{
-		_AdsMultiRequestItem: &_AdsMultiRequestItem{},
-		ItemIndexGroup:       itemIndexGroup,
-		ItemIndexOffset:      itemIndexOffset,
-		ItemWriteLength:      itemWriteLength,
+		_AdsMultiRequestItem: &_AdsMultiRequestItem{
+		},
+		ItemIndexGroup: itemIndexGroup,
+		ItemIndexOffset: itemIndexOffset,
+		ItemWriteLength: itemWriteLength,
 	}
 	_child._AdsMultiRequestItem._AdsMultiRequestItemChildRequirements = _child
 	return _child, nil
@@ -199,26 +204,26 @@ func (m *_AdsMultiRequestItemWrite) Serialize(writeBuffer utils.WriteBuffer) err
 			return errors.Wrap(pushErr, "Error pushing for AdsMultiRequestItemWrite")
 		}
 
-		// Simple Field (itemIndexGroup)
-		itemIndexGroup := uint32(m.GetItemIndexGroup())
-		_itemIndexGroupErr := writeBuffer.WriteUint32("itemIndexGroup", 32, (itemIndexGroup))
-		if _itemIndexGroupErr != nil {
-			return errors.Wrap(_itemIndexGroupErr, "Error serializing 'itemIndexGroup' field")
-		}
+	// Simple Field (itemIndexGroup)
+	itemIndexGroup := uint32(m.GetItemIndexGroup())
+	_itemIndexGroupErr := writeBuffer.WriteUint32("itemIndexGroup", 32, (itemIndexGroup))
+	if _itemIndexGroupErr != nil {
+		return errors.Wrap(_itemIndexGroupErr, "Error serializing 'itemIndexGroup' field")
+	}
 
-		// Simple Field (itemIndexOffset)
-		itemIndexOffset := uint32(m.GetItemIndexOffset())
-		_itemIndexOffsetErr := writeBuffer.WriteUint32("itemIndexOffset", 32, (itemIndexOffset))
-		if _itemIndexOffsetErr != nil {
-			return errors.Wrap(_itemIndexOffsetErr, "Error serializing 'itemIndexOffset' field")
-		}
+	// Simple Field (itemIndexOffset)
+	itemIndexOffset := uint32(m.GetItemIndexOffset())
+	_itemIndexOffsetErr := writeBuffer.WriteUint32("itemIndexOffset", 32, (itemIndexOffset))
+	if _itemIndexOffsetErr != nil {
+		return errors.Wrap(_itemIndexOffsetErr, "Error serializing 'itemIndexOffset' field")
+	}
 
-		// Simple Field (itemWriteLength)
-		itemWriteLength := uint32(m.GetItemWriteLength())
-		_itemWriteLengthErr := writeBuffer.WriteUint32("itemWriteLength", 32, (itemWriteLength))
-		if _itemWriteLengthErr != nil {
-			return errors.Wrap(_itemWriteLengthErr, "Error serializing 'itemWriteLength' field")
-		}
+	// Simple Field (itemWriteLength)
+	itemWriteLength := uint32(m.GetItemWriteLength())
+	_itemWriteLengthErr := writeBuffer.WriteUint32("itemWriteLength", 32, (itemWriteLength))
+	if _itemWriteLengthErr != nil {
+		return errors.Wrap(_itemWriteLengthErr, "Error serializing 'itemWriteLength' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsMultiRequestItemWrite"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsMultiRequestItemWrite")
@@ -228,6 +233,7 @@ func (m *_AdsMultiRequestItemWrite) Serialize(writeBuffer utils.WriteBuffer) err
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsMultiRequestItemWrite) isAdsMultiRequestItemWrite() bool {
 	return true
 }
@@ -242,3 +248,6 @@ func (m *_AdsMultiRequestItemWrite) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go b/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go
index 60bf19a91..fe56705fc 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsNotificationSample is the corresponding interface of AdsNotificationSample
 type AdsNotificationSample interface {
@@ -47,11 +49,12 @@ type AdsNotificationSampleExactly interface {
 
 // _AdsNotificationSample is the data-structure of this message
 type _AdsNotificationSample struct {
-	NotificationHandle uint32
-	SampleSize         uint32
-	Data               []byte
+        NotificationHandle uint32
+        SampleSize uint32
+        Data []byte
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -74,14 +77,15 @@ func (m *_AdsNotificationSample) GetData() []byte {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsNotificationSample factory function for _AdsNotificationSample
-func NewAdsNotificationSample(notificationHandle uint32, sampleSize uint32, data []byte) *_AdsNotificationSample {
-	return &_AdsNotificationSample{NotificationHandle: notificationHandle, SampleSize: sampleSize, Data: data}
+func NewAdsNotificationSample( notificationHandle uint32 , sampleSize uint32 , data []byte ) *_AdsNotificationSample {
+return &_AdsNotificationSample{ NotificationHandle: notificationHandle , SampleSize: sampleSize , Data: data }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsNotificationSample(structType interface{}) AdsNotificationSample {
-	if casted, ok := structType.(AdsNotificationSample); ok {
+    if casted, ok := structType.(AdsNotificationSample); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsNotificationSample); ok {
@@ -102,10 +106,10 @@ func (m *_AdsNotificationSample) GetLengthInBitsConditional(lastItem bool) uint1
 	lengthInBits := uint16(0)
 
 	// Simple field (notificationHandle)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (sampleSize)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Array field
 	if len(m.Data) > 0 {
@@ -115,6 +119,7 @@ func (m *_AdsNotificationSample) GetLengthInBitsConditional(lastItem bool) uint1
 	return lengthInBits
 }
 
+
 func (m *_AdsNotificationSample) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -129,14 +134,14 @@ func AdsNotificationSampleParse(readBuffer utils.ReadBuffer) (AdsNotificationSam
 	_ = currentPos
 
 	// Simple Field (notificationHandle)
-	_notificationHandle, _notificationHandleErr := readBuffer.ReadUint32("notificationHandle", 32)
+_notificationHandle, _notificationHandleErr := readBuffer.ReadUint32("notificationHandle", 32)
 	if _notificationHandleErr != nil {
 		return nil, errors.Wrap(_notificationHandleErr, "Error parsing 'notificationHandle' field of AdsNotificationSample")
 	}
 	notificationHandle := _notificationHandle
 
 	// Simple Field (sampleSize)
-	_sampleSize, _sampleSizeErr := readBuffer.ReadUint32("sampleSize", 32)
+_sampleSize, _sampleSizeErr := readBuffer.ReadUint32("sampleSize", 32)
 	if _sampleSizeErr != nil {
 		return nil, errors.Wrap(_sampleSizeErr, "Error parsing 'sampleSize' field of AdsNotificationSample")
 	}
@@ -154,16 +159,16 @@ func AdsNotificationSampleParse(readBuffer utils.ReadBuffer) (AdsNotificationSam
 
 	// Create the instance
 	return &_AdsNotificationSample{
-		NotificationHandle: notificationHandle,
-		SampleSize:         sampleSize,
-		Data:               data,
-	}, nil
+			NotificationHandle: notificationHandle,
+			SampleSize: sampleSize,
+			Data: data,
+		}, nil
 }
 
 func (m *_AdsNotificationSample) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsNotificationSample"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsNotificationSample"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsNotificationSample")
 	}
 
@@ -193,6 +198,7 @@ func (m *_AdsNotificationSample) Serialize(writeBuffer utils.WriteBuffer) error
 	return nil
 }
 
+
 func (m *_AdsNotificationSample) isAdsNotificationSample() bool {
 	return true
 }
@@ -207,3 +213,6 @@ func (m *_AdsNotificationSample) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go
index 33370ce47..a713e2f76 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadDeviceInfoRequest is the corresponding interface of AdsReadDeviceInfoRequest
 type AdsReadDeviceInfoRequest interface {
@@ -45,34 +47,35 @@ type _AdsReadDeviceInfoRequest struct {
 	*_AdsData
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadDeviceInfoRequest) GetCommandId() CommandId {
-	return CommandId_ADS_READ_DEVICE_INFO
-}
+func (m *_AdsReadDeviceInfoRequest)  GetCommandId() CommandId {
+return CommandId_ADS_READ_DEVICE_INFO}
 
-func (m *_AdsReadDeviceInfoRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsReadDeviceInfoRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadDeviceInfoRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsReadDeviceInfoRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadDeviceInfoRequest) GetParent() AdsData {
+func (m *_AdsReadDeviceInfoRequest)  GetParent() AdsData {
 	return m._AdsData
 }
 
+
 // NewAdsReadDeviceInfoRequest factory function for _AdsReadDeviceInfoRequest
-func NewAdsReadDeviceInfoRequest() *_AdsReadDeviceInfoRequest {
+func NewAdsReadDeviceInfoRequest( ) *_AdsReadDeviceInfoRequest {
 	_result := &_AdsReadDeviceInfoRequest{
-		_AdsData: NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -80,7 +83,7 @@ func NewAdsReadDeviceInfoRequest() *_AdsReadDeviceInfoRequest {
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadDeviceInfoRequest(structType interface{}) AdsReadDeviceInfoRequest {
-	if casted, ok := structType.(AdsReadDeviceInfoRequest); ok {
+    if casted, ok := structType.(AdsReadDeviceInfoRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadDeviceInfoRequest); ok {
@@ -103,6 +106,7 @@ func (m *_AdsReadDeviceInfoRequest) GetLengthInBitsConditional(lastItem bool) ui
 	return lengthInBits
 }
 
+
 func (m *_AdsReadDeviceInfoRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -122,7 +126,8 @@ func AdsReadDeviceInfoRequestParse(readBuffer utils.ReadBuffer, commandId Comman
 
 	// Create a partially initialized instance
 	_child := &_AdsReadDeviceInfoRequest{
-		_AdsData: &_AdsData{},
+		_AdsData: &_AdsData{
+		},
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -144,6 +149,7 @@ func (m *_AdsReadDeviceInfoRequest) Serialize(writeBuffer utils.WriteBuffer) err
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadDeviceInfoRequest) isAdsReadDeviceInfoRequest() bool {
 	return true
 }
@@ -158,3 +164,6 @@ func (m *_AdsReadDeviceInfoRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go
index d9a9d24ae..3b20cee72 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadDeviceInfoResponse is the corresponding interface of AdsReadDeviceInfoResponse
 type AdsReadDeviceInfoResponse interface {
@@ -53,37 +55,36 @@ type AdsReadDeviceInfoResponseExactly interface {
 // _AdsReadDeviceInfoResponse is the data-structure of this message
 type _AdsReadDeviceInfoResponse struct {
 	*_AdsData
-	Result       ReturnCode
-	MajorVersion uint8
-	MinorVersion uint8
-	Version      uint16
-	Device       []byte
+        Result ReturnCode
+        MajorVersion uint8
+        MinorVersion uint8
+        Version uint16
+        Device []byte
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadDeviceInfoResponse) GetCommandId() CommandId {
-	return CommandId_ADS_READ_DEVICE_INFO
-}
+func (m *_AdsReadDeviceInfoResponse)  GetCommandId() CommandId {
+return CommandId_ADS_READ_DEVICE_INFO}
 
-func (m *_AdsReadDeviceInfoResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsReadDeviceInfoResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadDeviceInfoResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsReadDeviceInfoResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadDeviceInfoResponse) GetParent() AdsData {
+func (m *_AdsReadDeviceInfoResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -114,15 +115,16 @@ func (m *_AdsReadDeviceInfoResponse) GetDevice() []byte {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsReadDeviceInfoResponse factory function for _AdsReadDeviceInfoResponse
-func NewAdsReadDeviceInfoResponse(result ReturnCode, majorVersion uint8, minorVersion uint8, version uint16, device []byte) *_AdsReadDeviceInfoResponse {
+func NewAdsReadDeviceInfoResponse( result ReturnCode , majorVersion uint8 , minorVersion uint8 , version uint16 , device []byte ) *_AdsReadDeviceInfoResponse {
 	_result := &_AdsReadDeviceInfoResponse{
-		Result:       result,
+		Result: result,
 		MajorVersion: majorVersion,
 		MinorVersion: minorVersion,
-		Version:      version,
-		Device:       device,
-		_AdsData:     NewAdsData(),
+		Version: version,
+		Device: device,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -130,7 +132,7 @@ func NewAdsReadDeviceInfoResponse(result ReturnCode, majorVersion uint8, minorVe
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadDeviceInfoResponse(structType interface{}) AdsReadDeviceInfoResponse {
-	if casted, ok := structType.(AdsReadDeviceInfoResponse); ok {
+    if casted, ok := structType.(AdsReadDeviceInfoResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadDeviceInfoResponse); ok {
@@ -154,13 +156,13 @@ func (m *_AdsReadDeviceInfoResponse) GetLengthInBitsConditional(lastItem bool) u
 	lengthInBits += 32
 
 	// Simple field (majorVersion)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (minorVersion)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (version)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Array field
 	if len(m.Device) > 0 {
@@ -170,6 +172,7 @@ func (m *_AdsReadDeviceInfoResponse) GetLengthInBitsConditional(lastItem bool) u
 	return lengthInBits
 }
 
+
 func (m *_AdsReadDeviceInfoResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -187,7 +190,7 @@ func AdsReadDeviceInfoResponseParse(readBuffer utils.ReadBuffer, commandId Comma
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadDeviceInfoResponse")
 	}
@@ -197,21 +200,21 @@ func AdsReadDeviceInfoResponseParse(readBuffer utils.ReadBuffer, commandId Comma
 	}
 
 	// Simple Field (majorVersion)
-	_majorVersion, _majorVersionErr := readBuffer.ReadUint8("majorVersion", 8)
+_majorVersion, _majorVersionErr := readBuffer.ReadUint8("majorVersion", 8)
 	if _majorVersionErr != nil {
 		return nil, errors.Wrap(_majorVersionErr, "Error parsing 'majorVersion' field of AdsReadDeviceInfoResponse")
 	}
 	majorVersion := _majorVersion
 
 	// Simple Field (minorVersion)
-	_minorVersion, _minorVersionErr := readBuffer.ReadUint8("minorVersion", 8)
+_minorVersion, _minorVersionErr := readBuffer.ReadUint8("minorVersion", 8)
 	if _minorVersionErr != nil {
 		return nil, errors.Wrap(_minorVersionErr, "Error parsing 'minorVersion' field of AdsReadDeviceInfoResponse")
 	}
 	minorVersion := _minorVersion
 
 	// Simple Field (version)
-	_version, _versionErr := readBuffer.ReadUint16("version", 16)
+_version, _versionErr := readBuffer.ReadUint16("version", 16)
 	if _versionErr != nil {
 		return nil, errors.Wrap(_versionErr, "Error parsing 'version' field of AdsReadDeviceInfoResponse")
 	}
@@ -229,12 +232,13 @@ func AdsReadDeviceInfoResponseParse(readBuffer utils.ReadBuffer, commandId Comma
 
 	// Create a partially initialized instance
 	_child := &_AdsReadDeviceInfoResponse{
-		_AdsData:     &_AdsData{},
-		Result:       result,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
 		MajorVersion: majorVersion,
 		MinorVersion: minorVersion,
-		Version:      version,
-		Device:       device,
+		Version: version,
+		Device: device,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -248,44 +252,44 @@ func (m *_AdsReadDeviceInfoResponse) Serialize(writeBuffer utils.WriteBuffer) er
 			return errors.Wrap(pushErr, "Error pushing for AdsReadDeviceInfoResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
-		// Simple Field (majorVersion)
-		majorVersion := uint8(m.GetMajorVersion())
-		_majorVersionErr := writeBuffer.WriteUint8("majorVersion", 8, (majorVersion))
-		if _majorVersionErr != nil {
-			return errors.Wrap(_majorVersionErr, "Error serializing 'majorVersion' field")
-		}
+	// Simple Field (majorVersion)
+	majorVersion := uint8(m.GetMajorVersion())
+	_majorVersionErr := writeBuffer.WriteUint8("majorVersion", 8, (majorVersion))
+	if _majorVersionErr != nil {
+		return errors.Wrap(_majorVersionErr, "Error serializing 'majorVersion' field")
+	}
 
-		// Simple Field (minorVersion)
-		minorVersion := uint8(m.GetMinorVersion())
-		_minorVersionErr := writeBuffer.WriteUint8("minorVersion", 8, (minorVersion))
-		if _minorVersionErr != nil {
-			return errors.Wrap(_minorVersionErr, "Error serializing 'minorVersion' field")
-		}
+	// Simple Field (minorVersion)
+	minorVersion := uint8(m.GetMinorVersion())
+	_minorVersionErr := writeBuffer.WriteUint8("minorVersion", 8, (minorVersion))
+	if _minorVersionErr != nil {
+		return errors.Wrap(_minorVersionErr, "Error serializing 'minorVersion' field")
+	}
 
-		// Simple Field (version)
-		version := uint16(m.GetVersion())
-		_versionErr := writeBuffer.WriteUint16("version", 16, (version))
-		if _versionErr != nil {
-			return errors.Wrap(_versionErr, "Error serializing 'version' field")
-		}
+	// Simple Field (version)
+	version := uint16(m.GetVersion())
+	_versionErr := writeBuffer.WriteUint16("version", 16, (version))
+	if _versionErr != nil {
+		return errors.Wrap(_versionErr, "Error serializing 'version' field")
+	}
 
-		// Array Field (device)
-		// Byte Array field (device)
-		if err := writeBuffer.WriteByteArray("device", m.GetDevice()); err != nil {
-			return errors.Wrap(err, "Error serializing 'device' field")
-		}
+	// Array Field (device)
+	// Byte Array field (device)
+	if err := writeBuffer.WriteByteArray("device", m.GetDevice()); err != nil {
+		return errors.Wrap(err, "Error serializing 'device' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsReadDeviceInfoResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsReadDeviceInfoResponse")
@@ -295,6 +299,7 @@ func (m *_AdsReadDeviceInfoResponse) Serialize(writeBuffer utils.WriteBuffer) er
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadDeviceInfoResponse) isAdsReadDeviceInfoResponse() bool {
 	return true
 }
@@ -309,3 +314,6 @@ func (m *_AdsReadDeviceInfoResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go
index 5c5d52488..24da46931 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadRequest is the corresponding interface of AdsReadRequest
 type AdsReadRequest interface {
@@ -49,35 +51,34 @@ type AdsReadRequestExactly interface {
 // _AdsReadRequest is the data-structure of this message
 type _AdsReadRequest struct {
 	*_AdsData
-	IndexGroup  uint32
-	IndexOffset uint32
-	Length      uint32
+        IndexGroup uint32
+        IndexOffset uint32
+        Length uint32
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadRequest) GetCommandId() CommandId {
-	return CommandId_ADS_READ
-}
+func (m *_AdsReadRequest)  GetCommandId() CommandId {
+return CommandId_ADS_READ}
 
-func (m *_AdsReadRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsReadRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsReadRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadRequest) GetParent() AdsData {
+func (m *_AdsReadRequest)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -100,13 +101,14 @@ func (m *_AdsReadRequest) GetLength() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsReadRequest factory function for _AdsReadRequest
-func NewAdsReadRequest(indexGroup uint32, indexOffset uint32, length uint32) *_AdsReadRequest {
+func NewAdsReadRequest( indexGroup uint32 , indexOffset uint32 , length uint32 ) *_AdsReadRequest {
 	_result := &_AdsReadRequest{
-		IndexGroup:  indexGroup,
+		IndexGroup: indexGroup,
 		IndexOffset: indexOffset,
-		Length:      length,
-		_AdsData:    NewAdsData(),
+		Length: length,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -114,7 +116,7 @@ func NewAdsReadRequest(indexGroup uint32, indexOffset uint32, length uint32) *_A
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadRequest(structType interface{}) AdsReadRequest {
-	if casted, ok := structType.(AdsReadRequest); ok {
+    if casted, ok := structType.(AdsReadRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadRequest); ok {
@@ -135,17 +137,18 @@ func (m *_AdsReadRequest) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (indexGroup)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (indexOffset)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (length)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	return lengthInBits
 }
 
+
 func (m *_AdsReadRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -160,21 +163,21 @@ func AdsReadRequestParse(readBuffer utils.ReadBuffer, commandId CommandId, respo
 	_ = currentPos
 
 	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
+_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
 	if _indexGroupErr != nil {
 		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsReadRequest")
 	}
 	indexGroup := _indexGroup
 
 	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
+_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
 	if _indexOffsetErr != nil {
 		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsReadRequest")
 	}
 	indexOffset := _indexOffset
 
 	// Simple Field (length)
-	_length, _lengthErr := readBuffer.ReadUint32("length", 32)
+_length, _lengthErr := readBuffer.ReadUint32("length", 32)
 	if _lengthErr != nil {
 		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsReadRequest")
 	}
@@ -186,10 +189,11 @@ func AdsReadRequestParse(readBuffer utils.ReadBuffer, commandId CommandId, respo
 
 	// Create a partially initialized instance
 	_child := &_AdsReadRequest{
-		_AdsData:    &_AdsData{},
-		IndexGroup:  indexGroup,
+		_AdsData: &_AdsData{
+		},
+		IndexGroup: indexGroup,
 		IndexOffset: indexOffset,
-		Length:      length,
+		Length: length,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -203,26 +207,26 @@ func (m *_AdsReadRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for AdsReadRequest")
 		}
 
-		// Simple Field (indexGroup)
-		indexGroup := uint32(m.GetIndexGroup())
-		_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
-		if _indexGroupErr != nil {
-			return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
-		}
+	// Simple Field (indexGroup)
+	indexGroup := uint32(m.GetIndexGroup())
+	_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
+	if _indexGroupErr != nil {
+		return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
+	}
 
-		// Simple Field (indexOffset)
-		indexOffset := uint32(m.GetIndexOffset())
-		_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
-		if _indexOffsetErr != nil {
-			return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
-		}
+	// Simple Field (indexOffset)
+	indexOffset := uint32(m.GetIndexOffset())
+	_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
+	if _indexOffsetErr != nil {
+		return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
+	}
 
-		// Simple Field (length)
-		length := uint32(m.GetLength())
-		_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
-		if _lengthErr != nil {
-			return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-		}
+	// Simple Field (length)
+	length := uint32(m.GetLength())
+	_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
+	if _lengthErr != nil {
+		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsReadRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsReadRequest")
@@ -232,6 +236,7 @@ func (m *_AdsReadRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadRequest) isAdsReadRequest() bool {
 	return true
 }
@@ -246,3 +251,6 @@ func (m *_AdsReadRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
index 1feb852d5..99269837c 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadResponse is the corresponding interface of AdsReadResponse
 type AdsReadResponse interface {
@@ -47,34 +49,33 @@ type AdsReadResponseExactly interface {
 // _AdsReadResponse is the data-structure of this message
 type _AdsReadResponse struct {
 	*_AdsData
-	Result ReturnCode
-	Data   []byte
+        Result ReturnCode
+        Data []byte
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadResponse) GetCommandId() CommandId {
-	return CommandId_ADS_READ
-}
+func (m *_AdsReadResponse)  GetCommandId() CommandId {
+return CommandId_ADS_READ}
 
-func (m *_AdsReadResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsReadResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsReadResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadResponse) GetParent() AdsData {
+func (m *_AdsReadResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -93,12 +94,13 @@ func (m *_AdsReadResponse) GetData() []byte {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsReadResponse factory function for _AdsReadResponse
-func NewAdsReadResponse(result ReturnCode, data []byte) *_AdsReadResponse {
+func NewAdsReadResponse( result ReturnCode , data []byte ) *_AdsReadResponse {
 	_result := &_AdsReadResponse{
-		Result:   result,
-		Data:     data,
-		_AdsData: NewAdsData(),
+		Result: result,
+		Data: data,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -106,7 +108,7 @@ func NewAdsReadResponse(result ReturnCode, data []byte) *_AdsReadResponse {
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadResponse(structType interface{}) AdsReadResponse {
-	if casted, ok := structType.(AdsReadResponse); ok {
+    if casted, ok := structType.(AdsReadResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadResponse); ok {
@@ -140,6 +142,7 @@ func (m *_AdsReadResponse) GetLengthInBitsConditional(lastItem bool) uint16 {
 	return lengthInBits
 }
 
+
 func (m *_AdsReadResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -157,7 +160,7 @@ func AdsReadResponseParse(readBuffer utils.ReadBuffer, commandId CommandId, resp
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadResponse")
 	}
@@ -185,9 +188,10 @@ func AdsReadResponseParse(readBuffer utils.ReadBuffer, commandId CommandId, resp
 
 	// Create a partially initialized instance
 	_child := &_AdsReadResponse{
-		_AdsData: &_AdsData{},
-		Result:   result,
-		Data:     data,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
+		Data: data,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -201,30 +205,30 @@ func (m *_AdsReadResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for AdsReadResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
-		// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-		length := uint32(uint32(len(m.GetData())))
-		_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
-		if _lengthErr != nil {
-			return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-		}
+	// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	length := uint32(uint32(len(m.GetData())))
+	_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
+	if _lengthErr != nil {
+		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
+	}
 
-		// Array Field (data)
-		// Byte Array field (data)
-		if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
-			return errors.Wrap(err, "Error serializing 'data' field")
-		}
+	// Array Field (data)
+	// Byte Array field (data)
+	if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
+		return errors.Wrap(err, "Error serializing 'data' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsReadResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsReadResponse")
@@ -234,6 +238,7 @@ func (m *_AdsReadResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadResponse) isAdsReadResponse() bool {
 	return true
 }
@@ -248,3 +253,6 @@ func (m *_AdsReadResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go
index 9aed6df93..4828f44e0 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadStateRequest is the corresponding interface of AdsReadStateRequest
 type AdsReadStateRequest interface {
@@ -45,34 +47,35 @@ type _AdsReadStateRequest struct {
 	*_AdsData
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadStateRequest) GetCommandId() CommandId {
-	return CommandId_ADS_READ_STATE
-}
+func (m *_AdsReadStateRequest)  GetCommandId() CommandId {
+return CommandId_ADS_READ_STATE}
 
-func (m *_AdsReadStateRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsReadStateRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadStateRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsReadStateRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadStateRequest) GetParent() AdsData {
+func (m *_AdsReadStateRequest)  GetParent() AdsData {
 	return m._AdsData
 }
 
+
 // NewAdsReadStateRequest factory function for _AdsReadStateRequest
-func NewAdsReadStateRequest() *_AdsReadStateRequest {
+func NewAdsReadStateRequest( ) *_AdsReadStateRequest {
 	_result := &_AdsReadStateRequest{
-		_AdsData: NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -80,7 +83,7 @@ func NewAdsReadStateRequest() *_AdsReadStateRequest {
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadStateRequest(structType interface{}) AdsReadStateRequest {
-	if casted, ok := structType.(AdsReadStateRequest); ok {
+    if casted, ok := structType.(AdsReadStateRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadStateRequest); ok {
@@ -103,6 +106,7 @@ func (m *_AdsReadStateRequest) GetLengthInBitsConditional(lastItem bool) uint16
 	return lengthInBits
 }
 
+
 func (m *_AdsReadStateRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -122,7 +126,8 @@ func AdsReadStateRequestParse(readBuffer utils.ReadBuffer, commandId CommandId,
 
 	// Create a partially initialized instance
 	_child := &_AdsReadStateRequest{
-		_AdsData: &_AdsData{},
+		_AdsData: &_AdsData{
+		},
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -144,6 +149,7 @@ func (m *_AdsReadStateRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadStateRequest) isAdsReadStateRequest() bool {
 	return true
 }
@@ -158,3 +164,6 @@ func (m *_AdsReadStateRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go
index 01e177692..1f6fd7717 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadStateResponse is the corresponding interface of AdsReadStateResponse
 type AdsReadStateResponse interface {
@@ -49,35 +51,34 @@ type AdsReadStateResponseExactly interface {
 // _AdsReadStateResponse is the data-structure of this message
 type _AdsReadStateResponse struct {
 	*_AdsData
-	Result      ReturnCode
-	AdsState    uint16
-	DeviceState uint16
+        Result ReturnCode
+        AdsState uint16
+        DeviceState uint16
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadStateResponse) GetCommandId() CommandId {
-	return CommandId_ADS_READ_STATE
-}
+func (m *_AdsReadStateResponse)  GetCommandId() CommandId {
+return CommandId_ADS_READ_STATE}
 
-func (m *_AdsReadStateResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsReadStateResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadStateResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsReadStateResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadStateResponse) GetParent() AdsData {
+func (m *_AdsReadStateResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -100,13 +101,14 @@ func (m *_AdsReadStateResponse) GetDeviceState() uint16 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsReadStateResponse factory function for _AdsReadStateResponse
-func NewAdsReadStateResponse(result ReturnCode, adsState uint16, deviceState uint16) *_AdsReadStateResponse {
+func NewAdsReadStateResponse( result ReturnCode , adsState uint16 , deviceState uint16 ) *_AdsReadStateResponse {
 	_result := &_AdsReadStateResponse{
-		Result:      result,
-		AdsState:    adsState,
+		Result: result,
+		AdsState: adsState,
 		DeviceState: deviceState,
-		_AdsData:    NewAdsData(),
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -114,7 +116,7 @@ func NewAdsReadStateResponse(result ReturnCode, adsState uint16, deviceState uin
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadStateResponse(structType interface{}) AdsReadStateResponse {
-	if casted, ok := structType.(AdsReadStateResponse); ok {
+    if casted, ok := structType.(AdsReadStateResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadStateResponse); ok {
@@ -138,14 +140,15 @@ func (m *_AdsReadStateResponse) GetLengthInBitsConditional(lastItem bool) uint16
 	lengthInBits += 32
 
 	// Simple field (adsState)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Simple field (deviceState)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	return lengthInBits
 }
 
+
 func (m *_AdsReadStateResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -163,7 +166,7 @@ func AdsReadStateResponseParse(readBuffer utils.ReadBuffer, commandId CommandId,
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadStateResponse")
 	}
@@ -173,14 +176,14 @@ func AdsReadStateResponseParse(readBuffer utils.ReadBuffer, commandId CommandId,
 	}
 
 	// Simple Field (adsState)
-	_adsState, _adsStateErr := readBuffer.ReadUint16("adsState", 16)
+_adsState, _adsStateErr := readBuffer.ReadUint16("adsState", 16)
 	if _adsStateErr != nil {
 		return nil, errors.Wrap(_adsStateErr, "Error parsing 'adsState' field of AdsReadStateResponse")
 	}
 	adsState := _adsState
 
 	// Simple Field (deviceState)
-	_deviceState, _deviceStateErr := readBuffer.ReadUint16("deviceState", 16)
+_deviceState, _deviceStateErr := readBuffer.ReadUint16("deviceState", 16)
 	if _deviceStateErr != nil {
 		return nil, errors.Wrap(_deviceStateErr, "Error parsing 'deviceState' field of AdsReadStateResponse")
 	}
@@ -192,9 +195,10 @@ func AdsReadStateResponseParse(readBuffer utils.ReadBuffer, commandId CommandId,
 
 	// Create a partially initialized instance
 	_child := &_AdsReadStateResponse{
-		_AdsData:    &_AdsData{},
-		Result:      result,
-		AdsState:    adsState,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
+		AdsState: adsState,
 		DeviceState: deviceState,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
@@ -209,31 +213,31 @@ func (m *_AdsReadStateResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for AdsReadStateResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
-		// Simple Field (adsState)
-		adsState := uint16(m.GetAdsState())
-		_adsStateErr := writeBuffer.WriteUint16("adsState", 16, (adsState))
-		if _adsStateErr != nil {
-			return errors.Wrap(_adsStateErr, "Error serializing 'adsState' field")
-		}
+	// Simple Field (adsState)
+	adsState := uint16(m.GetAdsState())
+	_adsStateErr := writeBuffer.WriteUint16("adsState", 16, (adsState))
+	if _adsStateErr != nil {
+		return errors.Wrap(_adsStateErr, "Error serializing 'adsState' field")
+	}
 
-		// Simple Field (deviceState)
-		deviceState := uint16(m.GetDeviceState())
-		_deviceStateErr := writeBuffer.WriteUint16("deviceState", 16, (deviceState))
-		if _deviceStateErr != nil {
-			return errors.Wrap(_deviceStateErr, "Error serializing 'deviceState' field")
-		}
+	// Simple Field (deviceState)
+	deviceState := uint16(m.GetDeviceState())
+	_deviceStateErr := writeBuffer.WriteUint16("deviceState", 16, (deviceState))
+	if _deviceStateErr != nil {
+		return errors.Wrap(_deviceStateErr, "Error serializing 'deviceState' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsReadStateResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsReadStateResponse")
@@ -243,6 +247,7 @@ func (m *_AdsReadStateResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadStateResponse) isAdsReadStateResponse() bool {
 	return true
 }
@@ -257,3 +262,6 @@ func (m *_AdsReadStateResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
index 2851a7dbc..3bfe453a7 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadWriteRequest is the corresponding interface of AdsReadWriteRequest
 type AdsReadWriteRequest interface {
@@ -53,37 +55,36 @@ type AdsReadWriteRequestExactly interface {
 // _AdsReadWriteRequest is the data-structure of this message
 type _AdsReadWriteRequest struct {
 	*_AdsData
-	IndexGroup  uint32
-	IndexOffset uint32
-	ReadLength  uint32
-	Items       []AdsMultiRequestItem
-	Data        []byte
+        IndexGroup uint32
+        IndexOffset uint32
+        ReadLength uint32
+        Items []AdsMultiRequestItem
+        Data []byte
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadWriteRequest) GetCommandId() CommandId {
-	return CommandId_ADS_READ_WRITE
-}
+func (m *_AdsReadWriteRequest)  GetCommandId() CommandId {
+return CommandId_ADS_READ_WRITE}
 
-func (m *_AdsReadWriteRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsReadWriteRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadWriteRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsReadWriteRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadWriteRequest) GetParent() AdsData {
+func (m *_AdsReadWriteRequest)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -114,15 +115,16 @@ func (m *_AdsReadWriteRequest) GetData() []byte {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsReadWriteRequest factory function for _AdsReadWriteRequest
-func NewAdsReadWriteRequest(indexGroup uint32, indexOffset uint32, readLength uint32, items []AdsMultiRequestItem, data []byte) *_AdsReadWriteRequest {
+func NewAdsReadWriteRequest( indexGroup uint32 , indexOffset uint32 , readLength uint32 , items []AdsMultiRequestItem , data []byte ) *_AdsReadWriteRequest {
 	_result := &_AdsReadWriteRequest{
-		IndexGroup:  indexGroup,
+		IndexGroup: indexGroup,
 		IndexOffset: indexOffset,
-		ReadLength:  readLength,
-		Items:       items,
-		Data:        data,
-		_AdsData:    NewAdsData(),
+		ReadLength: readLength,
+		Items: items,
+		Data: data,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -130,7 +132,7 @@ func NewAdsReadWriteRequest(indexGroup uint32, indexOffset uint32, readLength ui
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadWriteRequest(structType interface{}) AdsReadWriteRequest {
-	if casted, ok := structType.(AdsReadWriteRequest); ok {
+    if casted, ok := structType.(AdsReadWriteRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadWriteRequest); ok {
@@ -151,13 +153,13 @@ func (m *_AdsReadWriteRequest) GetLengthInBitsConditional(lastItem bool) uint16
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (indexGroup)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (indexOffset)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (readLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Implicit Field (writeLength)
 	lengthInBits += 32
@@ -165,8 +167,8 @@ func (m *_AdsReadWriteRequest) GetLengthInBitsConditional(lastItem bool) uint16
 	// Array field
 	if len(m.Items) > 0 {
 		for i, element := range m.Items {
-			last := i == len(m.Items)-1
-			lengthInBits += element.(interface{ GetLengthInBitsConditional(bool) uint16 }).GetLengthInBitsConditional(last)
+			last := i == len(m.Items) -1
+			lengthInBits += element.(interface{GetLengthInBitsConditional(bool) uint16}).GetLengthInBitsConditional(last)
 		}
 	}
 
@@ -178,6 +180,7 @@ func (m *_AdsReadWriteRequest) GetLengthInBitsConditional(lastItem bool) uint16
 	return lengthInBits
 }
 
+
 func (m *_AdsReadWriteRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -192,21 +195,21 @@ func AdsReadWriteRequestParse(readBuffer utils.ReadBuffer, commandId CommandId,
 	_ = currentPos
 
 	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
+_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
 	if _indexGroupErr != nil {
 		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsReadWriteRequest")
 	}
 	indexGroup := _indexGroup
 
 	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
+_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
 	if _indexOffsetErr != nil {
 		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsReadWriteRequest")
 	}
 	indexOffset := _indexOffset
 
 	// Simple Field (readLength)
-	_readLength, _readLengthErr := readBuffer.ReadUint32("readLength", 32)
+_readLength, _readLengthErr := readBuffer.ReadUint32("readLength", 32)
 	if _readLengthErr != nil {
 		return nil, errors.Wrap(_readLengthErr, "Error parsing 'readLength' field of AdsReadWriteRequest")
 	}
@@ -224,14 +227,14 @@ func AdsReadWriteRequestParse(readBuffer utils.ReadBuffer, commandId CommandId,
 		return nil, errors.Wrap(pullErr, "Error pulling for items")
 	}
 	// Count array
-	items := make([]AdsMultiRequestItem, utils.InlineIf((bool(bool((bool((indexGroup) == (61568)))) || bool((bool((indexGroup) == (61569))))) || bool((bool((indexGroup) == (61570))))), func() interface{} { return uint16(indexOffset) }, func() interface{} { return uint16(uint16(0)) }).(uint16))
+	items := make([]AdsMultiRequestItem, utils.InlineIf((bool(bool((bool((indexGroup) == ((61568))))) || bool((bool((indexGroup) == ((61569)))))) || bool((bool((indexGroup) == ((61570)))))), func() interface{} {return uint16(indexOffset)}, func() interface{} {return uint16(uint16(0))}).(uint16))
 	// This happens when the size is set conditional to 0
 	if len(items) == 0 {
 		items = nil
 	}
 	{
-		for curItem := uint16(0); curItem < uint16(utils.InlineIf((bool(bool((bool((indexGroup) == (61568)))) || bool((bool((indexGroup) == (61569))))) || bool((bool((indexGroup) == (61570))))), func() interface{} { return uint16(indexOffset) }, func() interface{} { return uint16(uint16(0)) }).(uint16)); curItem++ {
-			_item, _err := AdsMultiRequestItemParse(readBuffer, indexGroup)
+		for curItem := uint16(0); curItem < uint16(utils.InlineIf((bool(bool((bool((indexGroup) == ((61568))))) || bool((bool((indexGroup) == ((61569)))))) || bool((bool((indexGroup) == ((61570)))))), func() interface{} {return uint16(indexOffset)}, func() interface{} {return uint16(uint16(0))}).(uint16)); curItem++ {
+_item, _err := AdsMultiRequestItemParse(readBuffer , indexGroup )
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'items' field of AdsReadWriteRequest")
 			}
@@ -254,12 +257,13 @@ func AdsReadWriteRequestParse(readBuffer utils.ReadBuffer, commandId CommandId,
 
 	// Create a partially initialized instance
 	_child := &_AdsReadWriteRequest{
-		_AdsData:    &_AdsData{},
-		IndexGroup:  indexGroup,
+		_AdsData: &_AdsData{
+		},
+		IndexGroup: indexGroup,
 		IndexOffset: indexOffset,
-		ReadLength:  readLength,
-		Items:       items,
-		Data:        data,
+		ReadLength: readLength,
+		Items: items,
+		Data: data,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -273,53 +277,53 @@ func (m *_AdsReadWriteRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for AdsReadWriteRequest")
 		}
 
-		// Simple Field (indexGroup)
-		indexGroup := uint32(m.GetIndexGroup())
-		_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
-		if _indexGroupErr != nil {
-			return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
-		}
+	// Simple Field (indexGroup)
+	indexGroup := uint32(m.GetIndexGroup())
+	_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
+	if _indexGroupErr != nil {
+		return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
+	}
 
-		// Simple Field (indexOffset)
-		indexOffset := uint32(m.GetIndexOffset())
-		_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
-		if _indexOffsetErr != nil {
-			return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
-		}
+	// Simple Field (indexOffset)
+	indexOffset := uint32(m.GetIndexOffset())
+	_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
+	if _indexOffsetErr != nil {
+		return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
+	}
 
-		// Simple Field (readLength)
-		readLength := uint32(m.GetReadLength())
-		_readLengthErr := writeBuffer.WriteUint32("readLength", 32, (readLength))
-		if _readLengthErr != nil {
-			return errors.Wrap(_readLengthErr, "Error serializing 'readLength' field")
-		}
+	// Simple Field (readLength)
+	readLength := uint32(m.GetReadLength())
+	_readLengthErr := writeBuffer.WriteUint32("readLength", 32, (readLength))
+	if _readLengthErr != nil {
+		return errors.Wrap(_readLengthErr, "Error serializing 'readLength' field")
+	}
 
-		// Implicit Field (writeLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-		writeLength := uint32(uint32((uint32(uint32(len(m.GetItems()))) * uint32((utils.InlineIf((bool((m.GetIndexGroup()) == (61570))), func() interface{} { return uint32(uint32(16)) }, func() interface{} { return uint32(uint32(12)) }).(uint32))))) + uint32(uint32(len(m.GetData()))))
-		_writeLengthErr := writeBuffer.WriteUint32("writeLength", 32, (writeLength))
-		if _writeLengthErr != nil {
-			return errors.Wrap(_writeLengthErr, "Error serializing 'writeLength' field")
-		}
+	// Implicit Field (writeLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	writeLength := uint32(uint32((uint32(uint32(len(m.GetItems()))) * uint32((utils.InlineIf((bool((m.GetIndexGroup()) == ((61570)))), func() interface{} {return uint32(uint32(16))}, func() interface{} {return uint32(uint32(12))}).(uint32))))) + uint32(uint32(len(m.GetData()))))
+	_writeLengthErr := writeBuffer.WriteUint32("writeLength", 32, (writeLength))
+	if _writeLengthErr != nil {
+		return errors.Wrap(_writeLengthErr, "Error serializing 'writeLength' field")
+	}
 
-		// Array Field (items)
-		if pushErr := writeBuffer.PushContext("items", utils.WithRenderAsList(true)); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for items")
-		}
-		for _, _element := range m.GetItems() {
-			_elementErr := writeBuffer.WriteSerializable(_element)
-			if _elementErr != nil {
-				return errors.Wrap(_elementErr, "Error serializing 'items' field")
-			}
-		}
-		if popErr := writeBuffer.PopContext("items", utils.WithRenderAsList(true)); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for items")
+	// Array Field (items)
+	if pushErr := writeBuffer.PushContext("items", utils.WithRenderAsList(true)); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for items")
+	}
+	for _, _element := range m.GetItems() {
+		_elementErr := writeBuffer.WriteSerializable(_element)
+		if _elementErr != nil {
+			return errors.Wrap(_elementErr, "Error serializing 'items' field")
 		}
+	}
+	if popErr := writeBuffer.PopContext("items", utils.WithRenderAsList(true)); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for items")
+	}
 
-		// Array Field (data)
-		// Byte Array field (data)
-		if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
-			return errors.Wrap(err, "Error serializing 'data' field")
-		}
+	// Array Field (data)
+	// Byte Array field (data)
+	if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
+		return errors.Wrap(err, "Error serializing 'data' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsReadWriteRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsReadWriteRequest")
@@ -329,6 +333,7 @@ func (m *_AdsReadWriteRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadWriteRequest) isAdsReadWriteRequest() bool {
 	return true
 }
@@ -343,3 +348,6 @@ func (m *_AdsReadWriteRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
index 99832025b..5bddb3fa7 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsReadWriteResponse is the corresponding interface of AdsReadWriteResponse
 type AdsReadWriteResponse interface {
@@ -47,34 +49,33 @@ type AdsReadWriteResponseExactly interface {
 // _AdsReadWriteResponse is the data-structure of this message
 type _AdsReadWriteResponse struct {
 	*_AdsData
-	Result ReturnCode
-	Data   []byte
+        Result ReturnCode
+        Data []byte
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsReadWriteResponse) GetCommandId() CommandId {
-	return CommandId_ADS_READ_WRITE
-}
+func (m *_AdsReadWriteResponse)  GetCommandId() CommandId {
+return CommandId_ADS_READ_WRITE}
 
-func (m *_AdsReadWriteResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsReadWriteResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsReadWriteResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsReadWriteResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsReadWriteResponse) GetParent() AdsData {
+func (m *_AdsReadWriteResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -93,12 +94,13 @@ func (m *_AdsReadWriteResponse) GetData() []byte {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsReadWriteResponse factory function for _AdsReadWriteResponse
-func NewAdsReadWriteResponse(result ReturnCode, data []byte) *_AdsReadWriteResponse {
+func NewAdsReadWriteResponse( result ReturnCode , data []byte ) *_AdsReadWriteResponse {
 	_result := &_AdsReadWriteResponse{
-		Result:   result,
-		Data:     data,
-		_AdsData: NewAdsData(),
+		Result: result,
+		Data: data,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -106,7 +108,7 @@ func NewAdsReadWriteResponse(result ReturnCode, data []byte) *_AdsReadWriteRespo
 
 // Deprecated: use the interface for direct cast
 func CastAdsReadWriteResponse(structType interface{}) AdsReadWriteResponse {
-	if casted, ok := structType.(AdsReadWriteResponse); ok {
+    if casted, ok := structType.(AdsReadWriteResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsReadWriteResponse); ok {
@@ -140,6 +142,7 @@ func (m *_AdsReadWriteResponse) GetLengthInBitsConditional(lastItem bool) uint16
 	return lengthInBits
 }
 
+
 func (m *_AdsReadWriteResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -157,7 +160,7 @@ func AdsReadWriteResponseParse(readBuffer utils.ReadBuffer, commandId CommandId,
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadWriteResponse")
 	}
@@ -185,9 +188,10 @@ func AdsReadWriteResponseParse(readBuffer utils.ReadBuffer, commandId CommandId,
 
 	// Create a partially initialized instance
 	_child := &_AdsReadWriteResponse{
-		_AdsData: &_AdsData{},
-		Result:   result,
-		Data:     data,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
+		Data: data,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -201,30 +205,30 @@ func (m *_AdsReadWriteResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for AdsReadWriteResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
-		// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-		length := uint32(uint32(len(m.GetData())))
-		_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
-		if _lengthErr != nil {
-			return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-		}
+	// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	length := uint32(uint32(len(m.GetData())))
+	_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
+	if _lengthErr != nil {
+		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
+	}
 
-		// Array Field (data)
-		// Byte Array field (data)
-		if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
-			return errors.Wrap(err, "Error serializing 'data' field")
-		}
+	// Array Field (data)
+	// Byte Array field (data)
+	if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
+		return errors.Wrap(err, "Error serializing 'data' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsReadWriteResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsReadWriteResponse")
@@ -234,6 +238,7 @@ func (m *_AdsReadWriteResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsReadWriteResponse) isAdsReadWriteResponse() bool {
 	return true
 }
@@ -248,3 +253,6 @@ func (m *_AdsReadWriteResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsSignificantGroupAddresses.go b/plc4go/protocols/ads/readwrite/model/AdsSignificantGroupAddresses.go
index 8f70a6bba..970816701 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsSignificantGroupAddresses.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsSignificantGroupAddresses.go
@@ -34,17 +34,17 @@ type IAdsSignificantGroupAddresses interface {
 	Serialize(writeBuffer utils.WriteBuffer) error
 }
 
-const (
-	AdsSignificantGroupAddresses_SYMBOL_TABLE    AdsSignificantGroupAddresses = 0x0000F00B
+const(
+	AdsSignificantGroupAddresses_SYMBOL_TABLE AdsSignificantGroupAddresses = 0x0000F00B
 	AdsSignificantGroupAddresses_DATA_TYPE_TABLE AdsSignificantGroupAddresses = 0x0000F00E
-	AdsSignificantGroupAddresses_TABLE_SIZES     AdsSignificantGroupAddresses = 0x0000F00F
+	AdsSignificantGroupAddresses_TABLE_SIZES AdsSignificantGroupAddresses = 0x0000F00F
 )
 
 var AdsSignificantGroupAddressesValues []AdsSignificantGroupAddresses
 
 func init() {
 	_ = errors.New
-	AdsSignificantGroupAddressesValues = []AdsSignificantGroupAddresses{
+	AdsSignificantGroupAddressesValues = []AdsSignificantGroupAddresses {
 		AdsSignificantGroupAddresses_SYMBOL_TABLE,
 		AdsSignificantGroupAddresses_DATA_TYPE_TABLE,
 		AdsSignificantGroupAddresses_TABLE_SIZES,
@@ -53,12 +53,12 @@ func init() {
 
 func AdsSignificantGroupAddressesByValue(value uint32) (enum AdsSignificantGroupAddresses, ok bool) {
 	switch value {
-	case 0x0000F00B:
-		return AdsSignificantGroupAddresses_SYMBOL_TABLE, true
-	case 0x0000F00E:
-		return AdsSignificantGroupAddresses_DATA_TYPE_TABLE, true
-	case 0x0000F00F:
-		return AdsSignificantGroupAddresses_TABLE_SIZES, true
+		case 0x0000F00B:
+			return AdsSignificantGroupAddresses_SYMBOL_TABLE, true
+		case 0x0000F00E:
+			return AdsSignificantGroupAddresses_DATA_TYPE_TABLE, true
+		case 0x0000F00F:
+			return AdsSignificantGroupAddresses_TABLE_SIZES, true
 	}
 	return 0, false
 }
@@ -75,13 +75,13 @@ func AdsSignificantGroupAddressesByName(value string) (enum AdsSignificantGroupA
 	return 0, false
 }
 
-func AdsSignificantGroupAddressesKnows(value uint32) bool {
+func AdsSignificantGroupAddressesKnows(value uint32)  bool {
 	for _, typeValue := range AdsSignificantGroupAddressesValues {
 		if uint32(typeValue) == value {
 			return true
 		}
 	}
-	return false
+	return false;
 }
 
 func CastAdsSignificantGroupAddresses(structType interface{}) AdsSignificantGroupAddresses {
@@ -135,3 +135,4 @@ func (e AdsSignificantGroupAddresses) PLC4XEnumName() string {
 func (e AdsSignificantGroupAddresses) String() string {
 	return e.PLC4XEnumName()
 }
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go b/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go
index be7256bdd..24a6a626e 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsStampHeader is the corresponding interface of AdsStampHeader
 type AdsStampHeader interface {
@@ -47,11 +49,12 @@ type AdsStampHeaderExactly interface {
 
 // _AdsStampHeader is the data-structure of this message
 type _AdsStampHeader struct {
-	Timestamp              uint64
-	Samples                uint32
-	AdsNotificationSamples []AdsNotificationSample
+        Timestamp uint64
+        Samples uint32
+        AdsNotificationSamples []AdsNotificationSample
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -74,14 +77,15 @@ func (m *_AdsStampHeader) GetAdsNotificationSamples() []AdsNotificationSample {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsStampHeader factory function for _AdsStampHeader
-func NewAdsStampHeader(timestamp uint64, samples uint32, adsNotificationSamples []AdsNotificationSample) *_AdsStampHeader {
-	return &_AdsStampHeader{Timestamp: timestamp, Samples: samples, AdsNotificationSamples: adsNotificationSamples}
+func NewAdsStampHeader( timestamp uint64 , samples uint32 , adsNotificationSamples []AdsNotificationSample ) *_AdsStampHeader {
+return &_AdsStampHeader{ Timestamp: timestamp , Samples: samples , AdsNotificationSamples: adsNotificationSamples }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsStampHeader(structType interface{}) AdsStampHeader {
-	if casted, ok := structType.(AdsStampHeader); ok {
+    if casted, ok := structType.(AdsStampHeader); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsStampHeader); ok {
@@ -102,22 +106,23 @@ func (m *_AdsStampHeader) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(0)
 
 	// Simple field (timestamp)
-	lengthInBits += 64
+	lengthInBits += 64;
 
 	// Simple field (samples)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Array field
 	if len(m.AdsNotificationSamples) > 0 {
 		for i, element := range m.AdsNotificationSamples {
-			last := i == len(m.AdsNotificationSamples)-1
-			lengthInBits += element.(interface{ GetLengthInBitsConditional(bool) uint16 }).GetLengthInBitsConditional(last)
+			last := i == len(m.AdsNotificationSamples) -1
+			lengthInBits += element.(interface{GetLengthInBitsConditional(bool) uint16}).GetLengthInBitsConditional(last)
 		}
 	}
 
 	return lengthInBits
 }
 
+
 func (m *_AdsStampHeader) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -132,14 +137,14 @@ func AdsStampHeaderParse(readBuffer utils.ReadBuffer) (AdsStampHeader, error) {
 	_ = currentPos
 
 	// Simple Field (timestamp)
-	_timestamp, _timestampErr := readBuffer.ReadUint64("timestamp", 64)
+_timestamp, _timestampErr := readBuffer.ReadUint64("timestamp", 64)
 	if _timestampErr != nil {
 		return nil, errors.Wrap(_timestampErr, "Error parsing 'timestamp' field of AdsStampHeader")
 	}
 	timestamp := _timestamp
 
 	// Simple Field (samples)
-	_samples, _samplesErr := readBuffer.ReadUint32("samples", 32)
+_samples, _samplesErr := readBuffer.ReadUint32("samples", 32)
 	if _samplesErr != nil {
 		return nil, errors.Wrap(_samplesErr, "Error parsing 'samples' field of AdsStampHeader")
 	}
@@ -157,7 +162,7 @@ func AdsStampHeaderParse(readBuffer utils.ReadBuffer) (AdsStampHeader, error) {
 	}
 	{
 		for curItem := uint16(0); curItem < uint16(samples); curItem++ {
-			_item, _err := AdsNotificationSampleParse(readBuffer)
+_item, _err := AdsNotificationSampleParse(readBuffer)
 			if _err != nil {
 				return nil, errors.Wrap(_err, "Error parsing 'adsNotificationSamples' field of AdsStampHeader")
 			}
@@ -174,16 +179,16 @@ func AdsStampHeaderParse(readBuffer utils.ReadBuffer) (AdsStampHeader, error) {
 
 	// Create the instance
 	return &_AdsStampHeader{
-		Timestamp:              timestamp,
-		Samples:                samples,
-		AdsNotificationSamples: adsNotificationSamples,
-	}, nil
+			Timestamp: timestamp,
+			Samples: samples,
+			AdsNotificationSamples: adsNotificationSamples,
+		}, nil
 }
 
 func (m *_AdsStampHeader) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsStampHeader"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsStampHeader"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsStampHeader")
 	}
 
@@ -221,6 +226,7 @@ func (m *_AdsStampHeader) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+
 func (m *_AdsStampHeader) isAdsStampHeader() bool {
 	return true
 }
@@ -235,3 +241,6 @@ func (m *_AdsStampHeader) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
index 6c4a3920a..81b98ee1b 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
@@ -19,6 +19,7 @@
 
 package model
 
+
 import (
 	"fmt"
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
@@ -26,11 +27,12 @@ import (
 	"github.com/rs/zerolog/log"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // Constant values.
 const AdsSymbolTableEntry_NAMETERMINATOR uint8 = 0x00
-const AdsSymbolTableEntry_TYPENAMETERMINATOR uint8 = 0x00
+const AdsSymbolTableEntry_DATATYPENAMETERMINATOR uint8 = 0x00
 const AdsSymbolTableEntry_COMMENTTERMINATOR uint8 = 0x00
 
 // AdsSymbolTableEntry is the corresponding interface of AdsSymbolTableEntry
@@ -75,8 +77,8 @@ type AdsSymbolTableEntry interface {
 	GetFlagContextMask() bool
 	// GetName returns Name (property field)
 	GetName() string
-	// GetTypeName returns TypeName (property field)
-	GetTypeName() string
+	// GetDataTypeName returns DataTypeName (property field)
+	GetDataTypeName() string
 	// GetComment returns Comment (property field)
 	GetComment() string
 	// GetRest returns Rest (property field)
@@ -92,33 +94,34 @@ type AdsSymbolTableEntryExactly interface {
 
 // _AdsSymbolTableEntry is the data-structure of this message
 type _AdsSymbolTableEntry struct {
-	EntryLength              uint32
-	Group                    uint32
-	Offset                   uint32
-	Size                     uint32
-	DataType                 uint32
-	FlagMethodDeref          bool
-	FlagItfMethodAccess      bool
-	FlagReadOnly             bool
-	FlagTComInterfacePointer bool
-	FlagTypeGuid             bool
-	FlagReferenceTo          bool
-	FlagBitValue             bool
-	FlagPersistent           bool
-	FlagExtendedFlags        bool
-	FlagInitOnReset          bool
-	FlagStatic               bool
-	FlagAttributes           bool
-	FlagContextMask          bool
-	Name                     string
-	TypeName                 string
-	Comment                  string
-	Rest                     []byte
+        EntryLength uint32
+        Group uint32
+        Offset uint32
+        Size uint32
+        DataType uint32
+        FlagMethodDeref bool
+        FlagItfMethodAccess bool
+        FlagReadOnly bool
+        FlagTComInterfacePointer bool
+        FlagTypeGuid bool
+        FlagReferenceTo bool
+        FlagBitValue bool
+        FlagPersistent bool
+        FlagExtendedFlags bool
+        FlagInitOnReset bool
+        FlagStatic bool
+        FlagAttributes bool
+        FlagContextMask bool
+        Name string
+        DataTypeName string
+        Comment string
+        Rest []byte
 	// Reserved Fields
 	reservedField0 *uint8
 	reservedField1 *uint16
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -200,8 +203,8 @@ func (m *_AdsSymbolTableEntry) GetName() string {
 	return m.Name
 }
 
-func (m *_AdsSymbolTableEntry) GetTypeName() string {
-	return m.TypeName
+func (m *_AdsSymbolTableEntry) GetDataTypeName() string {
+	return m.DataTypeName
 }
 
 func (m *_AdsSymbolTableEntry) GetComment() string {
@@ -225,8 +228,8 @@ func (m *_AdsSymbolTableEntry) GetNameTerminator() uint8 {
 	return AdsSymbolTableEntry_NAMETERMINATOR
 }
 
-func (m *_AdsSymbolTableEntry) GetTypeNameTerminator() uint8 {
-	return AdsSymbolTableEntry_TYPENAMETERMINATOR
+func (m *_AdsSymbolTableEntry) GetDataTypeNameTerminator() uint8 {
+	return AdsSymbolTableEntry_DATATYPENAMETERMINATOR
 }
 
 func (m *_AdsSymbolTableEntry) GetCommentTerminator() uint8 {
@@ -238,14 +241,15 @@ func (m *_AdsSymbolTableEntry) GetCommentTerminator() uint8 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsSymbolTableEntry factory function for _AdsSymbolTableEntry
-func NewAdsSymbolTableEntry(entryLength uint32, group uint32, offset uint32, size uint32, dataType uint32, flagMethodDeref bool, flagItfMethodAccess bool, flagReadOnly bool, flagTComInterfacePointer bool, flagTypeGuid bool, flagReferenceTo bool, flagBitValue bool, flagPersistent bool, flagExtendedFlags bool, flagInitOnReset bool, flagStatic bool, flagAttributes bool, flagContextMask bool, name string, typeName string, comment string, rest []byte) *_AdsSymbolTableEntry {
-	return &_AdsSymbolTableEntry{EntryLength: entryLength, Group: group, Offset: offset, Size: size, DataType: dataType, FlagMethodDeref: flagMethodDeref, FlagItfMethodAccess: flagItfMethodAccess, FlagReadOnly: flagReadOnly, FlagTComInterfacePointer: flagTComInterfacePointer, FlagTypeGuid: flagTypeGuid, FlagReferenceTo: flagReferenceTo, FlagBitValue: flagBitValue, FlagPersistent: flagPersistent, FlagExtendedFlags: flagExtendedFlags, FlagInitOnReset: flagInitOnReset, FlagStatic: flagStatic,  [...]
+func NewAdsSymbolTableEntry( entryLength uint32 , group uint32 , offset uint32 , size uint32 , dataType uint32 , flagMethodDeref bool , flagItfMethodAccess bool , flagReadOnly bool , flagTComInterfacePointer bool , flagTypeGuid bool , flagReferenceTo bool , flagBitValue bool , flagPersistent bool , flagExtendedFlags bool , flagInitOnReset bool , flagStatic bool , flagAttributes bool , flagContextMask bool , name string , dataTypeName string , comment string , rest []byte ) *_AdsSymbolTab [...]
+return &_AdsSymbolTableEntry{ EntryLength: entryLength , Group: group , Offset: offset , Size: size , DataType: dataType , FlagMethodDeref: flagMethodDeref , FlagItfMethodAccess: flagItfMethodAccess , FlagReadOnly: flagReadOnly , FlagTComInterfacePointer: flagTComInterfacePointer , FlagTypeGuid: flagTypeGuid , FlagReferenceTo: flagReferenceTo , FlagBitValue: flagBitValue , FlagPersistent: flagPersistent , FlagExtendedFlags: flagExtendedFlags , FlagInitOnReset: flagInitOnReset , FlagStati [...]
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsSymbolTableEntry(structType interface{}) AdsSymbolTableEntry {
-	if casted, ok := structType.(AdsSymbolTableEntry); ok {
+    if casted, ok := structType.(AdsSymbolTableEntry); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsSymbolTableEntry); ok {
@@ -266,61 +270,61 @@ func (m *_AdsSymbolTableEntry) GetLengthInBitsConditional(lastItem bool) uint16
 	lengthInBits := uint16(0)
 
 	// Simple field (entryLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (group)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (offset)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (size)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (dataType)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (flagMethodDeref)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagItfMethodAccess)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagReadOnly)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagTComInterfacePointer)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagTypeGuid)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagReferenceTo)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagBitValue)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagPersistent)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Reserved Field (reserved)
 	lengthInBits += 3
 
 	// Simple field (flagExtendedFlags)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagInitOnReset)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagStatic)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagAttributes)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Simple field (flagContextMask)
-	lengthInBits += 1
+	lengthInBits += 1;
 
 	// Reserved Field (reserved)
 	lengthInBits += 16
@@ -328,7 +332,7 @@ func (m *_AdsSymbolTableEntry) GetLengthInBitsConditional(lastItem bool) uint16
 	// Implicit Field (nameLength)
 	lengthInBits += 16
 
-	// Implicit Field (typeNameLength)
+	// Implicit Field (dataTypeNameLength)
 	lengthInBits += 16
 
 	// Implicit Field (commentLength)
@@ -340,10 +344,10 @@ func (m *_AdsSymbolTableEntry) GetLengthInBitsConditional(lastItem bool) uint16
 	// Const Field (nameTerminator)
 	lengthInBits += 8
 
-	// Simple field (typeName)
-	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetTypeName())) * int32(int32(8)))
+	// Simple field (dataTypeName)
+	lengthInBits += uint16(int32(GetSTR_LEN()(m.GetDataTypeName())) * int32(int32(8)))
 
-	// Const Field (typeNameTerminator)
+	// Const Field (dataTypeNameTerminator)
 	lengthInBits += 8
 
 	// Simple field (comment)
@@ -360,6 +364,7 @@ func (m *_AdsSymbolTableEntry) GetLengthInBitsConditional(lastItem bool) uint16
 	return lengthInBits
 }
 
+
 func (m *_AdsSymbolTableEntry) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -376,91 +381,91 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 	var curPos uint16
 
 	// Simple Field (entryLength)
-	_entryLength, _entryLengthErr := readBuffer.ReadUint32("entryLength", 32)
+_entryLength, _entryLengthErr := readBuffer.ReadUint32("entryLength", 32)
 	if _entryLengthErr != nil {
 		return nil, errors.Wrap(_entryLengthErr, "Error parsing 'entryLength' field of AdsSymbolTableEntry")
 	}
 	entryLength := _entryLength
 
 	// Simple Field (group)
-	_group, _groupErr := readBuffer.ReadUint32("group", 32)
+_group, _groupErr := readBuffer.ReadUint32("group", 32)
 	if _groupErr != nil {
 		return nil, errors.Wrap(_groupErr, "Error parsing 'group' field of AdsSymbolTableEntry")
 	}
 	group := _group
 
 	// Simple Field (offset)
-	_offset, _offsetErr := readBuffer.ReadUint32("offset", 32)
+_offset, _offsetErr := readBuffer.ReadUint32("offset", 32)
 	if _offsetErr != nil {
 		return nil, errors.Wrap(_offsetErr, "Error parsing 'offset' field of AdsSymbolTableEntry")
 	}
 	offset := _offset
 
 	// Simple Field (size)
-	_size, _sizeErr := readBuffer.ReadUint32("size", 32)
+_size, _sizeErr := readBuffer.ReadUint32("size", 32)
 	if _sizeErr != nil {
 		return nil, errors.Wrap(_sizeErr, "Error parsing 'size' field of AdsSymbolTableEntry")
 	}
 	size := _size
 
 	// Simple Field (dataType)
-	_dataType, _dataTypeErr := readBuffer.ReadUint32("dataType", 32)
+_dataType, _dataTypeErr := readBuffer.ReadUint32("dataType", 32)
 	if _dataTypeErr != nil {
 		return nil, errors.Wrap(_dataTypeErr, "Error parsing 'dataType' field of AdsSymbolTableEntry")
 	}
 	dataType := _dataType
 
 	// Simple Field (flagMethodDeref)
-	_flagMethodDeref, _flagMethodDerefErr := readBuffer.ReadBit("flagMethodDeref")
+_flagMethodDeref, _flagMethodDerefErr := readBuffer.ReadBit("flagMethodDeref")
 	if _flagMethodDerefErr != nil {
 		return nil, errors.Wrap(_flagMethodDerefErr, "Error parsing 'flagMethodDeref' field of AdsSymbolTableEntry")
 	}
 	flagMethodDeref := _flagMethodDeref
 
 	// Simple Field (flagItfMethodAccess)
-	_flagItfMethodAccess, _flagItfMethodAccessErr := readBuffer.ReadBit("flagItfMethodAccess")
+_flagItfMethodAccess, _flagItfMethodAccessErr := readBuffer.ReadBit("flagItfMethodAccess")
 	if _flagItfMethodAccessErr != nil {
 		return nil, errors.Wrap(_flagItfMethodAccessErr, "Error parsing 'flagItfMethodAccess' field of AdsSymbolTableEntry")
 	}
 	flagItfMethodAccess := _flagItfMethodAccess
 
 	// Simple Field (flagReadOnly)
-	_flagReadOnly, _flagReadOnlyErr := readBuffer.ReadBit("flagReadOnly")
+_flagReadOnly, _flagReadOnlyErr := readBuffer.ReadBit("flagReadOnly")
 	if _flagReadOnlyErr != nil {
 		return nil, errors.Wrap(_flagReadOnlyErr, "Error parsing 'flagReadOnly' field of AdsSymbolTableEntry")
 	}
 	flagReadOnly := _flagReadOnly
 
 	// Simple Field (flagTComInterfacePointer)
-	_flagTComInterfacePointer, _flagTComInterfacePointerErr := readBuffer.ReadBit("flagTComInterfacePointer")
+_flagTComInterfacePointer, _flagTComInterfacePointerErr := readBuffer.ReadBit("flagTComInterfacePointer")
 	if _flagTComInterfacePointerErr != nil {
 		return nil, errors.Wrap(_flagTComInterfacePointerErr, "Error parsing 'flagTComInterfacePointer' field of AdsSymbolTableEntry")
 	}
 	flagTComInterfacePointer := _flagTComInterfacePointer
 
 	// Simple Field (flagTypeGuid)
-	_flagTypeGuid, _flagTypeGuidErr := readBuffer.ReadBit("flagTypeGuid")
+_flagTypeGuid, _flagTypeGuidErr := readBuffer.ReadBit("flagTypeGuid")
 	if _flagTypeGuidErr != nil {
 		return nil, errors.Wrap(_flagTypeGuidErr, "Error parsing 'flagTypeGuid' field of AdsSymbolTableEntry")
 	}
 	flagTypeGuid := _flagTypeGuid
 
 	// Simple Field (flagReferenceTo)
-	_flagReferenceTo, _flagReferenceToErr := readBuffer.ReadBit("flagReferenceTo")
+_flagReferenceTo, _flagReferenceToErr := readBuffer.ReadBit("flagReferenceTo")
 	if _flagReferenceToErr != nil {
 		return nil, errors.Wrap(_flagReferenceToErr, "Error parsing 'flagReferenceTo' field of AdsSymbolTableEntry")
 	}
 	flagReferenceTo := _flagReferenceTo
 
 	// Simple Field (flagBitValue)
-	_flagBitValue, _flagBitValueErr := readBuffer.ReadBit("flagBitValue")
+_flagBitValue, _flagBitValueErr := readBuffer.ReadBit("flagBitValue")
 	if _flagBitValueErr != nil {
 		return nil, errors.Wrap(_flagBitValueErr, "Error parsing 'flagBitValue' field of AdsSymbolTableEntry")
 	}
 	flagBitValue := _flagBitValue
 
 	// Simple Field (flagPersistent)
-	_flagPersistent, _flagPersistentErr := readBuffer.ReadBit("flagPersistent")
+_flagPersistent, _flagPersistentErr := readBuffer.ReadBit("flagPersistent")
 	if _flagPersistentErr != nil {
 		return nil, errors.Wrap(_flagPersistentErr, "Error parsing 'flagPersistent' field of AdsSymbolTableEntry")
 	}
@@ -476,7 +481,7 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 		if reserved != uint8(0x00) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint8(0x00),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField0 = &reserved
@@ -484,35 +489,35 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 	}
 
 	// Simple Field (flagExtendedFlags)
-	_flagExtendedFlags, _flagExtendedFlagsErr := readBuffer.ReadBit("flagExtendedFlags")
+_flagExtendedFlags, _flagExtendedFlagsErr := readBuffer.ReadBit("flagExtendedFlags")
 	if _flagExtendedFlagsErr != nil {
 		return nil, errors.Wrap(_flagExtendedFlagsErr, "Error parsing 'flagExtendedFlags' field of AdsSymbolTableEntry")
 	}
 	flagExtendedFlags := _flagExtendedFlags
 
 	// Simple Field (flagInitOnReset)
-	_flagInitOnReset, _flagInitOnResetErr := readBuffer.ReadBit("flagInitOnReset")
+_flagInitOnReset, _flagInitOnResetErr := readBuffer.ReadBit("flagInitOnReset")
 	if _flagInitOnResetErr != nil {
 		return nil, errors.Wrap(_flagInitOnResetErr, "Error parsing 'flagInitOnReset' field of AdsSymbolTableEntry")
 	}
 	flagInitOnReset := _flagInitOnReset
 
 	// Simple Field (flagStatic)
-	_flagStatic, _flagStaticErr := readBuffer.ReadBit("flagStatic")
+_flagStatic, _flagStaticErr := readBuffer.ReadBit("flagStatic")
 	if _flagStaticErr != nil {
 		return nil, errors.Wrap(_flagStaticErr, "Error parsing 'flagStatic' field of AdsSymbolTableEntry")
 	}
 	flagStatic := _flagStatic
 
 	// Simple Field (flagAttributes)
-	_flagAttributes, _flagAttributesErr := readBuffer.ReadBit("flagAttributes")
+_flagAttributes, _flagAttributesErr := readBuffer.ReadBit("flagAttributes")
 	if _flagAttributesErr != nil {
 		return nil, errors.Wrap(_flagAttributesErr, "Error parsing 'flagAttributes' field of AdsSymbolTableEntry")
 	}
 	flagAttributes := _flagAttributes
 
 	// Simple Field (flagContextMask)
-	_flagContextMask, _flagContextMaskErr := readBuffer.ReadBit("flagContextMask")
+_flagContextMask, _flagContextMaskErr := readBuffer.ReadBit("flagContextMask")
 	if _flagContextMaskErr != nil {
 		return nil, errors.Wrap(_flagContextMaskErr, "Error parsing 'flagContextMask' field of AdsSymbolTableEntry")
 	}
@@ -528,7 +533,7 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 		if reserved != uint16(0x0000) {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint16(0x0000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Got unexpected response for reserved field.")
 			// We save the value, so it can be re-serialized
 			reservedField1 = &reserved
@@ -542,11 +547,11 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 		return nil, errors.Wrap(_nameLengthErr, "Error parsing 'nameLength' field of AdsSymbolTableEntry")
 	}
 
-	// Implicit Field (typeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	typeNameLength, _typeNameLengthErr := readBuffer.ReadUint16("typeNameLength", 16)
-	_ = typeNameLength
-	if _typeNameLengthErr != nil {
-		return nil, errors.Wrap(_typeNameLengthErr, "Error parsing 'typeNameLength' field of AdsSymbolTableEntry")
+	// Implicit Field (dataTypeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
+	dataTypeNameLength, _dataTypeNameLengthErr := readBuffer.ReadUint16("dataTypeNameLength", 16)
+	_ = dataTypeNameLength
+	if _dataTypeNameLengthErr != nil {
+		return nil, errors.Wrap(_dataTypeNameLengthErr, "Error parsing 'dataTypeNameLength' field of AdsSymbolTableEntry")
 	}
 
 	// Implicit Field (commentLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
@@ -557,7 +562,7 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 	}
 
 	// Simple Field (name)
-	_name, _nameErr := readBuffer.ReadString("name", uint32((nameLength)*(8)))
+_name, _nameErr := readBuffer.ReadString("name", uint32((nameLength) * ((8))))
 	if _nameErr != nil {
 		return nil, errors.Wrap(_nameErr, "Error parsing 'name' field of AdsSymbolTableEntry")
 	}
@@ -572,24 +577,24 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsSymbolTableEntry_NAMETERMINATOR) + " but got " + fmt.Sprintf("%d", nameTerminator))
 	}
 
-	// Simple Field (typeName)
-	_typeName, _typeNameErr := readBuffer.ReadString("typeName", uint32((typeNameLength)*(8)))
-	if _typeNameErr != nil {
-		return nil, errors.Wrap(_typeNameErr, "Error parsing 'typeName' field of AdsSymbolTableEntry")
+	// Simple Field (dataTypeName)
+_dataTypeName, _dataTypeNameErr := readBuffer.ReadString("dataTypeName", uint32((dataTypeNameLength) * ((8))))
+	if _dataTypeNameErr != nil {
+		return nil, errors.Wrap(_dataTypeNameErr, "Error parsing 'dataTypeName' field of AdsSymbolTableEntry")
 	}
-	typeName := _typeName
+	dataTypeName := _dataTypeName
 
-	// Const Field (typeNameTerminator)
-	typeNameTerminator, _typeNameTerminatorErr := readBuffer.ReadUint8("typeNameTerminator", 8)
-	if _typeNameTerminatorErr != nil {
-		return nil, errors.Wrap(_typeNameTerminatorErr, "Error parsing 'typeNameTerminator' field of AdsSymbolTableEntry")
+	// Const Field (dataTypeNameTerminator)
+	dataTypeNameTerminator, _dataTypeNameTerminatorErr := readBuffer.ReadUint8("dataTypeNameTerminator", 8)
+	if _dataTypeNameTerminatorErr != nil {
+		return nil, errors.Wrap(_dataTypeNameTerminatorErr, "Error parsing 'dataTypeNameTerminator' field of AdsSymbolTableEntry")
 	}
-	if typeNameTerminator != AdsSymbolTableEntry_TYPENAMETERMINATOR {
-		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsSymbolTableEntry_TYPENAMETERMINATOR) + " but got " + fmt.Sprintf("%d", typeNameTerminator))
+	if dataTypeNameTerminator != AdsSymbolTableEntry_DATATYPENAMETERMINATOR {
+		return nil, errors.New("Expected constant value " + fmt.Sprintf("%d", AdsSymbolTableEntry_DATATYPENAMETERMINATOR) + " but got " + fmt.Sprintf("%d", dataTypeNameTerminator))
 	}
 
 	// Simple Field (comment)
-	_comment, _commentErr := readBuffer.ReadString("comment", uint32((commentLength)*(8)))
+_comment, _commentErr := readBuffer.ReadString("comment", uint32((commentLength) * ((8))))
 	if _commentErr != nil {
 		return nil, errors.Wrap(_commentErr, "Error parsing 'comment' field of AdsSymbolTableEntry")
 	}
@@ -616,37 +621,37 @@ func AdsSymbolTableEntryParse(readBuffer utils.ReadBuffer) (AdsSymbolTableEntry,
 
 	// Create the instance
 	return &_AdsSymbolTableEntry{
-		EntryLength:              entryLength,
-		Group:                    group,
-		Offset:                   offset,
-		Size:                     size,
-		DataType:                 dataType,
-		FlagMethodDeref:          flagMethodDeref,
-		FlagItfMethodAccess:      flagItfMethodAccess,
-		FlagReadOnly:             flagReadOnly,
-		FlagTComInterfacePointer: flagTComInterfacePointer,
-		FlagTypeGuid:             flagTypeGuid,
-		FlagReferenceTo:          flagReferenceTo,
-		FlagBitValue:             flagBitValue,
-		FlagPersistent:           flagPersistent,
-		FlagExtendedFlags:        flagExtendedFlags,
-		FlagInitOnReset:          flagInitOnReset,
-		FlagStatic:               flagStatic,
-		FlagAttributes:           flagAttributes,
-		FlagContextMask:          flagContextMask,
-		Name:                     name,
-		TypeName:                 typeName,
-		Comment:                  comment,
-		Rest:                     rest,
-		reservedField0:           reservedField0,
-		reservedField1:           reservedField1,
-	}, nil
+			EntryLength: entryLength,
+			Group: group,
+			Offset: offset,
+			Size: size,
+			DataType: dataType,
+			FlagMethodDeref: flagMethodDeref,
+			FlagItfMethodAccess: flagItfMethodAccess,
+			FlagReadOnly: flagReadOnly,
+			FlagTComInterfacePointer: flagTComInterfacePointer,
+			FlagTypeGuid: flagTypeGuid,
+			FlagReferenceTo: flagReferenceTo,
+			FlagBitValue: flagBitValue,
+			FlagPersistent: flagPersistent,
+			FlagExtendedFlags: flagExtendedFlags,
+			FlagInitOnReset: flagInitOnReset,
+			FlagStatic: flagStatic,
+			FlagAttributes: flagAttributes,
+			FlagContextMask: flagContextMask,
+			Name: name,
+			DataTypeName: dataTypeName,
+			Comment: comment,
+			Rest: rest,
+			reservedField0: reservedField0,
+			reservedField1: reservedField1,
+		}, nil
 }
 
 func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsSymbolTableEntry"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsSymbolTableEntry"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsSymbolTableEntry")
 	}
 
@@ -747,7 +752,7 @@ func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 		if m.reservedField0 != nil {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint8(0x00),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Overriding reserved field with unexpected value.")
 			reserved = *m.reservedField0
 		}
@@ -798,7 +803,7 @@ func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 		if m.reservedField1 != nil {
 			log.Info().Fields(map[string]interface{}{
 				"expected value": uint16(0x0000),
-				"got value":      reserved,
+				"got value": reserved,
 			}).Msg("Overriding reserved field with unexpected value.")
 			reserved = *m.reservedField1
 		}
@@ -815,11 +820,11 @@ func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 		return errors.Wrap(_nameLengthErr, "Error serializing 'nameLength' field")
 	}
 
-	// Implicit Field (typeNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	typeNameLength := uint16(GetSTR_LEN()(m.GetTypeName()))
-	_typeNameLengthErr := writeBuffer.WriteUint16("typeNameLength", 16, (typeNameLength))
-	if _typeNameLengthErr != nil {
-		return errors.Wrap(_typeNameLengthErr, "Error serializing 'typeNameLength' field")
+	// Implicit Field (dataTypeNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	dataTypeNameLength := uint16(GetSTR_LEN()(m.GetDataTypeName()))
+	_dataTypeNameLengthErr := writeBuffer.WriteUint16("dataTypeNameLength", 16, (dataTypeNameLength))
+	if _dataTypeNameLengthErr != nil {
+		return errors.Wrap(_dataTypeNameLengthErr, "Error serializing 'dataTypeNameLength' field")
 	}
 
 	// Implicit Field (commentLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -831,7 +836,7 @@ func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 
 	// Simple Field (name)
 	name := string(m.GetName())
-	_nameErr := writeBuffer.WriteString("name", uint32((GetSTR_LEN()(m.GetName()))*(8)), "UTF-8", (name))
+	_nameErr := writeBuffer.WriteString("name", uint32((GetSTR_LEN()(m.GetName())) * ((8))), "UTF-8", (name))
 	if _nameErr != nil {
 		return errors.Wrap(_nameErr, "Error serializing 'name' field")
 	}
@@ -842,22 +847,22 @@ func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 		return errors.Wrap(_nameTerminatorErr, "Error serializing 'nameTerminator' field")
 	}
 
-	// Simple Field (typeName)
-	typeName := string(m.GetTypeName())
-	_typeNameErr := writeBuffer.WriteString("typeName", uint32((GetSTR_LEN()(m.GetTypeName()))*(8)), "UTF-8", (typeName))
-	if _typeNameErr != nil {
-		return errors.Wrap(_typeNameErr, "Error serializing 'typeName' field")
+	// Simple Field (dataTypeName)
+	dataTypeName := string(m.GetDataTypeName())
+	_dataTypeNameErr := writeBuffer.WriteString("dataTypeName", uint32((GetSTR_LEN()(m.GetDataTypeName())) * ((8))), "UTF-8", (dataTypeName))
+	if _dataTypeNameErr != nil {
+		return errors.Wrap(_dataTypeNameErr, "Error serializing 'dataTypeName' field")
 	}
 
-	// Const Field (typeNameTerminator)
-	_typeNameTerminatorErr := writeBuffer.WriteUint8("typeNameTerminator", 8, 0x00)
-	if _typeNameTerminatorErr != nil {
-		return errors.Wrap(_typeNameTerminatorErr, "Error serializing 'typeNameTerminator' field")
+	// Const Field (dataTypeNameTerminator)
+	_dataTypeNameTerminatorErr := writeBuffer.WriteUint8("dataTypeNameTerminator", 8, 0x00)
+	if _dataTypeNameTerminatorErr != nil {
+		return errors.Wrap(_dataTypeNameTerminatorErr, "Error serializing 'dataTypeNameTerminator' field")
 	}
 
 	// Simple Field (comment)
 	comment := string(m.GetComment())
-	_commentErr := writeBuffer.WriteString("comment", uint32((GetSTR_LEN()(m.GetComment()))*(8)), "UTF-8", (comment))
+	_commentErr := writeBuffer.WriteString("comment", uint32((GetSTR_LEN()(m.GetComment())) * ((8))), "UTF-8", (comment))
 	if _commentErr != nil {
 		return errors.Wrap(_commentErr, "Error serializing 'comment' field")
 	}
@@ -880,6 +885,7 @@ func (m *_AdsSymbolTableEntry) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+
 func (m *_AdsSymbolTableEntry) isAdsSymbolTableEntry() bool {
 	return true
 }
@@ -894,3 +900,6 @@ func (m *_AdsSymbolTableEntry) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go b/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
index ebd3d2b1a..7811b08cb 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsTableSizes is the corresponding interface of AdsTableSizes
 type AdsTableSizes interface {
@@ -53,14 +55,15 @@ type AdsTableSizesExactly interface {
 
 // _AdsTableSizes is the data-structure of this message
 type _AdsTableSizes struct {
-	SymbolCount    uint32
-	SymbolLength   uint32
-	DataTypeCount  uint32
-	DataTypeLength uint32
-	ExtraCount     uint32
-	ExtraLength    uint32
+        SymbolCount uint32
+        SymbolLength uint32
+        DataTypeCount uint32
+        DataTypeLength uint32
+        ExtraCount uint32
+        ExtraLength uint32
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -95,14 +98,15 @@ func (m *_AdsTableSizes) GetExtraLength() uint32 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsTableSizes factory function for _AdsTableSizes
-func NewAdsTableSizes(symbolCount uint32, symbolLength uint32, dataTypeCount uint32, dataTypeLength uint32, extraCount uint32, extraLength uint32) *_AdsTableSizes {
-	return &_AdsTableSizes{SymbolCount: symbolCount, SymbolLength: symbolLength, DataTypeCount: dataTypeCount, DataTypeLength: dataTypeLength, ExtraCount: extraCount, ExtraLength: extraLength}
+func NewAdsTableSizes( symbolCount uint32 , symbolLength uint32 , dataTypeCount uint32 , dataTypeLength uint32 , extraCount uint32 , extraLength uint32 ) *_AdsTableSizes {
+return &_AdsTableSizes{ SymbolCount: symbolCount , SymbolLength: symbolLength , DataTypeCount: dataTypeCount , DataTypeLength: dataTypeLength , ExtraCount: extraCount , ExtraLength: extraLength }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAdsTableSizes(structType interface{}) AdsTableSizes {
-	if casted, ok := structType.(AdsTableSizes); ok {
+    if casted, ok := structType.(AdsTableSizes); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsTableSizes); ok {
@@ -123,26 +127,27 @@ func (m *_AdsTableSizes) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(0)
 
 	// Simple field (symbolCount)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (symbolLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (dataTypeCount)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (dataTypeLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (extraCount)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (extraLength)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	return lengthInBits
 }
 
+
 func (m *_AdsTableSizes) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -157,42 +162,42 @@ func AdsTableSizesParse(readBuffer utils.ReadBuffer) (AdsTableSizes, error) {
 	_ = currentPos
 
 	// Simple Field (symbolCount)
-	_symbolCount, _symbolCountErr := readBuffer.ReadUint32("symbolCount", 32)
+_symbolCount, _symbolCountErr := readBuffer.ReadUint32("symbolCount", 32)
 	if _symbolCountErr != nil {
 		return nil, errors.Wrap(_symbolCountErr, "Error parsing 'symbolCount' field of AdsTableSizes")
 	}
 	symbolCount := _symbolCount
 
 	// Simple Field (symbolLength)
-	_symbolLength, _symbolLengthErr := readBuffer.ReadUint32("symbolLength", 32)
+_symbolLength, _symbolLengthErr := readBuffer.ReadUint32("symbolLength", 32)
 	if _symbolLengthErr != nil {
 		return nil, errors.Wrap(_symbolLengthErr, "Error parsing 'symbolLength' field of AdsTableSizes")
 	}
 	symbolLength := _symbolLength
 
 	// Simple Field (dataTypeCount)
-	_dataTypeCount, _dataTypeCountErr := readBuffer.ReadUint32("dataTypeCount", 32)
+_dataTypeCount, _dataTypeCountErr := readBuffer.ReadUint32("dataTypeCount", 32)
 	if _dataTypeCountErr != nil {
 		return nil, errors.Wrap(_dataTypeCountErr, "Error parsing 'dataTypeCount' field of AdsTableSizes")
 	}
 	dataTypeCount := _dataTypeCount
 
 	// Simple Field (dataTypeLength)
-	_dataTypeLength, _dataTypeLengthErr := readBuffer.ReadUint32("dataTypeLength", 32)
+_dataTypeLength, _dataTypeLengthErr := readBuffer.ReadUint32("dataTypeLength", 32)
 	if _dataTypeLengthErr != nil {
 		return nil, errors.Wrap(_dataTypeLengthErr, "Error parsing 'dataTypeLength' field of AdsTableSizes")
 	}
 	dataTypeLength := _dataTypeLength
 
 	// Simple Field (extraCount)
-	_extraCount, _extraCountErr := readBuffer.ReadUint32("extraCount", 32)
+_extraCount, _extraCountErr := readBuffer.ReadUint32("extraCount", 32)
 	if _extraCountErr != nil {
 		return nil, errors.Wrap(_extraCountErr, "Error parsing 'extraCount' field of AdsTableSizes")
 	}
 	extraCount := _extraCount
 
 	// Simple Field (extraLength)
-	_extraLength, _extraLengthErr := readBuffer.ReadUint32("extraLength", 32)
+_extraLength, _extraLengthErr := readBuffer.ReadUint32("extraLength", 32)
 	if _extraLengthErr != nil {
 		return nil, errors.Wrap(_extraLengthErr, "Error parsing 'extraLength' field of AdsTableSizes")
 	}
@@ -204,19 +209,19 @@ func AdsTableSizesParse(readBuffer utils.ReadBuffer) (AdsTableSizes, error) {
 
 	// Create the instance
 	return &_AdsTableSizes{
-		SymbolCount:    symbolCount,
-		SymbolLength:   symbolLength,
-		DataTypeCount:  dataTypeCount,
-		DataTypeLength: dataTypeLength,
-		ExtraCount:     extraCount,
-		ExtraLength:    extraLength,
-	}, nil
+			SymbolCount: symbolCount,
+			SymbolLength: symbolLength,
+			DataTypeCount: dataTypeCount,
+			DataTypeLength: dataTypeLength,
+			ExtraCount: extraCount,
+			ExtraLength: extraLength,
+		}, nil
 }
 
 func (m *_AdsTableSizes) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AdsTableSizes"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AdsTableSizes"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AdsTableSizes")
 	}
 
@@ -268,6 +273,7 @@ func (m *_AdsTableSizes) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+
 func (m *_AdsTableSizes) isAdsTableSizes() bool {
 	return true
 }
@@ -282,3 +288,6 @@ func (m *_AdsTableSizes) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go b/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
index 83acca231..54cfa128f 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsWriteControlRequest is the corresponding interface of AdsWriteControlRequest
 type AdsWriteControlRequest interface {
@@ -49,35 +51,34 @@ type AdsWriteControlRequestExactly interface {
 // _AdsWriteControlRequest is the data-structure of this message
 type _AdsWriteControlRequest struct {
 	*_AdsData
-	AdsState    uint16
-	DeviceState uint16
-	Data        []byte
+        AdsState uint16
+        DeviceState uint16
+        Data []byte
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsWriteControlRequest) GetCommandId() CommandId {
-	return CommandId_ADS_WRITE_CONTROL
-}
+func (m *_AdsWriteControlRequest)  GetCommandId() CommandId {
+return CommandId_ADS_WRITE_CONTROL}
 
-func (m *_AdsWriteControlRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsWriteControlRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsWriteControlRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsWriteControlRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsWriteControlRequest) GetParent() AdsData {
+func (m *_AdsWriteControlRequest)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -100,13 +101,14 @@ func (m *_AdsWriteControlRequest) GetData() []byte {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsWriteControlRequest factory function for _AdsWriteControlRequest
-func NewAdsWriteControlRequest(adsState uint16, deviceState uint16, data []byte) *_AdsWriteControlRequest {
+func NewAdsWriteControlRequest( adsState uint16 , deviceState uint16 , data []byte ) *_AdsWriteControlRequest {
 	_result := &_AdsWriteControlRequest{
-		AdsState:    adsState,
+		AdsState: adsState,
 		DeviceState: deviceState,
-		Data:        data,
-		_AdsData:    NewAdsData(),
+		Data: data,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -114,7 +116,7 @@ func NewAdsWriteControlRequest(adsState uint16, deviceState uint16, data []byte)
 
 // Deprecated: use the interface for direct cast
 func CastAdsWriteControlRequest(structType interface{}) AdsWriteControlRequest {
-	if casted, ok := structType.(AdsWriteControlRequest); ok {
+    if casted, ok := structType.(AdsWriteControlRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsWriteControlRequest); ok {
@@ -135,10 +137,10 @@ func (m *_AdsWriteControlRequest) GetLengthInBitsConditional(lastItem bool) uint
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (adsState)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Simple field (deviceState)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Implicit Field (length)
 	lengthInBits += 32
@@ -151,6 +153,7 @@ func (m *_AdsWriteControlRequest) GetLengthInBitsConditional(lastItem bool) uint
 	return lengthInBits
 }
 
+
 func (m *_AdsWriteControlRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -165,14 +168,14 @@ func AdsWriteControlRequestParse(readBuffer utils.ReadBuffer, commandId CommandI
 	_ = currentPos
 
 	// Simple Field (adsState)
-	_adsState, _adsStateErr := readBuffer.ReadUint16("adsState", 16)
+_adsState, _adsStateErr := readBuffer.ReadUint16("adsState", 16)
 	if _adsStateErr != nil {
 		return nil, errors.Wrap(_adsStateErr, "Error parsing 'adsState' field of AdsWriteControlRequest")
 	}
 	adsState := _adsState
 
 	// Simple Field (deviceState)
-	_deviceState, _deviceStateErr := readBuffer.ReadUint16("deviceState", 16)
+_deviceState, _deviceStateErr := readBuffer.ReadUint16("deviceState", 16)
 	if _deviceStateErr != nil {
 		return nil, errors.Wrap(_deviceStateErr, "Error parsing 'deviceState' field of AdsWriteControlRequest")
 	}
@@ -197,10 +200,11 @@ func AdsWriteControlRequestParse(readBuffer utils.ReadBuffer, commandId CommandI
 
 	// Create a partially initialized instance
 	_child := &_AdsWriteControlRequest{
-		_AdsData:    &_AdsData{},
-		AdsState:    adsState,
+		_AdsData: &_AdsData{
+		},
+		AdsState: adsState,
 		DeviceState: deviceState,
-		Data:        data,
+		Data: data,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -214,32 +218,32 @@ func (m *_AdsWriteControlRequest) Serialize(writeBuffer utils.WriteBuffer) error
 			return errors.Wrap(pushErr, "Error pushing for AdsWriteControlRequest")
 		}
 
-		// Simple Field (adsState)
-		adsState := uint16(m.GetAdsState())
-		_adsStateErr := writeBuffer.WriteUint16("adsState", 16, (adsState))
-		if _adsStateErr != nil {
-			return errors.Wrap(_adsStateErr, "Error serializing 'adsState' field")
-		}
+	// Simple Field (adsState)
+	adsState := uint16(m.GetAdsState())
+	_adsStateErr := writeBuffer.WriteUint16("adsState", 16, (adsState))
+	if _adsStateErr != nil {
+		return errors.Wrap(_adsStateErr, "Error serializing 'adsState' field")
+	}
 
-		// Simple Field (deviceState)
-		deviceState := uint16(m.GetDeviceState())
-		_deviceStateErr := writeBuffer.WriteUint16("deviceState", 16, (deviceState))
-		if _deviceStateErr != nil {
-			return errors.Wrap(_deviceStateErr, "Error serializing 'deviceState' field")
-		}
+	// Simple Field (deviceState)
+	deviceState := uint16(m.GetDeviceState())
+	_deviceStateErr := writeBuffer.WriteUint16("deviceState", 16, (deviceState))
+	if _deviceStateErr != nil {
+		return errors.Wrap(_deviceStateErr, "Error serializing 'deviceState' field")
+	}
 
-		// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-		length := uint32(uint32(len(m.GetData())))
-		_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
-		if _lengthErr != nil {
-			return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-		}
+	// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	length := uint32(uint32(len(m.GetData())))
+	_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
+	if _lengthErr != nil {
+		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
+	}
 
-		// Array Field (data)
-		// Byte Array field (data)
-		if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
-			return errors.Wrap(err, "Error serializing 'data' field")
-		}
+	// Array Field (data)
+	// Byte Array field (data)
+	if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
+		return errors.Wrap(err, "Error serializing 'data' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsWriteControlRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsWriteControlRequest")
@@ -249,6 +253,7 @@ func (m *_AdsWriteControlRequest) Serialize(writeBuffer utils.WriteBuffer) error
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsWriteControlRequest) isAdsWriteControlRequest() bool {
 	return true
 }
@@ -263,3 +268,6 @@ func (m *_AdsWriteControlRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go b/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go
index 8dae81c2f..f5a683ff5 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsWriteControlResponse is the corresponding interface of AdsWriteControlResponse
 type AdsWriteControlResponse interface {
@@ -45,33 +47,32 @@ type AdsWriteControlResponseExactly interface {
 // _AdsWriteControlResponse is the data-structure of this message
 type _AdsWriteControlResponse struct {
 	*_AdsData
-	Result ReturnCode
+        Result ReturnCode
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsWriteControlResponse) GetCommandId() CommandId {
-	return CommandId_ADS_WRITE_CONTROL
-}
+func (m *_AdsWriteControlResponse)  GetCommandId() CommandId {
+return CommandId_ADS_WRITE_CONTROL}
 
-func (m *_AdsWriteControlResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsWriteControlResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsWriteControlResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsWriteControlResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsWriteControlResponse) GetParent() AdsData {
+func (m *_AdsWriteControlResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -86,11 +87,12 @@ func (m *_AdsWriteControlResponse) GetResult() ReturnCode {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsWriteControlResponse factory function for _AdsWriteControlResponse
-func NewAdsWriteControlResponse(result ReturnCode) *_AdsWriteControlResponse {
+func NewAdsWriteControlResponse( result ReturnCode ) *_AdsWriteControlResponse {
 	_result := &_AdsWriteControlResponse{
-		Result:   result,
-		_AdsData: NewAdsData(),
+		Result: result,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -98,7 +100,7 @@ func NewAdsWriteControlResponse(result ReturnCode) *_AdsWriteControlResponse {
 
 // Deprecated: use the interface for direct cast
 func CastAdsWriteControlResponse(structType interface{}) AdsWriteControlResponse {
-	if casted, ok := structType.(AdsWriteControlResponse); ok {
+    if casted, ok := structType.(AdsWriteControlResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsWriteControlResponse); ok {
@@ -124,6 +126,7 @@ func (m *_AdsWriteControlResponse) GetLengthInBitsConditional(lastItem bool) uin
 	return lengthInBits
 }
 
+
 func (m *_AdsWriteControlResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -141,7 +144,7 @@ func AdsWriteControlResponseParse(readBuffer utils.ReadBuffer, commandId Command
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsWriteControlResponse")
 	}
@@ -156,8 +159,9 @@ func AdsWriteControlResponseParse(readBuffer utils.ReadBuffer, commandId Command
 
 	// Create a partially initialized instance
 	_child := &_AdsWriteControlResponse{
-		_AdsData: &_AdsData{},
-		Result:   result,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -171,17 +175,17 @@ func (m *_AdsWriteControlResponse) Serialize(writeBuffer utils.WriteBuffer) erro
 			return errors.Wrap(pushErr, "Error pushing for AdsWriteControlResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsWriteControlResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsWriteControlResponse")
@@ -191,6 +195,7 @@ func (m *_AdsWriteControlResponse) Serialize(writeBuffer utils.WriteBuffer) erro
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsWriteControlResponse) isAdsWriteControlResponse() bool {
 	return true
 }
@@ -205,3 +210,6 @@ func (m *_AdsWriteControlResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go b/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
index 22fbe3129..792386e60 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsWriteRequest is the corresponding interface of AdsWriteRequest
 type AdsWriteRequest interface {
@@ -49,35 +51,34 @@ type AdsWriteRequestExactly interface {
 // _AdsWriteRequest is the data-structure of this message
 type _AdsWriteRequest struct {
 	*_AdsData
-	IndexGroup  uint32
-	IndexOffset uint32
-	Data        []byte
+        IndexGroup uint32
+        IndexOffset uint32
+        Data []byte
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsWriteRequest) GetCommandId() CommandId {
-	return CommandId_ADS_WRITE
-}
+func (m *_AdsWriteRequest)  GetCommandId() CommandId {
+return CommandId_ADS_WRITE}
 
-func (m *_AdsWriteRequest) GetResponse() bool {
-	return bool(false)
-}
+func (m *_AdsWriteRequest)  GetResponse() bool {
+return bool(false)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsWriteRequest) InitializeParent(parent AdsData) {}
+func (m *_AdsWriteRequest) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsWriteRequest) GetParent() AdsData {
+func (m *_AdsWriteRequest)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -100,13 +101,14 @@ func (m *_AdsWriteRequest) GetData() []byte {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsWriteRequest factory function for _AdsWriteRequest
-func NewAdsWriteRequest(indexGroup uint32, indexOffset uint32, data []byte) *_AdsWriteRequest {
+func NewAdsWriteRequest( indexGroup uint32 , indexOffset uint32 , data []byte ) *_AdsWriteRequest {
 	_result := &_AdsWriteRequest{
-		IndexGroup:  indexGroup,
+		IndexGroup: indexGroup,
 		IndexOffset: indexOffset,
-		Data:        data,
-		_AdsData:    NewAdsData(),
+		Data: data,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -114,7 +116,7 @@ func NewAdsWriteRequest(indexGroup uint32, indexOffset uint32, data []byte) *_Ad
 
 // Deprecated: use the interface for direct cast
 func CastAdsWriteRequest(structType interface{}) AdsWriteRequest {
-	if casted, ok := structType.(AdsWriteRequest); ok {
+    if casted, ok := structType.(AdsWriteRequest); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsWriteRequest); ok {
@@ -135,10 +137,10 @@ func (m *_AdsWriteRequest) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (indexGroup)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (indexOffset)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Implicit Field (length)
 	lengthInBits += 32
@@ -151,6 +153,7 @@ func (m *_AdsWriteRequest) GetLengthInBitsConditional(lastItem bool) uint16 {
 	return lengthInBits
 }
 
+
 func (m *_AdsWriteRequest) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -165,14 +168,14 @@ func AdsWriteRequestParse(readBuffer utils.ReadBuffer, commandId CommandId, resp
 	_ = currentPos
 
 	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
+_indexGroup, _indexGroupErr := readBuffer.ReadUint32("indexGroup", 32)
 	if _indexGroupErr != nil {
 		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsWriteRequest")
 	}
 	indexGroup := _indexGroup
 
 	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
+_indexOffset, _indexOffsetErr := readBuffer.ReadUint32("indexOffset", 32)
 	if _indexOffsetErr != nil {
 		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsWriteRequest")
 	}
@@ -197,10 +200,11 @@ func AdsWriteRequestParse(readBuffer utils.ReadBuffer, commandId CommandId, resp
 
 	// Create a partially initialized instance
 	_child := &_AdsWriteRequest{
-		_AdsData:    &_AdsData{},
-		IndexGroup:  indexGroup,
+		_AdsData: &_AdsData{
+		},
+		IndexGroup: indexGroup,
 		IndexOffset: indexOffset,
-		Data:        data,
+		Data: data,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -214,32 +218,32 @@ func (m *_AdsWriteRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for AdsWriteRequest")
 		}
 
-		// Simple Field (indexGroup)
-		indexGroup := uint32(m.GetIndexGroup())
-		_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
-		if _indexGroupErr != nil {
-			return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
-		}
+	// Simple Field (indexGroup)
+	indexGroup := uint32(m.GetIndexGroup())
+	_indexGroupErr := writeBuffer.WriteUint32("indexGroup", 32, (indexGroup))
+	if _indexGroupErr != nil {
+		return errors.Wrap(_indexGroupErr, "Error serializing 'indexGroup' field")
+	}
 
-		// Simple Field (indexOffset)
-		indexOffset := uint32(m.GetIndexOffset())
-		_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
-		if _indexOffsetErr != nil {
-			return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
-		}
+	// Simple Field (indexOffset)
+	indexOffset := uint32(m.GetIndexOffset())
+	_indexOffsetErr := writeBuffer.WriteUint32("indexOffset", 32, (indexOffset))
+	if _indexOffsetErr != nil {
+		return errors.Wrap(_indexOffsetErr, "Error serializing 'indexOffset' field")
+	}
 
-		// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-		length := uint32(uint32(len(m.GetData())))
-		_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
-		if _lengthErr != nil {
-			return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-		}
+	// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	length := uint32(uint32(len(m.GetData())))
+	_lengthErr := writeBuffer.WriteUint32("length", 32, (length))
+	if _lengthErr != nil {
+		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
+	}
 
-		// Array Field (data)
-		// Byte Array field (data)
-		if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
-			return errors.Wrap(err, "Error serializing 'data' field")
-		}
+	// Array Field (data)
+	// Byte Array field (data)
+	if err := writeBuffer.WriteByteArray("data", m.GetData()); err != nil {
+		return errors.Wrap(err, "Error serializing 'data' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsWriteRequest"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsWriteRequest")
@@ -249,6 +253,7 @@ func (m *_AdsWriteRequest) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsWriteRequest) isAdsWriteRequest() bool {
 	return true
 }
@@ -263,3 +268,6 @@ func (m *_AdsWriteRequest) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go b/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go
index 54cf05000..0957246dd 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AdsWriteResponse is the corresponding interface of AdsWriteResponse
 type AdsWriteResponse interface {
@@ -45,33 +47,32 @@ type AdsWriteResponseExactly interface {
 // _AdsWriteResponse is the data-structure of this message
 type _AdsWriteResponse struct {
 	*_AdsData
-	Result ReturnCode
+        Result ReturnCode
 }
 
+
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for discriminator values.
 ///////////////////////
 
-func (m *_AdsWriteResponse) GetCommandId() CommandId {
-	return CommandId_ADS_WRITE
-}
+func (m *_AdsWriteResponse)  GetCommandId() CommandId {
+return CommandId_ADS_WRITE}
 
-func (m *_AdsWriteResponse) GetResponse() bool {
-	return bool(true)
-}
+func (m *_AdsWriteResponse)  GetResponse() bool {
+return bool(true)}
 
 ///////////////////////
 ///////////////////////
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
-func (m *_AdsWriteResponse) InitializeParent(parent AdsData) {}
+func (m *_AdsWriteResponse) InitializeParent(parent AdsData ) {}
 
-func (m *_AdsWriteResponse) GetParent() AdsData {
+func (m *_AdsWriteResponse)  GetParent() AdsData {
 	return m._AdsData
 }
-
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -86,11 +87,12 @@ func (m *_AdsWriteResponse) GetResult() ReturnCode {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAdsWriteResponse factory function for _AdsWriteResponse
-func NewAdsWriteResponse(result ReturnCode) *_AdsWriteResponse {
+func NewAdsWriteResponse( result ReturnCode ) *_AdsWriteResponse {
 	_result := &_AdsWriteResponse{
-		Result:   result,
-		_AdsData: NewAdsData(),
+		Result: result,
+    	_AdsData: NewAdsData(),
 	}
 	_result._AdsData._AdsDataChildRequirements = _result
 	return _result
@@ -98,7 +100,7 @@ func NewAdsWriteResponse(result ReturnCode) *_AdsWriteResponse {
 
 // Deprecated: use the interface for direct cast
 func CastAdsWriteResponse(structType interface{}) AdsWriteResponse {
-	if casted, ok := structType.(AdsWriteResponse); ok {
+    if casted, ok := structType.(AdsWriteResponse); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AdsWriteResponse); ok {
@@ -124,6 +126,7 @@ func (m *_AdsWriteResponse) GetLengthInBitsConditional(lastItem bool) uint16 {
 	return lengthInBits
 }
 
+
 func (m *_AdsWriteResponse) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -141,7 +144,7 @@ func AdsWriteResponseParse(readBuffer utils.ReadBuffer, commandId CommandId, res
 	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for result")
 	}
-	_result, _resultErr := ReturnCodeParse(readBuffer)
+_result, _resultErr := ReturnCodeParse(readBuffer)
 	if _resultErr != nil {
 		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsWriteResponse")
 	}
@@ -156,8 +159,9 @@ func AdsWriteResponseParse(readBuffer utils.ReadBuffer, commandId CommandId, res
 
 	// Create a partially initialized instance
 	_child := &_AdsWriteResponse{
-		_AdsData: &_AdsData{},
-		Result:   result,
+		_AdsData: &_AdsData{
+		},
+		Result: result,
 	}
 	_child._AdsData._AdsDataChildRequirements = _child
 	return _child, nil
@@ -171,17 +175,17 @@ func (m *_AdsWriteResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 			return errors.Wrap(pushErr, "Error pushing for AdsWriteResponse")
 		}
 
-		// Simple Field (result)
-		if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
-			return errors.Wrap(pushErr, "Error pushing for result")
-		}
-		_resultErr := writeBuffer.WriteSerializable(m.GetResult())
-		if popErr := writeBuffer.PopContext("result"); popErr != nil {
-			return errors.Wrap(popErr, "Error popping for result")
-		}
-		if _resultErr != nil {
-			return errors.Wrap(_resultErr, "Error serializing 'result' field")
-		}
+	// Simple Field (result)
+	if pushErr := writeBuffer.PushContext("result"); pushErr != nil {
+		return errors.Wrap(pushErr, "Error pushing for result")
+	}
+	_resultErr := writeBuffer.WriteSerializable(m.GetResult())
+	if popErr := writeBuffer.PopContext("result"); popErr != nil {
+		return errors.Wrap(popErr, "Error popping for result")
+	}
+	if _resultErr != nil {
+		return errors.Wrap(_resultErr, "Error serializing 'result' field")
+	}
 
 		if popErr := writeBuffer.PopContext("AdsWriteResponse"); popErr != nil {
 			return errors.Wrap(popErr, "Error popping for AdsWriteResponse")
@@ -191,6 +195,7 @@ func (m *_AdsWriteResponse) Serialize(writeBuffer utils.WriteBuffer) error {
 	return m.SerializeParent(writeBuffer, m, ser)
 }
 
+
 func (m *_AdsWriteResponse) isAdsWriteResponse() bool {
 	return true
 }
@@ -205,3 +210,6 @@ func (m *_AdsWriteResponse) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AmsNetId.go b/plc4go/protocols/ads/readwrite/model/AmsNetId.go
index 9e4dd1563..87eaeb4aa 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsNetId.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsNetId.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AmsNetId is the corresponding interface of AmsNetId
 type AmsNetId interface {
@@ -53,14 +55,15 @@ type AmsNetIdExactly interface {
 
 // _AmsNetId is the data-structure of this message
 type _AmsNetId struct {
-	Octet1 uint8
-	Octet2 uint8
-	Octet3 uint8
-	Octet4 uint8
-	Octet5 uint8
-	Octet6 uint8
+        Octet1 uint8
+        Octet2 uint8
+        Octet3 uint8
+        Octet4 uint8
+        Octet5 uint8
+        Octet6 uint8
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -95,14 +98,15 @@ func (m *_AmsNetId) GetOctet6() uint8 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAmsNetId factory function for _AmsNetId
-func NewAmsNetId(octet1 uint8, octet2 uint8, octet3 uint8, octet4 uint8, octet5 uint8, octet6 uint8) *_AmsNetId {
-	return &_AmsNetId{Octet1: octet1, Octet2: octet2, Octet3: octet3, Octet4: octet4, Octet5: octet5, Octet6: octet6}
+func NewAmsNetId( octet1 uint8 , octet2 uint8 , octet3 uint8 , octet4 uint8 , octet5 uint8 , octet6 uint8 ) *_AmsNetId {
+return &_AmsNetId{ Octet1: octet1 , Octet2: octet2 , Octet3: octet3 , Octet4: octet4 , Octet5: octet5 , Octet6: octet6 }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAmsNetId(structType interface{}) AmsNetId {
-	if casted, ok := structType.(AmsNetId); ok {
+    if casted, ok := structType.(AmsNetId); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AmsNetId); ok {
@@ -123,26 +127,27 @@ func (m *_AmsNetId) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(0)
 
 	// Simple field (octet1)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (octet2)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (octet3)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (octet4)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (octet5)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (octet6)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	return lengthInBits
 }
 
+
 func (m *_AmsNetId) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -157,42 +162,42 @@ func AmsNetIdParse(readBuffer utils.ReadBuffer) (AmsNetId, error) {
 	_ = currentPos
 
 	// Simple Field (octet1)
-	_octet1, _octet1Err := readBuffer.ReadUint8("octet1", 8)
+_octet1, _octet1Err := readBuffer.ReadUint8("octet1", 8)
 	if _octet1Err != nil {
 		return nil, errors.Wrap(_octet1Err, "Error parsing 'octet1' field of AmsNetId")
 	}
 	octet1 := _octet1
 
 	// Simple Field (octet2)
-	_octet2, _octet2Err := readBuffer.ReadUint8("octet2", 8)
+_octet2, _octet2Err := readBuffer.ReadUint8("octet2", 8)
 	if _octet2Err != nil {
 		return nil, errors.Wrap(_octet2Err, "Error parsing 'octet2' field of AmsNetId")
 	}
 	octet2 := _octet2
 
 	// Simple Field (octet3)
-	_octet3, _octet3Err := readBuffer.ReadUint8("octet3", 8)
+_octet3, _octet3Err := readBuffer.ReadUint8("octet3", 8)
 	if _octet3Err != nil {
 		return nil, errors.Wrap(_octet3Err, "Error parsing 'octet3' field of AmsNetId")
 	}
 	octet3 := _octet3
 
 	// Simple Field (octet4)
-	_octet4, _octet4Err := readBuffer.ReadUint8("octet4", 8)
+_octet4, _octet4Err := readBuffer.ReadUint8("octet4", 8)
 	if _octet4Err != nil {
 		return nil, errors.Wrap(_octet4Err, "Error parsing 'octet4' field of AmsNetId")
 	}
 	octet4 := _octet4
 
 	// Simple Field (octet5)
-	_octet5, _octet5Err := readBuffer.ReadUint8("octet5", 8)
+_octet5, _octet5Err := readBuffer.ReadUint8("octet5", 8)
 	if _octet5Err != nil {
 		return nil, errors.Wrap(_octet5Err, "Error parsing 'octet5' field of AmsNetId")
 	}
 	octet5 := _octet5
 
 	// Simple Field (octet6)
-	_octet6, _octet6Err := readBuffer.ReadUint8("octet6", 8)
+_octet6, _octet6Err := readBuffer.ReadUint8("octet6", 8)
 	if _octet6Err != nil {
 		return nil, errors.Wrap(_octet6Err, "Error parsing 'octet6' field of AmsNetId")
 	}
@@ -204,19 +209,19 @@ func AmsNetIdParse(readBuffer utils.ReadBuffer) (AmsNetId, error) {
 
 	// Create the instance
 	return &_AmsNetId{
-		Octet1: octet1,
-		Octet2: octet2,
-		Octet3: octet3,
-		Octet4: octet4,
-		Octet5: octet5,
-		Octet6: octet6,
-	}, nil
+			Octet1: octet1,
+			Octet2: octet2,
+			Octet3: octet3,
+			Octet4: octet4,
+			Octet5: octet5,
+			Octet6: octet6,
+		}, nil
 }
 
 func (m *_AmsNetId) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AmsNetId"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AmsNetId"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AmsNetId")
 	}
 
@@ -268,6 +273,7 @@ func (m *_AmsNetId) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+
 func (m *_AmsNetId) isAmsNetId() bool {
 	return true
 }
@@ -282,3 +288,6 @@ func (m *_AmsNetId) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AmsPacket.go b/plc4go/protocols/ads/readwrite/model/AmsPacket.go
index 5b1a7b54e..1821f143c 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsPacket.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsPacket.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AmsPacket is the corresponding interface of AmsPacket
 type AmsPacket interface {
@@ -59,17 +61,18 @@ type AmsPacketExactly interface {
 
 // _AmsPacket is the data-structure of this message
 type _AmsPacket struct {
-	TargetAmsNetId AmsNetId
-	TargetAmsPort  uint16
-	SourceAmsNetId AmsNetId
-	SourceAmsPort  uint16
-	CommandId      CommandId
-	State          State
-	ErrorCode      uint32
-	InvokeId       uint32
-	Data           AdsData
+        TargetAmsNetId AmsNetId
+        TargetAmsPort uint16
+        SourceAmsNetId AmsNetId
+        SourceAmsPort uint16
+        CommandId CommandId
+        State State
+        ErrorCode uint32
+        InvokeId uint32
+        Data AdsData
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -116,14 +119,15 @@ func (m *_AmsPacket) GetData() AdsData {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAmsPacket factory function for _AmsPacket
-func NewAmsPacket(targetAmsNetId AmsNetId, targetAmsPort uint16, sourceAmsNetId AmsNetId, sourceAmsPort uint16, commandId CommandId, state State, errorCode uint32, invokeId uint32, data AdsData) *_AmsPacket {
-	return &_AmsPacket{TargetAmsNetId: targetAmsNetId, TargetAmsPort: targetAmsPort, SourceAmsNetId: sourceAmsNetId, SourceAmsPort: sourceAmsPort, CommandId: commandId, State: state, ErrorCode: errorCode, InvokeId: invokeId, Data: data}
+func NewAmsPacket( targetAmsNetId AmsNetId , targetAmsPort uint16 , sourceAmsNetId AmsNetId , sourceAmsPort uint16 , commandId CommandId , state State , errorCode uint32 , invokeId uint32 , data AdsData ) *_AmsPacket {
+return &_AmsPacket{ TargetAmsNetId: targetAmsNetId , TargetAmsPort: targetAmsPort , SourceAmsNetId: sourceAmsNetId , SourceAmsPort: sourceAmsPort , CommandId: commandId , State: state , ErrorCode: errorCode , InvokeId: invokeId , Data: data }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAmsPacket(structType interface{}) AmsPacket {
-	if casted, ok := structType.(AmsPacket); ok {
+    if casted, ok := structType.(AmsPacket); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AmsPacket); ok {
@@ -147,13 +151,13 @@ func (m *_AmsPacket) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits += m.TargetAmsNetId.GetLengthInBits()
 
 	// Simple field (targetAmsPort)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Simple field (sourceAmsNetId)
 	lengthInBits += m.SourceAmsNetId.GetLengthInBits()
 
 	// Simple field (sourceAmsPort)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Simple field (commandId)
 	lengthInBits += 16
@@ -165,10 +169,10 @@ func (m *_AmsPacket) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits += 32
 
 	// Simple field (errorCode)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (invokeId)
-	lengthInBits += 32
+	lengthInBits += 32;
 
 	// Simple field (data)
 	lengthInBits += m.Data.GetLengthInBits()
@@ -176,6 +180,7 @@ func (m *_AmsPacket) GetLengthInBitsConditional(lastItem bool) uint16 {
 	return lengthInBits
 }
 
+
 func (m *_AmsPacket) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -193,7 +198,7 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	if pullErr := readBuffer.PullContext("targetAmsNetId"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for targetAmsNetId")
 	}
-	_targetAmsNetId, _targetAmsNetIdErr := AmsNetIdParse(readBuffer)
+_targetAmsNetId, _targetAmsNetIdErr := AmsNetIdParse(readBuffer)
 	if _targetAmsNetIdErr != nil {
 		return nil, errors.Wrap(_targetAmsNetIdErr, "Error parsing 'targetAmsNetId' field of AmsPacket")
 	}
@@ -203,7 +208,7 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	}
 
 	// Simple Field (targetAmsPort)
-	_targetAmsPort, _targetAmsPortErr := readBuffer.ReadUint16("targetAmsPort", 16)
+_targetAmsPort, _targetAmsPortErr := readBuffer.ReadUint16("targetAmsPort", 16)
 	if _targetAmsPortErr != nil {
 		return nil, errors.Wrap(_targetAmsPortErr, "Error parsing 'targetAmsPort' field of AmsPacket")
 	}
@@ -213,7 +218,7 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	if pullErr := readBuffer.PullContext("sourceAmsNetId"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for sourceAmsNetId")
 	}
-	_sourceAmsNetId, _sourceAmsNetIdErr := AmsNetIdParse(readBuffer)
+_sourceAmsNetId, _sourceAmsNetIdErr := AmsNetIdParse(readBuffer)
 	if _sourceAmsNetIdErr != nil {
 		return nil, errors.Wrap(_sourceAmsNetIdErr, "Error parsing 'sourceAmsNetId' field of AmsPacket")
 	}
@@ -223,7 +228,7 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	}
 
 	// Simple Field (sourceAmsPort)
-	_sourceAmsPort, _sourceAmsPortErr := readBuffer.ReadUint16("sourceAmsPort", 16)
+_sourceAmsPort, _sourceAmsPortErr := readBuffer.ReadUint16("sourceAmsPort", 16)
 	if _sourceAmsPortErr != nil {
 		return nil, errors.Wrap(_sourceAmsPortErr, "Error parsing 'sourceAmsPort' field of AmsPacket")
 	}
@@ -233,7 +238,7 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	if pullErr := readBuffer.PullContext("commandId"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for commandId")
 	}
-	_commandId, _commandIdErr := CommandIdParse(readBuffer)
+_commandId, _commandIdErr := CommandIdParse(readBuffer)
 	if _commandIdErr != nil {
 		return nil, errors.Wrap(_commandIdErr, "Error parsing 'commandId' field of AmsPacket")
 	}
@@ -246,7 +251,7 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	if pullErr := readBuffer.PullContext("state"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for state")
 	}
-	_state, _stateErr := StateParse(readBuffer)
+_state, _stateErr := StateParse(readBuffer)
 	if _stateErr != nil {
 		return nil, errors.Wrap(_stateErr, "Error parsing 'state' field of AmsPacket")
 	}
@@ -263,14 +268,14 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	}
 
 	// Simple Field (errorCode)
-	_errorCode, _errorCodeErr := readBuffer.ReadUint32("errorCode", 32)
+_errorCode, _errorCodeErr := readBuffer.ReadUint32("errorCode", 32)
 	if _errorCodeErr != nil {
 		return nil, errors.Wrap(_errorCodeErr, "Error parsing 'errorCode' field of AmsPacket")
 	}
 	errorCode := _errorCode
 
 	// Simple Field (invokeId)
-	_invokeId, _invokeIdErr := readBuffer.ReadUint32("invokeId", 32)
+_invokeId, _invokeIdErr := readBuffer.ReadUint32("invokeId", 32)
 	if _invokeIdErr != nil {
 		return nil, errors.Wrap(_invokeIdErr, "Error parsing 'invokeId' field of AmsPacket")
 	}
@@ -280,7 +285,7 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	if pullErr := readBuffer.PullContext("data"); pullErr != nil {
 		return nil, errors.Wrap(pullErr, "Error pulling for data")
 	}
-	_data, _dataErr := AdsDataParse(readBuffer, CommandId(commandId), bool(state.GetResponse()))
+_data, _dataErr := AdsDataParse(readBuffer , CommandId( commandId ) , bool( state.GetResponse() ) )
 	if _dataErr != nil {
 		return nil, errors.Wrap(_dataErr, "Error parsing 'data' field of AmsPacket")
 	}
@@ -295,22 +300,22 @@ func AmsPacketParse(readBuffer utils.ReadBuffer) (AmsPacket, error) {
 
 	// Create the instance
 	return &_AmsPacket{
-		TargetAmsNetId: targetAmsNetId,
-		TargetAmsPort:  targetAmsPort,
-		SourceAmsNetId: sourceAmsNetId,
-		SourceAmsPort:  sourceAmsPort,
-		CommandId:      commandId,
-		State:          state,
-		ErrorCode:      errorCode,
-		InvokeId:       invokeId,
-		Data:           data,
-	}, nil
+			TargetAmsNetId: targetAmsNetId,
+			TargetAmsPort: targetAmsPort,
+			SourceAmsNetId: sourceAmsNetId,
+			SourceAmsPort: sourceAmsPort,
+			CommandId: commandId,
+			State: state,
+			ErrorCode: errorCode,
+			InvokeId: invokeId,
+			Data: data,
+		}, nil
 }
 
 func (m *_AmsPacket) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AmsPacket"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AmsPacket"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AmsPacket")
 	}
 
@@ -415,6 +420,7 @@ func (m *_AmsPacket) Serialize(writeBuffer utils.WriteBuffer) error {
 	return nil
 }
 
+
 func (m *_AmsPacket) isAmsPacket() bool {
 	return true
 }
@@ -429,3 +435,6 @@ func (m *_AmsPacket) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go b/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go
index fc904ae6a..0efabc654 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AmsSerialAcknowledgeFrame is the corresponding interface of AmsSerialAcknowledgeFrame
 type AmsSerialAcknowledgeFrame interface {
@@ -53,14 +55,15 @@ type AmsSerialAcknowledgeFrameExactly interface {
 
 // _AmsSerialAcknowledgeFrame is the data-structure of this message
 type _AmsSerialAcknowledgeFrame struct {
-	MagicCookie        uint16
-	TransmitterAddress int8
-	ReceiverAddress    int8
-	FragmentNumber     int8
-	Length             int8
-	Crc                uint16
+        MagicCookie uint16
+        TransmitterAddress int8
+        ReceiverAddress int8
+        FragmentNumber int8
+        Length int8
+        Crc uint16
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -95,14 +98,15 @@ func (m *_AmsSerialAcknowledgeFrame) GetCrc() uint16 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
+
 // NewAmsSerialAcknowledgeFrame factory function for _AmsSerialAcknowledgeFrame
-func NewAmsSerialAcknowledgeFrame(magicCookie uint16, transmitterAddress int8, receiverAddress int8, fragmentNumber int8, length int8, crc uint16) *_AmsSerialAcknowledgeFrame {
-	return &_AmsSerialAcknowledgeFrame{MagicCookie: magicCookie, TransmitterAddress: transmitterAddress, ReceiverAddress: receiverAddress, FragmentNumber: fragmentNumber, Length: length, Crc: crc}
+func NewAmsSerialAcknowledgeFrame( magicCookie uint16 , transmitterAddress int8 , receiverAddress int8 , fragmentNumber int8 , length int8 , crc uint16 ) *_AmsSerialAcknowledgeFrame {
+return &_AmsSerialAcknowledgeFrame{ MagicCookie: magicCookie , TransmitterAddress: transmitterAddress , ReceiverAddress: receiverAddress , FragmentNumber: fragmentNumber , Length: length , Crc: crc }
 }
 
 // Deprecated: use the interface for direct cast
 func CastAmsSerialAcknowledgeFrame(structType interface{}) AmsSerialAcknowledgeFrame {
-	if casted, ok := structType.(AmsSerialAcknowledgeFrame); ok {
+    if casted, ok := structType.(AmsSerialAcknowledgeFrame); ok {
 		return casted
 	}
 	if casted, ok := structType.(*AmsSerialAcknowledgeFrame); ok {
@@ -123,26 +127,27 @@ func (m *_AmsSerialAcknowledgeFrame) GetLengthInBitsConditional(lastItem bool) u
 	lengthInBits := uint16(0)
 
 	// Simple field (magicCookie)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	// Simple field (transmitterAddress)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (receiverAddress)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (fragmentNumber)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (length)
-	lengthInBits += 8
+	lengthInBits += 8;
 
 	// Simple field (crc)
-	lengthInBits += 16
+	lengthInBits += 16;
 
 	return lengthInBits
 }
 
+
 func (m *_AmsSerialAcknowledgeFrame) GetLengthInBytes() uint16 {
 	return m.GetLengthInBits() / 8
 }
@@ -157,42 +162,42 @@ func AmsSerialAcknowledgeFrameParse(readBuffer utils.ReadBuffer) (AmsSerialAckno
 	_ = currentPos
 
 	// Simple Field (magicCookie)
-	_magicCookie, _magicCookieErr := readBuffer.ReadUint16("magicCookie", 16)
+_magicCookie, _magicCookieErr := readBuffer.ReadUint16("magicCookie", 16)
 	if _magicCookieErr != nil {
 		return nil, errors.Wrap(_magicCookieErr, "Error parsing 'magicCookie' field of AmsSerialAcknowledgeFrame")
 	}
 	magicCookie := _magicCookie
 
 	// Simple Field (transmitterAddress)
-	_transmitterAddress, _transmitterAddressErr := readBuffer.ReadInt8("transmitterAddress", 8)
+_transmitterAddress, _transmitterAddressErr := readBuffer.ReadInt8("transmitterAddress", 8)
 	if _transmitterAddressErr != nil {
 		return nil, errors.Wrap(_transmitterAddressErr, "Error parsing 'transmitterAddress' field of AmsSerialAcknowledgeFrame")
 	}
 	transmitterAddress := _transmitterAddress
 
 	// Simple Field (receiverAddress)
-	_receiverAddress, _receiverAddressErr := readBuffer.ReadInt8("receiverAddress", 8)
+_receiverAddress, _receiverAddressErr := readBuffer.ReadInt8("receiverAddress", 8)
 	if _receiverAddressErr != nil {
 		return nil, errors.Wrap(_receiverAddressErr, "Error parsing 'receiverAddress' field of AmsSerialAcknowledgeFrame")
 	}
 	receiverAddress := _receiverAddress
 
 	// Simple Field (fragmentNumber)
-	_fragmentNumber, _fragmentNumberErr := readBuffer.ReadInt8("fragmentNumber", 8)
+_fragmentNumber, _fragmentNumberErr := readBuffer.ReadInt8("fragmentNumber", 8)
 	if _fragmentNumberErr != nil {
 		return nil, errors.Wrap(_fragmentNumberErr, "Error parsing 'fragmentNumber' field of AmsSerialAcknowledgeFrame")
 	}
 	fragmentNumber := _fragmentNumber
 
 	// Simple Field (length)
-	_length, _lengthErr := readBuffer.ReadInt8("length", 8)
+_length, _lengthErr := readBuffer.ReadInt8("length", 8)
 	if _lengthErr != nil {
 		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AmsSerialAcknowledgeFrame")
 	}
 	length := _length
 
 	// Simple Field (crc)
-	_crc, _crcErr := readBuffer.ReadUint16("crc", 16)
+_crc, _crcErr := readBuffer.ReadUint16("crc", 16)
 	if _crcErr != nil {
 		return nil, errors.Wrap(_crcErr, "Error parsing 'crc' field of AmsSerialAcknowledgeFrame")
 	}
@@ -204,19 +209,19 @@ func AmsSerialAcknowledgeFrameParse(readBuffer utils.ReadBuffer) (AmsSerialAckno
 
 	// Create the instance
 	return &_AmsSerialAcknowledgeFrame{
-		MagicCookie:        magicCookie,
-		TransmitterAddress: transmitterAddress,
-		ReceiverAddress:    receiverAddress,
-		FragmentNumber:     fragmentNumber,
-		Length:             length,
-		Crc:                crc,
-	}, nil
+			MagicCookie: magicCookie,
+			TransmitterAddress: transmitterAddress,
+			ReceiverAddress: receiverAddress,
+			FragmentNumber: fragmentNumber,
+			Length: length,
+			Crc: crc,
+		}, nil
 }
 
 func (m *_AmsSerialAcknowledgeFrame) Serialize(writeBuffer utils.WriteBuffer) error {
 	positionAware := writeBuffer
 	_ = positionAware
-	if pushErr := writeBuffer.PushContext("AmsSerialAcknowledgeFrame"); pushErr != nil {
+	if pushErr :=writeBuffer.PushContext("AmsSerialAcknowledgeFrame"); pushErr != nil {
 		return errors.Wrap(pushErr, "Error pushing for AmsSerialAcknowledgeFrame")
 	}
 
@@ -268,6 +273,7 @@ func (m *_AmsSerialAcknowledgeFrame) Serialize(writeBuffer utils.WriteBuffer) er
 	return nil
 }
 
+
 func (m *_AmsSerialAcknowledgeFrame) isAmsSerialAcknowledgeFrame() bool {
 	return true
 }
@@ -282,3 +288,6 @@ func (m *_AmsSerialAcknowledgeFrame) String() string {
 	}
 	return writeBuffer.GetBox().String()
 }
+
+
+
diff --git a/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go b/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go
index a054ff364..c625ffba5 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go
@@ -19,12 +19,14 @@
 
 package model
 
+
 import (
 	"github.com/apache/plc4x/plc4go/internal/spi/utils"
 	"github.com/pkg/errors"
 )
 
-// Code generated by code-generation. DO NOT EDIT.
+	// Code generated by code-generation. DO NOT EDIT.
+
 
 // AmsSerialFrame is the corresponding interface of AmsSerialFrame
 type AmsSerialFrame interface {
@@ -55,15 +57,16 @@ type AmsSerialFrameExactly interface {
 
 // _AmsSerialFrame is the data-structure of this message
 type _AmsSerialFrame struct {
-	MagicCookie        uint16
-	TransmitterAddress int8
-	ReceiverAddress    int8
-	FragmentNumber     int8
-	Length             int8
-	Userdata           AmsPacket
-	Crc                uint16
+        MagicCookie uint16
+        TransmitterAddress int8
+        ReceiverAddress int8
+        FragmentNumber int8
+        Length int8
+        Userdata AmsPacket
+        Crc uint16
 }
 
+
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 /////////////////////// Accessors for property fields.
@@ -102,14 +105,15 @@ func (m *_AmsSerialFrame) GetCrc() uint16 {
 ///////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////
 
... 2568 lines suppressed ...


[plc4x] 02/07: Merge branch 'splatch/ads-symbol-discovery' into feature/ads-symbol-discovery

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch tmp/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 72021595f576c64d1f00567e2b52420b58eddfdc
Merge: be71f0cd2 7f1f52fd4
Author: Christofer Dutz <ch...@rivian.com>
AuthorDate: Wed Aug 10 13:26:18 2022 +0200

    Merge branch 'splatch/ads-symbol-discovery' into feature/ads-symbol-discovery

 .../org/apache/plc4x/protocol/ads/Scanner.java     | 151 +++++++++++++++++++++
 1 file changed, 151 insertions(+)