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

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

commit 760e5cc225b9fe6487ad769a998341ecfe070132
Author: Christofer Dutz <[email protected]>
AuthorDate: Sat Oct 11 12:27:41 2025 +0200

    refactor: Simplified the datatypes in ADS and updated the Browse API 
intercept mode to not only pass in the item, but also the tag.
---
 plc4go/internal/ads/Browser.go                     |   8 +-
 plc4go/internal/ads/Connection.go                  |  12 +-
 plc4go/internal/ads/DriverContext.go               |  12 +-
 plc4go/internal/ads/Reader.go                      |  12 +-
 plc4go/internal/ads/ValueHandler.go                |  12 +-
 plc4go/internal/ads/Writer.go                      |  12 +-
 plc4go/protocols/ads/readwrite/ParserHelper.go     |   2 -
 plc4go/protocols/ads/readwrite/XmlParserHelper.go  |   2 -
 .../readwrite/model/AdsDataTypeTableChildEntry.go  | 825 ---------------------
 .../ads/readwrite/model/AdsDataTypeTableEntry.go   | 156 ++--
 .../api/messages/PlcBrowseRequestInterceptor.java  |   4 +-
 .../ads/readwrite/AdsDataTypeTableChildEntry.java  | 679 -----------------
 .../java/ads/readwrite/AdsDataTypeTableEntry.java  | 148 ++--
 .../plc4x/java/ads/protocol/AdsProtocolLogic.java  |  79 +-
 .../apache/plc4x/protocol/ads/ManualAdsBrowse.java |   2 +-
 .../readwrite/connection/CtrlXConnection.java      |   2 +-
 .../ads/src/main/resources/protocols/ads/ads.mspec |  49 +-
 17 files changed, 239 insertions(+), 1777 deletions(-)

diff --git a/plc4go/internal/ads/Browser.go b/plc4go/internal/ads/Browser.go
index 31cd7e4b63..9044702b1c 100644
--- a/plc4go/internal/ads/Browser.go
+++ b/plc4go/internal/ads/Browser.go
@@ -127,7 +127,7 @@ func (m *Connection) filterDataTypes(parentName string, 
currentType driverModel.
                                SymbolicAddress: parentName,
                        },
                        parentName,
-                       currentType.GetDataTypeName(),
+                       currentType.GetSecondaryName(),
                        false,
                        false,
                        false,
@@ -140,13 +140,13 @@ func (m *Connection) filterDataTypes(parentName string, 
currentType driverModel.
        currentAddressSegment := remainingAddressSegments[0]
        remainingAddressSegments = remainingAddressSegments[1:]
        for _, child := range currentType.GetChildren() {
-               if child.GetPropertyName() == currentAddressSegment {
-                       childTypeName := child.GetDataTypeName()
+               if child.GetMainName() == currentAddressSegment {
+                       childTypeName := child.GetSecondaryName()
                        if symbolDataType, ok := 
m.driverContext.dataTypeTable[childTypeName]; !ok {
                                // TODO: Couldn't find data type with the name 
defined in the protperty.
                                return nil
                        } else {
-                               return 
m.filterDataTypes(parentName+"."+child.GetPropertyName(), symbolDataType,
+                               return 
m.filterDataTypes(parentName+"."+child.GetMainName(), symbolDataType,
                                        currentPath+"."+currentAddressSegment, 
remainingAddressSegments)
                        }
                }
diff --git a/plc4go/internal/ads/Connection.go 
b/plc4go/internal/ads/Connection.go
index 80986bdd87..eaf4ed3ff1 100644
--- a/plc4go/internal/ads/Connection.go
+++ b/plc4go/internal/ads/Connection.go
@@ -302,7 +302,7 @@ func (m *Connection) readDataTypeTable(ctx context.Context, 
dataTableSize uint32
                if err != nil {
                        return nil, fmt.Errorf("error parsing table: %v", err)
                }
-               dataTypes[dataType.GetDataTypeName()] = dataType
+               dataTypes[dataType.GetSecondaryName()] = dataType
        }
        return dataTypes, nil
 }
@@ -380,23 +380,23 @@ func (m *Connection) resolveSymbolicAddress(ctx 
context.Context, addressParts []
        curAddressPart := addressParts[0]
        restAddressParts := addressParts[1:]
        for _, child := range curDataType.GetChildren() {
-               if child.GetPropertyName() == curAddressPart {
-                       childDataTypeName := child.GetDataTypeName()
+               if child.GetMainName() == curAddressPart {
+                       childDataTypeName := child.GetSecondaryName()
                        childDataType, ok := 
m.driverContext.dataTypeTable[childDataTypeName]
                        if !ok {
                                return nil, fmt.Errorf("couldn't find data type 
%s for property %s of data type %s",
-                                       childDataTypeName, curAddressPart, 
curDataType.GetDataTypeName())
+                                       childDataTypeName, curAddressPart, 
curDataType.GetSecondaryName())
                        }
                        return m.resolveSymbolicAddress(ctx, restAddressParts, 
childDataType, indexGroup, indexOffset+child.GetOffset())
                }
        }
        return nil, fmt.Errorf("couldn't find property named %s for data type 
%s",
-               curAddressPart, curDataType.GetDataTypeName())
+               curAddressPart, curDataType.GetSecondaryName())
 }
 
 func (m *Connection) getPlcValueForAdsDataTypeTableEntry(entry 
readWriteModel.AdsDataTypeTableEntry) (apiValues.PlcValueType, int32) {
        stringLength := -1
-       dataTypeName := entry.GetDataTypeName()
+       dataTypeName := entry.GetSecondaryName()
        if strings.HasPrefix(dataTypeName, "STRING(") {
                var err error
                stringLength, err = strconv.Atoi(dataTypeName[7 : 
len(dataTypeName)-1])
diff --git a/plc4go/internal/ads/DriverContext.go 
b/plc4go/internal/ads/DriverContext.go
index fb8ce10f12..538d5e7b9e 100644
--- a/plc4go/internal/ads/DriverContext.go
+++ b/plc4go/internal/ads/DriverContext.go
@@ -108,15 +108,15 @@ func (m *DriverContext) 
resolveDirectTag(remainingSegments []string, currentData
        currentSegment := remainingSegments[0]
        remainingSegments = remainingSegments[1:]
        for _, child := range currentDatatype.GetChildren() {
-               if child.GetPropertyName() == currentSegment {
-                       childDataType, ok := 
m.dataTypeTable[child.GetDataTypeName()]
+               if child.GetMainName() == currentSegment {
+                       childDataType, ok := 
m.dataTypeTable[child.GetSecondaryName()]
                        if !ok {
-                               return nil, fmt.Errorf("couldn't find data type 
with name %s", child.GetDataTypeName())
+                               return nil, fmt.Errorf("couldn't find data type 
with name %s", child.GetSecondaryName())
                        }
                        return m.resolveDirectTag(remainingSegments, 
childDataType, indexGroup, indexOffset+child.GetOffset())
                }
        }
-       return nil, fmt.Errorf("couldn't find child with name %s in type %s", 
currentSegment, currentDatatype.GetDataTypeName())
+       return nil, fmt.Errorf("couldn't find child with name %s in type %s", 
currentSegment, currentDatatype.GetSecondaryName())
 }
 
 func (m *DriverContext) getDataTypeForDataTypeTableEntry(entry 
driverModel.AdsDataTypeTableEntry) apiValues.PlcValueType {
@@ -126,7 +126,7 @@ func (m *DriverContext) 
getDataTypeForDataTypeTableEntry(entry driverModel.AdsDa
        if entry.GetNumChildren() > 0 {
                return apiValues.Struct
        }
-       dataTypeName := entry.GetDataTypeName()
+       dataTypeName := entry.GetSecondaryName()
        if strings.HasPrefix(dataTypeName, "STRING(") {
                dataTypeName = "STRING"
        } else if strings.HasPrefix(dataTypeName, "WSTRING(") {
@@ -137,7 +137,7 @@ func (m *DriverContext) 
getDataTypeForDataTypeTableEntry(entry driverModel.AdsDa
 }
 
 func (m *DriverContext) getStringLengthForDataTypeTableEntry(entry 
driverModel.AdsDataTypeTableEntry) int32 {
-       dataTypeName := entry.GetDataTypeName()
+       dataTypeName := entry.GetSecondaryName()
        if strings.HasPrefix(dataTypeName, "STRING(") {
                lenStr := dataTypeName[7 : len(dataTypeName)-1]
                lenVal, err := strconv.Atoi(lenStr)
diff --git a/plc4go/internal/ads/Reader.go b/plc4go/internal/ads/Reader.go
index 0f6a548dd6..97e0971714 100644
--- a/plc4go/internal/ads/Reader.go
+++ b/plc4go/internal/ads/Reader.go
@@ -265,7 +265,7 @@ func (m *Connection) parsePlcValue(dataType 
driverModel.AdsDataTypeTableEntry, a
        if len(arrayInfo) > 0 {
                // This is an Array/List type.
                curArrayInfo := arrayInfo[0]
-               arrayItemTypeName := 
dataType.GetDataTypeName()[strings.Index(dataType.GetDataTypeName(), " OF ")+4:]
+               arrayItemTypeName := 
dataType.GetSecondaryName()[strings.Index(dataType.GetSecondaryName(), " OF 
")+4:]
                arrayItemType, ok := 
m.driverContext.dataTypeTable[arrayItemTypeName]
                if !ok {
                        return nil, fmt.Errorf("couldn't resolve array item 
type %s", arrayItemTypeName)
@@ -286,10 +286,10 @@ func (m *Connection) parsePlcValue(dataType 
driverModel.AdsDataTypeTableEntry, a
                startPos := uint32(rb.GetPos())
                curPos := uint32(0)
                for _, child := range dataType.GetChildren() {
-                       childName := child.GetPropertyName()
-                       childDataType, ok := 
m.driverContext.dataTypeTable[child.GetDataTypeName()]
+                       childName := child.GetMainName()
+                       childDataType, ok := 
m.driverContext.dataTypeTable[child.GetSecondaryName()]
                        if !ok {
-                               return nil, fmt.Errorf("couldn't find data type 
named %s for property %s of type %s", child.GetDataTypeName(), childName, 
dataType.GetDataTypeName())
+                               return nil, fmt.Errorf("couldn't find data type 
named %s for property %s of type %s", child.GetSecondaryName(), childName, 
dataType.GetSecondaryName())
                        }
                        if child.GetOffset() > curPos {
                                skipBytes := child.GetOffset() - curPos
@@ -299,7 +299,7 @@ func (m *Connection) parsePlcValue(dataType 
driverModel.AdsDataTypeTableEntry, a
                        }
                        childValue, err := m.parsePlcValue(childDataType, 
childDataType.GetArrayInfo(), rb)
                        if err != nil {
-                               return nil, errors.Wrap(err, fmt.Sprintf("error 
parsing propery %s of type %s", childName, dataType.GetDataTypeName()))
+                               return nil, errors.Wrap(err, fmt.Sprintf("error 
parsing propery %s of type %s", childName, dataType.GetSecondaryName()))
                        }
                        plcValues[childName] = childValue
                        curPos = uint32(rb.GetPos()) - startPos
@@ -309,7 +309,7 @@ func (m *Connection) parsePlcValue(dataType 
driverModel.AdsDataTypeTableEntry, a
                // This is a primitive type.
                valueType, stringLength := 
m.getPlcValueForAdsDataTypeTableEntry(dataType)
                if valueType == apiValues.NULL {
-                       return nil, errors.New(fmt.Sprintf("error converting %s 
into plc4x plc-value type", dataType.GetDataTypeName()))
+                       return nil, errors.New(fmt.Sprintf("error converting %s 
into plc4x plc-value type", dataType.GetSecondaryName()))
                }
 
                adsValueType, ok := 
apiValues.PlcValueTypeByName(valueType.String())
diff --git a/plc4go/internal/ads/ValueHandler.go 
b/plc4go/internal/ads/ValueHandler.go
index 362abc92d7..b7a1acc719 100644
--- a/plc4go/internal/ads/ValueHandler.go
+++ b/plc4go/internal/ads/ValueHandler.go
@@ -132,10 +132,10 @@ func (t ValueHandler) AdsParseStructType(dataType 
readWriteModel.AdsDataTypeTabl
                childValues := plcStruct.GetStruct()
 
                for _, childTypeEntry := range dataType.GetChildren() {
-                       childName := childTypeEntry.GetPropertyName()
-                       childType := 
t.driverContext.dataTypeTable[childTypeEntry.GetDataTypeName()]
+                       childName := childTypeEntry.GetMainName()
+                       childType := 
t.driverContext.dataTypeTable[childTypeEntry.GetSecondaryName()]
                        childArrayInfo := childType.GetArrayInfo()
-                       childValue, ok := 
childValues[childTypeEntry.GetPropertyName()]
+                       childValue, ok := 
childValues[childTypeEntry.GetMainName()]
                        if !ok {
                                return nil, fmt.Errorf("missing child value 
named %s", childName)
                        }
@@ -151,10 +151,10 @@ func (t ValueHandler) AdsParseStructType(dataType 
readWriteModel.AdsDataTypeTabl
                parsedValues := map[string]apiValues.PlcValue{}
 
                for _, childTypeEntry := range dataType.GetChildren() {
-                       childName := childTypeEntry.GetPropertyName()
-                       childType := 
t.driverContext.dataTypeTable[childTypeEntry.GetDataTypeName()]
+                       childName := childTypeEntry.GetMainName()
+                       childType := 
t.driverContext.dataTypeTable[childTypeEntry.GetSecondaryName()]
                        childArrayInfo := childType.GetArrayInfo()
-                       childValue, ok := 
simpleMap[childTypeEntry.GetPropertyName()]
+                       childValue, ok := 
simpleMap[childTypeEntry.GetMainName()]
                        if !ok {
                                return nil, fmt.Errorf("missing child value 
named %s", childName)
                        }
diff --git a/plc4go/internal/ads/Writer.go b/plc4go/internal/ads/Writer.go
index 31737c70e6..35e6cfc778 100644
--- a/plc4go/internal/ads/Writer.go
+++ b/plc4go/internal/ads/Writer.go
@@ -242,7 +242,7 @@ func (m *Connection) serializePlcValue(dataType 
driverModel.AdsDataTypeTableEntr
                        return fmt.Errorf("expecting exactly %d items in the 
list", len(plcValues))
                }
 
-               arrayItemTypeName := 
dataType.GetDataTypeName()[strings.Index(dataType.GetDataTypeName(), " OF ")+4:]
+               arrayItemTypeName := 
dataType.GetSecondaryName()[strings.Index(dataType.GetSecondaryName(), " OF 
")+4:]
                arrayItemType, ok := 
m.driverContext.dataTypeTable[arrayItemTypeName]
                if !ok {
                        return fmt.Errorf("couldn't resolve array item type 
%s", arrayItemTypeName)
@@ -271,10 +271,10 @@ func (m *Connection) serializePlcValue(dataType 
driverModel.AdsDataTypeTableEntr
                startPos := uint32(wb.GetPos())
                curPos := uint32(0)
                for _, child := range dataType.GetChildren() {
-                       childName := child.GetPropertyName()
-                       childDataType, ok := 
m.driverContext.dataTypeTable[child.GetDataTypeName()]
+                       childName := child.GetMainName()
+                       childDataType, ok := 
m.driverContext.dataTypeTable[child.GetSecondaryName()]
                        if !ok {
-                               return fmt.Errorf("couldn't find data type 
named %s for property %s of type %s", child.GetDataTypeName(), childName, 
dataType.GetDataTypeName())
+                               return fmt.Errorf("couldn't find data type 
named %s for property %s of type %s", child.GetSecondaryName(), childName, 
dataType.GetSecondaryName())
                        }
                        if child.GetOffset() > curPos {
                                skipBytes := child.GetOffset() - curPos
@@ -291,7 +291,7 @@ func (m *Connection) serializePlcValue(dataType 
driverModel.AdsDataTypeTableEntr
                        }
                        err := m.serializePlcValue(childDataType, 
childArrayInfo, plcValues[childName], wb)
                        if err != nil {
-                               return errors.Wrap(err, fmt.Sprintf("error 
parsing propery %s of type %s", childName, dataType.GetDataTypeName()))
+                               return errors.Wrap(err, fmt.Sprintf("error 
parsing propery %s of type %s", childName, dataType.GetSecondaryName()))
                        }
                        curPos = uint32(wb.GetPos()) - startPos
                }
@@ -300,7 +300,7 @@ func (m *Connection) serializePlcValue(dataType 
driverModel.AdsDataTypeTableEntr
                // This is a primitive type.
                valueType, stringLength := 
m.getPlcValueForAdsDataTypeTableEntry(dataType)
                if valueType == apiValues.NULL {
-                       return errors.New(fmt.Sprintf("error converting %s into 
plc4x plc-value type", dataType.GetDataTypeName()))
+                       return errors.New(fmt.Sprintf("error converting %s into 
plc4x plc-value type", dataType.GetSecondaryName()))
                }
                adsValueType, ok := 
apiValues.PlcValueTypeByName(valueType.String())
                if !ok {
diff --git a/plc4go/protocols/ads/readwrite/ParserHelper.go 
b/plc4go/protocols/ads/readwrite/ParserHelper.go
index db0f52655a..c63144f05c 100644
--- a/plc4go/protocols/ads/readwrite/ParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/ParserHelper.go
@@ -65,8 +65,6 @@ func (m AdsParserHelper) Parse(typeName string, arguments 
[]string, io utils.Rea
                return AdsStampHeaderParseWithBuffer(context.Background(), io)
        case "AmsSerialResetFrame":
                return AmsSerialResetFrameParseWithBuffer(context.Background(), 
io)
-       case "AdsDataTypeTableChildEntry":
-               return 
AdsDataTypeTableChildEntryParseWithBuffer(context.Background(), io)
        case "AdsNotificationSample":
                return 
AdsNotificationSampleParseWithBuffer(context.Background(), io)
        case "AdsSymbolTableEntry":
diff --git a/plc4go/protocols/ads/readwrite/XmlParserHelper.go 
b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
index c0ca6d218f..3e9ff485ea 100644
--- a/plc4go/protocols/ads/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
@@ -77,8 +77,6 @@ func (m AdsXmlParserHelper) Parse(typeName string, xmlString 
string, parserArgum
                return AdsStampHeaderParseWithBuffer(context.Background(), 
utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
        case "AmsSerialResetFrame":
                return AmsSerialResetFrameParseWithBuffer(context.Background(), 
utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-       case "AdsDataTypeTableChildEntry":
-               return 
AdsDataTypeTableChildEntryParseWithBuffer(context.Background(), 
utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
        case "AdsNotificationSample":
                return 
AdsNotificationSampleParseWithBuffer(context.Background(), 
utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
        case "AdsSymbolTableEntry":
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go 
b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
deleted file mode 100644
index 5270c68c6c..0000000000
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
+++ /dev/null
@@ -1,825 +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 model
-
-import (
-       "context"
-       "encoding/binary"
-       stdErrors "errors"
-       "fmt"
-
-       "github.com/pkg/errors"
-       "github.com/rs/zerolog"
-
-       "github.com/apache/plc4x/plc4go/spi/codegen"
-       . "github.com/apache/plc4x/plc4go/spi/codegen/fields"
-       . "github.com/apache/plc4x/plc4go/spi/codegen/io"
-       "github.com/apache/plc4x/plc4go/spi/utils"
-)
-
-// Code generated by code-generation. DO NOT EDIT.
-
-// Constant values.
-const AdsDataTypeTableChildEntry_PROPERTYNAMETERMINATOR uint8 = 0x00
-const AdsDataTypeTableChildEntry_DATATYPENAMETERMINATOR uint8 = 0x00
-const AdsDataTypeTableChildEntry_COMMENTTERMINATOR uint8 = 0x00
-
-// AdsDataTypeTableChildEntry is the corresponding interface of 
AdsDataTypeTableChildEntry
-// In data-type child entries, the name seems to be used by the property name 
and the data-type name seems to contain
-// what in the parent case the "name" attribute seems to use.
-// TODO: In general only the propertyName, dataTypeName and offset are 
interesting here. The rest is mostly not fully initialized
-type AdsDataTypeTableChildEntry interface {
-       fmt.Stringer
-       utils.LengthAware
-       utils.Serializable
-       utils.Copyable
-       // 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
-       // GetOffset returns Offset (property field)
-       GetOffset() 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
-       // GetPropertyName returns PropertyName (property field)
-       GetPropertyName() string
-       // GetDataTypeName returns DataTypeName (property field)
-       GetDataTypeName() 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)
-       // 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.
-       GetRest() []byte
-       // IsAdsDataTypeTableChildEntry is a marker method to prevent 
unintentional type checks (interfaces of same signature)
-       IsAdsDataTypeTableChildEntry()
-       // CreateBuilder creates a AdsDataTypeTableChildEntryBuilder
-       CreateAdsDataTypeTableChildEntryBuilder() 
AdsDataTypeTableChildEntryBuilder
-}
-
-// _AdsDataTypeTableChildEntry is the data-structure of this message
-type _AdsDataTypeTableChildEntry struct {
-       EntryLength     uint32
-       Version         uint32
-       HashValue       uint32
-       TypeHashValue   uint32
-       Size            uint32
-       Offset          uint32
-       DataType        uint32
-       Flags           uint32
-       ArrayDimensions uint16
-       NumChildren     uint16
-       PropertyName    string
-       DataTypeName    string
-       Comment         string
-       ArrayInfo       []AdsDataTypeArrayInfo
-       Children        []AdsDataTypeTableEntry
-       Rest            []byte
-}
-
-var _ AdsDataTypeTableChildEntry = (*_AdsDataTypeTableChildEntry)(nil)
-
-// NewAdsDataTypeTableChildEntry factory function for 
_AdsDataTypeTableChildEntry
-func NewAdsDataTypeTableChildEntry(entryLength uint32, version uint32, 
hashValue uint32, typeHashValue uint32, size uint32, offset uint32, dataType 
uint32, flags uint32, arrayDimensions uint16, numChildren uint16, propertyName 
string, dataTypeName string, comment string, arrayInfo []AdsDataTypeArrayInfo, 
children []AdsDataTypeTableEntry, rest []byte) *_AdsDataTypeTableChildEntry {
-       return &_AdsDataTypeTableChildEntry{EntryLength: entryLength, Version: 
version, HashValue: hashValue, TypeHashValue: typeHashValue, Size: size, 
Offset: offset, DataType: dataType, Flags: flags, ArrayDimensions: 
arrayDimensions, NumChildren: numChildren, PropertyName: propertyName, 
DataTypeName: dataTypeName, Comment: comment, ArrayInfo: arrayInfo, Children: 
children, Rest: rest}
-}
-
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-/////////////////////// Builder
-///////////////////////
-
-// AdsDataTypeTableChildEntryBuilder is a builder for 
AdsDataTypeTableChildEntry
-type AdsDataTypeTableChildEntryBuilder interface {
-       utils.Copyable
-       // WithMandatoryFields adds all mandatory fields (convenience for using 
multiple builder calls)
-       WithMandatoryFields(entryLength uint32, version uint32, hashValue 
uint32, typeHashValue uint32, size uint32, offset uint32, dataType uint32, 
flags uint32, arrayDimensions uint16, numChildren uint16, propertyName string, 
dataTypeName string, comment string, arrayInfo []AdsDataTypeArrayInfo, children 
[]AdsDataTypeTableEntry, rest []byte) AdsDataTypeTableChildEntryBuilder
-       // WithEntryLength adds EntryLength (property field)
-       WithEntryLength(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithVersion adds Version (property field)
-       WithVersion(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithHashValue adds HashValue (property field)
-       WithHashValue(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithTypeHashValue adds TypeHashValue (property field)
-       WithTypeHashValue(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithSize adds Size (property field)
-       WithSize(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithOffset adds Offset (property field)
-       WithOffset(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithDataType adds DataType (property field)
-       WithDataType(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithFlags adds Flags (property field)
-       WithFlags(uint32) AdsDataTypeTableChildEntryBuilder
-       // WithArrayDimensions adds ArrayDimensions (property field)
-       WithArrayDimensions(uint16) AdsDataTypeTableChildEntryBuilder
-       // WithNumChildren adds NumChildren (property field)
-       WithNumChildren(uint16) AdsDataTypeTableChildEntryBuilder
-       // WithPropertyName adds PropertyName (property field)
-       WithPropertyName(string) AdsDataTypeTableChildEntryBuilder
-       // WithDataTypeName adds DataTypeName (property field)
-       WithDataTypeName(string) AdsDataTypeTableChildEntryBuilder
-       // WithComment adds Comment (property field)
-       WithComment(string) AdsDataTypeTableChildEntryBuilder
-       // WithArrayInfo adds ArrayInfo (property field)
-       WithArrayInfo(...AdsDataTypeArrayInfo) AdsDataTypeTableChildEntryBuilder
-       // WithChildren adds Children (property field)
-       WithChildren(...AdsDataTypeTableEntry) AdsDataTypeTableChildEntryBuilder
-       // WithRest adds Rest (property field)
-       WithRest(...byte) AdsDataTypeTableChildEntryBuilder
-       // Build builds the AdsDataTypeTableChildEntry or returns an error if 
something is wrong
-       Build() (AdsDataTypeTableChildEntry, error)
-       // MustBuild does the same as Build but panics on error
-       MustBuild() AdsDataTypeTableChildEntry
-}
-
-// NewAdsDataTypeTableChildEntryBuilder() creates a 
AdsDataTypeTableChildEntryBuilder
-func NewAdsDataTypeTableChildEntryBuilder() AdsDataTypeTableChildEntryBuilder {
-       return &_AdsDataTypeTableChildEntryBuilder{_AdsDataTypeTableChildEntry: 
new(_AdsDataTypeTableChildEntry)}
-}
-
-type _AdsDataTypeTableChildEntryBuilder struct {
-       *_AdsDataTypeTableChildEntry
-
-       collectedErr []error
-}
-
-var _ (AdsDataTypeTableChildEntryBuilder) = 
(*_AdsDataTypeTableChildEntryBuilder)(nil)
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithMandatoryFields(entryLength 
uint32, version uint32, hashValue uint32, typeHashValue uint32, size uint32, 
offset uint32, dataType uint32, flags uint32, arrayDimensions uint16, 
numChildren uint16, propertyName string, dataTypeName string, comment string, 
arrayInfo []AdsDataTypeArrayInfo, children []AdsDataTypeTableEntry, rest 
[]byte) AdsDataTypeTableChildEntryBuilder {
-       return 
b.WithEntryLength(entryLength).WithVersion(version).WithHashValue(hashValue).WithTypeHashValue(typeHashValue).WithSize(size).WithOffset(offset).WithDataType(dataType).WithFlags(flags).WithArrayDimensions(arrayDimensions).WithNumChildren(numChildren).WithPropertyName(propertyName).WithDataTypeName(dataTypeName).WithComment(comment).WithArrayInfo(arrayInfo...).WithChildren(children...).WithRest(rest...)
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithEntryLength(entryLength 
uint32) AdsDataTypeTableChildEntryBuilder {
-       b.EntryLength = entryLength
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithVersion(version uint32) 
AdsDataTypeTableChildEntryBuilder {
-       b.Version = version
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithHashValue(hashValue uint32) 
AdsDataTypeTableChildEntryBuilder {
-       b.HashValue = hashValue
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithTypeHashValue(typeHashValue 
uint32) AdsDataTypeTableChildEntryBuilder {
-       b.TypeHashValue = typeHashValue
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithSize(size uint32) 
AdsDataTypeTableChildEntryBuilder {
-       b.Size = size
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithOffset(offset uint32) 
AdsDataTypeTableChildEntryBuilder {
-       b.Offset = offset
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithDataType(dataType uint32) 
AdsDataTypeTableChildEntryBuilder {
-       b.DataType = dataType
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithFlags(flags uint32) 
AdsDataTypeTableChildEntryBuilder {
-       b.Flags = flags
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) 
WithArrayDimensions(arrayDimensions uint16) AdsDataTypeTableChildEntryBuilder {
-       b.ArrayDimensions = arrayDimensions
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithNumChildren(numChildren 
uint16) AdsDataTypeTableChildEntryBuilder {
-       b.NumChildren = numChildren
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithPropertyName(propertyName 
string) AdsDataTypeTableChildEntryBuilder {
-       b.PropertyName = propertyName
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithDataTypeName(dataTypeName 
string) AdsDataTypeTableChildEntryBuilder {
-       b.DataTypeName = dataTypeName
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithComment(comment string) 
AdsDataTypeTableChildEntryBuilder {
-       b.Comment = comment
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithArrayInfo(arrayInfo 
...AdsDataTypeArrayInfo) AdsDataTypeTableChildEntryBuilder {
-       b.ArrayInfo = arrayInfo
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithChildren(children 
...AdsDataTypeTableEntry) AdsDataTypeTableChildEntryBuilder {
-       b.Children = children
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) WithRest(rest ...byte) 
AdsDataTypeTableChildEntryBuilder {
-       b.Rest = rest
-       return b
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) Build() 
(AdsDataTypeTableChildEntry, error) {
-       if err := stdErrors.Join(b.collectedErr...); err != nil {
-               return nil, errors.Wrap(err, "error occurred during build")
-       }
-       return b._AdsDataTypeTableChildEntry.deepCopy(), nil
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) MustBuild() 
AdsDataTypeTableChildEntry {
-       build, err := b.Build()
-       if err != nil {
-               panic(err)
-       }
-       return build
-}
-
-func (b *_AdsDataTypeTableChildEntryBuilder) DeepCopy() any {
-       _copy := 
b.CreateAdsDataTypeTableChildEntryBuilder().(*_AdsDataTypeTableChildEntryBuilder)
-       if b.collectedErr != nil {
-               copy(_copy.collectedErr, b.collectedErr)
-       }
-       return _copy
-}
-
-// CreateAdsDataTypeTableChildEntryBuilder creates a 
AdsDataTypeTableChildEntryBuilder
-func (b *_AdsDataTypeTableChildEntry) 
CreateAdsDataTypeTableChildEntryBuilder() AdsDataTypeTableChildEntryBuilder {
-       if b == nil {
-               return NewAdsDataTypeTableChildEntryBuilder()
-       }
-       return &_AdsDataTypeTableChildEntryBuilder{_AdsDataTypeTableChildEntry: 
b.deepCopy()}
-}
-
-///////////////////////
-///////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-/////////////////////// Accessors for property fields.
-///////////////////////
-
-func (m *_AdsDataTypeTableChildEntry) GetEntryLength() uint32 {
-       return m.EntryLength
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetVersion() uint32 {
-       return m.Version
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetHashValue() uint32 {
-       return m.HashValue
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetTypeHashValue() uint32 {
-       return m.TypeHashValue
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetSize() uint32 {
-       return m.Size
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetOffset() uint32 {
-       return m.Offset
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetDataType() uint32 {
-       return m.DataType
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetFlags() uint32 {
-       return m.Flags
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetArrayDimensions() uint16 {
-       return m.ArrayDimensions
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetNumChildren() uint16 {
-       return m.NumChildren
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetPropertyName() string {
-       return m.PropertyName
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetDataTypeName() string {
-       return m.DataTypeName
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetComment() string {
-       return m.Comment
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetArrayInfo() []AdsDataTypeArrayInfo {
-       return m.ArrayInfo
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetChildren() []AdsDataTypeTableEntry {
-       return m.Children
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetRest() []byte {
-       return m.Rest
-}
-
-///////////////////////
-///////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-/////////////////////// Accessors for const fields.
-///////////////////////
-
-func (m *_AdsDataTypeTableChildEntry) GetPropertyNameTerminator() uint8 {
-       return AdsDataTypeTableChildEntry_PROPERTYNAMETERMINATOR
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetDataTypeNameTerminator() uint8 {
-       return AdsDataTypeTableChildEntry_DATATYPENAMETERMINATOR
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetCommentTerminator() uint8 {
-       return AdsDataTypeTableChildEntry_COMMENTTERMINATOR
-}
-
-///////////////////////
-///////////////////////
-///////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////
-
-// Deprecated: use the interface for direct cast
-func CastAdsDataTypeTableChildEntry(structType any) AdsDataTypeTableChildEntry 
{
-       if casted, ok := structType.(AdsDataTypeTableChildEntry); ok {
-               return casted
-       }
-       if casted, ok := structType.(*AdsDataTypeTableChildEntry); ok {
-               return *casted
-       }
-       return nil
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetTypeName() string {
-       return "AdsDataTypeTableChildEntry"
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetLengthInBits(ctx context.Context) 
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 (offset)
-       lengthInBits += 32
-
-       // Simple field (dataType)
-       lengthInBits += 32
-
-       // Simple field (flags)
-       lengthInBits += 32
-
-       // Implicit Field (propertyNameLength)
-       lengthInBits += 16
-
-       // Implicit Field (dataTypeNameLength)
-       lengthInBits += 16
-
-       // Implicit Field (commentLength)
-       lengthInBits += 16
-
-       // Simple field (arrayDimensions)
-       lengthInBits += 16
-
-       // Simple field (numChildren)
-       lengthInBits += 16
-
-       // Simple field (propertyName)
-       lengthInBits += uint16(int32(uint16(len(m.GetPropertyName()))) * 
int32(int32(8)))
-
-       // Const Field (propertyNameTerminator)
-       lengthInBits += 8
-
-       // Simple field (dataTypeName)
-       lengthInBits += uint16(int32(uint16(len(m.GetDataTypeName()))) * 
int32(int32(8)))
-
-       // Const Field (dataTypeNameTerminator)
-       lengthInBits += 8
-
-       // Simple field (comment)
-       lengthInBits += uint16(int32(uint16(len(m.GetComment()))) * 
int32(int32(8)))
-
-       // Const Field (commentTerminator)
-       lengthInBits += 8
-
-       // Array field
-       if len(m.ArrayInfo) > 0 {
-               for _curItem, element := range m.ArrayInfo {
-                       arrayCtx := utils.CreateArrayContext(ctx, 
len(m.ArrayInfo), _curItem)
-                       lengthInBits += element.GetLengthInBits(arrayCtx)
-               }
-       }
-
-       // Array field
-       if len(m.Children) > 0 {
-               for _curItem, element := range m.Children {
-                       arrayCtx := utils.CreateArrayContext(ctx, 
len(m.Children), _curItem)
-                       lengthInBits += element.GetLengthInBits(arrayCtx)
-               }
-       }
-
-       // Array field
-       if len(m.Rest) > 0 {
-               lengthInBits += 8 * uint16(len(m.Rest))
-       }
-
-       return lengthInBits
-}
-
-func (m *_AdsDataTypeTableChildEntry) GetLengthInBytes(ctx context.Context) 
uint16 {
-       return m.GetLengthInBits(ctx) / 8
-}
-
-func AdsDataTypeTableChildEntryParse(ctx context.Context, theBytes []byte) 
(AdsDataTypeTableChildEntry, error) {
-       return AdsDataTypeTableChildEntryParseWithBuffer(ctx, 
utils.NewReadBufferByteBased(theBytes, 
utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
-}
-
-func AdsDataTypeTableChildEntryParseWithBufferProducer() func(ctx 
context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeTableChildEntry, 
error) {
-       return func(ctx context.Context, readBuffer utils.ReadBuffer) 
(AdsDataTypeTableChildEntry, error) {
-               return AdsDataTypeTableChildEntryParseWithBuffer(ctx, 
readBuffer)
-       }
-}
-
-func AdsDataTypeTableChildEntryParseWithBuffer(ctx context.Context, readBuffer 
utils.ReadBuffer) (AdsDataTypeTableChildEntry, error) {
-       v, err := (new(_AdsDataTypeTableChildEntry)).parse(ctx, readBuffer)
-       if err != nil {
-               return nil, err
-       }
-       return v, nil
-}
-
-func (m *_AdsDataTypeTableChildEntry) parse(ctx context.Context, readBuffer 
utils.ReadBuffer) (__adsDataTypeTableChildEntry AdsDataTypeTableChildEntry, err 
error) {
-       positionAware := readBuffer
-       _ = positionAware
-       if pullErr := readBuffer.PullContext("AdsDataTypeTableChildEntry"); 
pullErr != nil {
-               return nil, errors.Wrap(pullErr, "Error pulling for 
AdsDataTypeTableChildEntry")
-       }
-       currentPos := positionAware.GetPos()
-       _ = currentPos
-       var startPos = positionAware.GetPos()
-       _ = startPos
-
-       entryLength, err := ReadSimpleField(ctx, "entryLength", 
ReadUnsignedInt(readBuffer, uint8(32)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'entryLength' field"))
-       }
-       m.EntryLength = entryLength
-
-       version, err := ReadSimpleField(ctx, "version", 
ReadUnsignedInt(readBuffer, uint8(32)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'version' field"))
-       }
-       m.Version = version
-
-       hashValue, err := ReadSimpleField(ctx, "hashValue", 
ReadUnsignedInt(readBuffer, uint8(32)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'hashValue' field"))
-       }
-       m.HashValue = hashValue
-
-       typeHashValue, err := ReadSimpleField(ctx, "typeHashValue", 
ReadUnsignedInt(readBuffer, uint8(32)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'typeHashValue' field"))
-       }
-       m.TypeHashValue = typeHashValue
-
-       size, err := ReadSimpleField(ctx, "size", ReadUnsignedInt(readBuffer, 
uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'size' 
field"))
-       }
-       m.Size = size
-
-       offset, err := ReadSimpleField(ctx, "offset", 
ReadUnsignedInt(readBuffer, uint8(32)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'offset' field"))
-       }
-       m.Offset = offset
-
-       dataType, err := ReadSimpleField(ctx, "dataType", 
ReadUnsignedInt(readBuffer, uint8(32)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'dataType' field"))
-       }
-       m.DataType = dataType
-
-       flags, err := ReadSimpleField(ctx, "flags", ReadUnsignedInt(readBuffer, 
uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flags' 
field"))
-       }
-       m.Flags = flags
-
-       propertyNameLength, err := ReadImplicitField[uint16](ctx, 
"propertyNameLength", ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'propertyNameLength' field"))
-       }
-       _ = propertyNameLength
-
-       dataTypeNameLength, err := ReadImplicitField[uint16](ctx, 
"dataTypeNameLength", ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'dataTypeNameLength' field"))
-       }
-       _ = dataTypeNameLength
-
-       commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", 
ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'commentLength' field"))
-       }
-       _ = commentLength
-
-       arrayDimensions, err := ReadSimpleField(ctx, "arrayDimensions", 
ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'arrayDimensions' field"))
-       }
-       m.ArrayDimensions = arrayDimensions
-
-       numChildren, err := ReadSimpleField(ctx, "numChildren", 
ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'numChildren' field"))
-       }
-       m.NumChildren = numChildren
-
-       propertyName, err := ReadSimpleField(ctx, "propertyName", 
ReadString(readBuffer, uint32(int32(propertyNameLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'propertyName' field"))
-       }
-       m.PropertyName = propertyName
-
-       propertyNameTerminator, err := ReadConstField[uint8](ctx, 
"propertyNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), 
AdsDataTypeTableChildEntry_PROPERTYNAMETERMINATOR, 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'propertyNameTerminator' field"))
-       }
-       _ = propertyNameTerminator
-
-       dataTypeName, err := ReadSimpleField(ctx, "dataTypeName", 
ReadString(readBuffer, uint32(int32(dataTypeNameLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'dataTypeName' field"))
-       }
-       m.DataTypeName = dataTypeName
-
-       dataTypeNameTerminator, err := ReadConstField[uint8](ctx, 
"dataTypeNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), 
AdsDataTypeTableChildEntry_DATATYPENAMETERMINATOR, 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'dataTypeNameTerminator' field"))
-       }
-       _ = dataTypeNameTerminator
-
-       comment, err := ReadSimpleField(ctx, "comment", ReadString(readBuffer, 
uint32(int32(commentLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'comment' field"))
-       }
-       m.Comment = comment
-
-       commentTerminator, err := ReadConstField[uint8](ctx, 
"commentTerminator", ReadUnsignedByte(readBuffer, uint8(8)), 
AdsDataTypeTableChildEntry_COMMENTTERMINATOR, 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'commentTerminator' field"))
-       }
-       _ = commentTerminator
-
-       arrayInfo, err := ReadCountArrayField[AdsDataTypeArrayInfo](ctx, 
"arrayInfo", 
ReadComplex[AdsDataTypeArrayInfo](AdsDataTypeArrayInfoParseWithBuffer, 
readBuffer), uint64(arrayDimensions), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'arrayInfo' field"))
-       }
-       m.ArrayInfo = arrayInfo
-
-       children, err := ReadCountArrayField[AdsDataTypeTableEntry](ctx, 
"children", 
ReadComplex[AdsDataTypeTableEntry](AdsDataTypeTableEntryParseWithBuffer, 
readBuffer), uint64(numChildren), codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'children' field"))
-       }
-       m.Children = children
-
-       rest, err := readBuffer.ReadByteArray("rest", 
int(int32(entryLength)-int32((positionAware.GetPos()-startPos))), 
codegen.WithByteOrder(binary.LittleEndian))
-       if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'rest' 
field"))
-       }
-       m.Rest = rest
-
-       if closeErr := readBuffer.CloseContext("AdsDataTypeTableChildEntry"); 
closeErr != nil {
-               return nil, errors.Wrap(closeErr, "Error closing for 
AdsDataTypeTableChildEntry")
-       }
-
-       return m, nil
-}
-
-func (m *_AdsDataTypeTableChildEntry) Serialize() ([]byte, error) {
-       wb := 
utils.NewWriteBufferByteBased(utils.WithInitialSizeForByteBasedBuffer(int(m.GetLengthInBytes(context.Background()))),
 utils.WithByteOrderForByteBasedBuffer(binary.LittleEndian))
-       if err := m.SerializeWithWriteBuffer(context.Background(), wb); err != 
nil {
-               return nil, err
-       }
-       return wb.GetBytes(), nil
-}
-
-func (m *_AdsDataTypeTableChildEntry) SerializeWithWriteBuffer(ctx 
context.Context, writeBuffer utils.WriteBuffer) error {
-       positionAware := writeBuffer
-       _ = positionAware
-       log := zerolog.Ctx(ctx)
-       _ = log
-       if pushErr := writeBuffer.PushContext("AdsDataTypeTableChildEntry"); 
pushErr != nil {
-               return errors.Wrap(pushErr, "Error pushing for 
AdsDataTypeTableChildEntry")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "entryLength", 
m.GetEntryLength(), WriteUnsignedInt(writeBuffer, 32), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'entryLength' field")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "version", m.GetVersion(), 
WriteUnsignedInt(writeBuffer, 32), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 'version' field")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "hashValue", m.GetHashValue(), 
WriteUnsignedInt(writeBuffer, 32), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 'hashValue' field")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "typeHashValue", 
m.GetTypeHashValue(), WriteUnsignedInt(writeBuffer, 32), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'typeHashValue' 
field")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "size", m.GetSize(), 
WriteUnsignedInt(writeBuffer, 32), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 'size' field")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "offset", m.GetOffset(), 
WriteUnsignedInt(writeBuffer, 32), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 'offset' field")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "dataType", m.GetDataType(), 
WriteUnsignedInt(writeBuffer, 32), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 'dataType' field")
-       }
-
-       if err := WriteSimpleField[uint32](ctx, "flags", m.GetFlags(), 
WriteUnsignedInt(writeBuffer, 32), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 'flags' field")
-       }
-       propertyNameLength := uint16(uint16(len(m.GetPropertyName())))
-       if err := WriteImplicitField(ctx, "propertyNameLength", 
propertyNameLength, WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'propertyNameLength' 
field")
-       }
-       dataTypeNameLength := uint16(uint16(len(m.GetDataTypeName())))
-       if err := WriteImplicitField(ctx, "dataTypeNameLength", 
dataTypeNameLength, WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'dataTypeNameLength' 
field")
-       }
-       commentLength := uint16(uint16(len(m.GetComment())))
-       if err := WriteImplicitField(ctx, "commentLength", commentLength, 
WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'commentLength' 
field")
-       }
-
-       if err := WriteSimpleField[uint16](ctx, "arrayDimensions", 
m.GetArrayDimensions(), WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'arrayDimensions' 
field")
-       }
-
-       if err := WriteSimpleField[uint16](ctx, "numChildren", 
m.GetNumChildren(), WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'numChildren' field")
-       }
-
-       if err := WriteSimpleField[string](ctx, "propertyName", 
m.GetPropertyName(), WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetPropertyName())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'propertyName' 
field")
-       }
-
-       if err := WriteConstField(ctx, "propertyNameTerminator", 
AdsDataTypeTableChildEntry_PROPERTYNAMETERMINATOR, 
WriteUnsignedByte(writeBuffer, 8), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 
'propertyNameTerminator' field")
-       }
-
-       if err := WriteSimpleField[string](ctx, "dataTypeName", 
m.GetDataTypeName(), WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetDataTypeName())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'dataTypeName' 
field")
-       }
-
-       if err := WriteConstField(ctx, "dataTypeNameTerminator", 
AdsDataTypeTableChildEntry_DATATYPENAMETERMINATOR, 
WriteUnsignedByte(writeBuffer, 8), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 
'dataTypeNameTerminator' field")
-       }
-
-       if err := WriteSimpleField[string](ctx, "comment", m.GetComment(), 
WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetComment())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'comment' field")
-       }
-
-       if err := WriteConstField(ctx, "commentTerminator", 
AdsDataTypeTableChildEntry_COMMENTTERMINATOR, WriteUnsignedByte(writeBuffer, 
8), codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'commentTerminator' 
field")
-       }
-
-       if err := WriteComplexTypeArrayField(ctx, "arrayInfo", 
m.GetArrayInfo(), writeBuffer, codegen.WithByteOrder(binary.LittleEndian)); err 
!= nil {
-               return errors.Wrap(err, "Error serializing 'arrayInfo' field")
-       }
-
-       if err := WriteComplexTypeArrayField(ctx, "children", m.GetChildren(), 
writeBuffer, codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'children' field")
-       }
-
-       if err := WriteByteArrayField(ctx, "rest", m.GetRest(), 
WriteByteArray(writeBuffer, 8), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
-               return errors.Wrap(err, "Error serializing 'rest' field")
-       }
-
-       if popErr := writeBuffer.PopContext("AdsDataTypeTableChildEntry"); 
popErr != nil {
-               return errors.Wrap(popErr, "Error popping for 
AdsDataTypeTableChildEntry")
-       }
-       return nil
-}
-
-func (m *_AdsDataTypeTableChildEntry) IsAdsDataTypeTableChildEntry() {}
-
-func (m *_AdsDataTypeTableChildEntry) DeepCopy() any {
-       return m.deepCopy()
-}
-
-func (m *_AdsDataTypeTableChildEntry) deepCopy() *_AdsDataTypeTableChildEntry {
-       if m == nil {
-               return nil
-       }
-       _AdsDataTypeTableChildEntryCopy := &_AdsDataTypeTableChildEntry{
-               m.EntryLength,
-               m.Version,
-               m.HashValue,
-               m.TypeHashValue,
-               m.Size,
-               m.Offset,
-               m.DataType,
-               m.Flags,
-               m.ArrayDimensions,
-               m.NumChildren,
-               m.PropertyName,
-               m.DataTypeName,
-               m.Comment,
-               utils.DeepCopySlice[AdsDataTypeArrayInfo, 
AdsDataTypeArrayInfo](m.ArrayInfo),
-               utils.DeepCopySlice[AdsDataTypeTableEntry, 
AdsDataTypeTableEntry](m.Children),
-               utils.DeepCopySlice[byte, byte](m.Rest),
-       }
-       return _AdsDataTypeTableChildEntryCopy
-}
-
-func (m *_AdsDataTypeTableChildEntry) String() string {
-       if m == nil {
-               return "<nil>"
-       }
-       wb := utils.NewWriteBufferBoxBased(
-               utils.WithWriteBufferBoxBasedMergeSingleBoxes(),
-               utils.WithWriteBufferBoxBasedOmitEmptyBoxes(),
-               utils.WithWriteBufferBoxBasedPrintPosLengthFooter(),
-       )
-       if err := wb.WriteSerializable(context.Background(), m); err != nil {
-               return err.Error()
-       }
-       return wb.GetBox().String()
-}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go 
b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
index 20f93f69d7..372097115c 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
@@ -37,8 +37,8 @@ import (
 // Code generated by code-generation. DO NOT EDIT.
 
 // Constant values.
-const AdsDataTypeTableEntry_DATATYPENAMETERMINATOR uint8 = 0x00
-const AdsDataTypeTableEntry_SIMPLETYPENAMETERMINATOR uint8 = 0x00
+const AdsDataTypeTableEntry_MAINNAMETERMINATOR uint8 = 0x00
+const AdsDataTypeTableEntry_SECONDARYNAMETERMINATOR uint8 = 0x00
 const AdsDataTypeTableEntry_COMMENTTERMINATOR uint8 = 0x00
 
 // AdsDataTypeTableEntry is the corresponding interface of 
AdsDataTypeTableEntry
@@ -68,16 +68,16 @@ type AdsDataTypeTableEntry interface {
        GetArrayDimensions() uint16
        // GetNumChildren returns NumChildren (property field)
        GetNumChildren() uint16
-       // GetDataTypeName returns DataTypeName (property field)
-       GetDataTypeName() string
-       // GetSimpleTypeName returns SimpleTypeName (property field)
-       GetSimpleTypeName() string
+       // GetMainName returns MainName (property field)
+       GetMainName() string
+       // GetSecondaryName returns SecondaryName (property field)
+       GetSecondaryName() string
        // GetComment returns Comment (property field)
        GetComment() string
        // GetArrayInfo returns ArrayInfo (property field)
        GetArrayInfo() []AdsDataTypeArrayInfo
        // GetChildren returns Children (property field)
-       GetChildren() []AdsDataTypeTableChildEntry
+       GetChildren() []AdsDataTypeTableEntry
        // GetRest returns Rest (property field)
        // 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.
@@ -103,19 +103,19 @@ type _AdsDataTypeTableEntry struct {
        Flags           uint32
        ArrayDimensions uint16
        NumChildren     uint16
-       DataTypeName    string
-       SimpleTypeName  string
+       MainName        string
+       SecondaryName   string
        Comment         string
        ArrayInfo       []AdsDataTypeArrayInfo
-       Children        []AdsDataTypeTableChildEntry
+       Children        []AdsDataTypeTableEntry
        Rest            []byte
 }
 
 var _ AdsDataTypeTableEntry = (*_AdsDataTypeTableEntry)(nil)
 
 // NewAdsDataTypeTableEntry factory function for _AdsDataTypeTableEntry
-func NewAdsDataTypeTableEntry(entryLength uint32, version uint32, hashValue 
uint32, typeHashValue uint32, size uint32, offset uint32, dataType uint32, 
flags uint32, arrayDimensions uint16, numChildren uint16, dataTypeName string, 
simpleTypeName string, comment string, arrayInfo []AdsDataTypeArrayInfo, 
children []AdsDataTypeTableChildEntry, rest []byte) *_AdsDataTypeTableEntry {
-       return &_AdsDataTypeTableEntry{EntryLength: entryLength, Version: 
version, HashValue: hashValue, TypeHashValue: typeHashValue, Size: size, 
Offset: offset, DataType: dataType, Flags: flags, ArrayDimensions: 
arrayDimensions, NumChildren: numChildren, DataTypeName: dataTypeName, 
SimpleTypeName: simpleTypeName, Comment: comment, ArrayInfo: arrayInfo, 
Children: children, Rest: rest}
+func NewAdsDataTypeTableEntry(entryLength uint32, version uint32, hashValue 
uint32, typeHashValue uint32, size uint32, offset uint32, dataType uint32, 
flags uint32, arrayDimensions uint16, numChildren uint16, mainName string, 
secondaryName string, comment string, arrayInfo []AdsDataTypeArrayInfo, 
children []AdsDataTypeTableEntry, rest []byte) *_AdsDataTypeTableEntry {
+       return &_AdsDataTypeTableEntry{EntryLength: entryLength, Version: 
version, HashValue: hashValue, TypeHashValue: typeHashValue, Size: size, 
Offset: offset, DataType: dataType, Flags: flags, ArrayDimensions: 
arrayDimensions, NumChildren: numChildren, MainName: mainName, SecondaryName: 
secondaryName, Comment: comment, ArrayInfo: arrayInfo, Children: children, 
Rest: rest}
 }
 
 ///////////////////////////////////////////////////////////
@@ -127,7 +127,7 @@ func NewAdsDataTypeTableEntry(entryLength uint32, version 
uint32, hashValue uint
 type AdsDataTypeTableEntryBuilder interface {
        utils.Copyable
        // WithMandatoryFields adds all mandatory fields (convenience for using 
multiple builder calls)
-       WithMandatoryFields(entryLength uint32, version uint32, hashValue 
uint32, typeHashValue uint32, size uint32, offset uint32, dataType uint32, 
flags uint32, arrayDimensions uint16, numChildren uint16, dataTypeName string, 
simpleTypeName string, comment string, arrayInfo []AdsDataTypeArrayInfo, 
children []AdsDataTypeTableChildEntry, rest []byte) AdsDataTypeTableEntryBuilder
+       WithMandatoryFields(entryLength uint32, version uint32, hashValue 
uint32, typeHashValue uint32, size uint32, offset uint32, dataType uint32, 
flags uint32, arrayDimensions uint16, numChildren uint16, mainName string, 
secondaryName string, comment string, arrayInfo []AdsDataTypeArrayInfo, 
children []AdsDataTypeTableEntry, rest []byte) AdsDataTypeTableEntryBuilder
        // WithEntryLength adds EntryLength (property field)
        WithEntryLength(uint32) AdsDataTypeTableEntryBuilder
        // WithVersion adds Version (property field)
@@ -148,16 +148,16 @@ type AdsDataTypeTableEntryBuilder interface {
        WithArrayDimensions(uint16) AdsDataTypeTableEntryBuilder
        // WithNumChildren adds NumChildren (property field)
        WithNumChildren(uint16) AdsDataTypeTableEntryBuilder
-       // WithDataTypeName adds DataTypeName (property field)
-       WithDataTypeName(string) AdsDataTypeTableEntryBuilder
-       // WithSimpleTypeName adds SimpleTypeName (property field)
-       WithSimpleTypeName(string) AdsDataTypeTableEntryBuilder
+       // WithMainName adds MainName (property field)
+       WithMainName(string) AdsDataTypeTableEntryBuilder
+       // WithSecondaryName adds SecondaryName (property field)
+       WithSecondaryName(string) AdsDataTypeTableEntryBuilder
        // WithComment adds Comment (property field)
        WithComment(string) AdsDataTypeTableEntryBuilder
        // WithArrayInfo adds ArrayInfo (property field)
        WithArrayInfo(...AdsDataTypeArrayInfo) AdsDataTypeTableEntryBuilder
        // WithChildren adds Children (property field)
-       WithChildren(...AdsDataTypeTableChildEntry) AdsDataTypeTableEntryBuilder
+       WithChildren(...AdsDataTypeTableEntry) AdsDataTypeTableEntryBuilder
        // WithRest adds Rest (property field)
        WithRest(...byte) AdsDataTypeTableEntryBuilder
        // Build builds the AdsDataTypeTableEntry or returns an error if 
something is wrong
@@ -179,8 +179,8 @@ type _AdsDataTypeTableEntryBuilder struct {
 
 var _ (AdsDataTypeTableEntryBuilder) = (*_AdsDataTypeTableEntryBuilder)(nil)
 
-func (b *_AdsDataTypeTableEntryBuilder) WithMandatoryFields(entryLength 
uint32, version uint32, hashValue uint32, typeHashValue uint32, size uint32, 
offset uint32, dataType uint32, flags uint32, arrayDimensions uint16, 
numChildren uint16, dataTypeName string, simpleTypeName string, comment string, 
arrayInfo []AdsDataTypeArrayInfo, children []AdsDataTypeTableChildEntry, rest 
[]byte) AdsDataTypeTableEntryBuilder {
-       return 
b.WithEntryLength(entryLength).WithVersion(version).WithHashValue(hashValue).WithTypeHashValue(typeHashValue).WithSize(size).WithOffset(offset).WithDataType(dataType).WithFlags(flags).WithArrayDimensions(arrayDimensions).WithNumChildren(numChildren).WithDataTypeName(dataTypeName).WithSimpleTypeName(simpleTypeName).WithComment(comment).WithArrayInfo(arrayInfo...).WithChildren(children...).WithRest(rest...)
+func (b *_AdsDataTypeTableEntryBuilder) WithMandatoryFields(entryLength 
uint32, version uint32, hashValue uint32, typeHashValue uint32, size uint32, 
offset uint32, dataType uint32, flags uint32, arrayDimensions uint16, 
numChildren uint16, mainName string, secondaryName string, comment string, 
arrayInfo []AdsDataTypeArrayInfo, children []AdsDataTypeTableEntry, rest 
[]byte) AdsDataTypeTableEntryBuilder {
+       return 
b.WithEntryLength(entryLength).WithVersion(version).WithHashValue(hashValue).WithTypeHashValue(typeHashValue).WithSize(size).WithOffset(offset).WithDataType(dataType).WithFlags(flags).WithArrayDimensions(arrayDimensions).WithNumChildren(numChildren).WithMainName(mainName).WithSecondaryName(secondaryName).WithComment(comment).WithArrayInfo(arrayInfo...).WithChildren(children...).WithRest(rest...)
 }
 
 func (b *_AdsDataTypeTableEntryBuilder) WithEntryLength(entryLength uint32) 
AdsDataTypeTableEntryBuilder {
@@ -233,13 +233,13 @@ func (b *_AdsDataTypeTableEntryBuilder) 
WithNumChildren(numChildren uint16) AdsD
        return b
 }
 
-func (b *_AdsDataTypeTableEntryBuilder) WithDataTypeName(dataTypeName string) 
AdsDataTypeTableEntryBuilder {
-       b.DataTypeName = dataTypeName
+func (b *_AdsDataTypeTableEntryBuilder) WithMainName(mainName string) 
AdsDataTypeTableEntryBuilder {
+       b.MainName = mainName
        return b
 }
 
-func (b *_AdsDataTypeTableEntryBuilder) WithSimpleTypeName(simpleTypeName 
string) AdsDataTypeTableEntryBuilder {
-       b.SimpleTypeName = simpleTypeName
+func (b *_AdsDataTypeTableEntryBuilder) WithSecondaryName(secondaryName 
string) AdsDataTypeTableEntryBuilder {
+       b.SecondaryName = secondaryName
        return b
 }
 
@@ -253,7 +253,7 @@ func (b *_AdsDataTypeTableEntryBuilder) 
WithArrayInfo(arrayInfo ...AdsDataTypeAr
        return b
 }
 
-func (b *_AdsDataTypeTableEntryBuilder) WithChildren(children 
...AdsDataTypeTableChildEntry) AdsDataTypeTableEntryBuilder {
+func (b *_AdsDataTypeTableEntryBuilder) WithChildren(children 
...AdsDataTypeTableEntry) AdsDataTypeTableEntryBuilder {
        b.Children = children
        return b
 }
@@ -344,12 +344,12 @@ func (m *_AdsDataTypeTableEntry) GetNumChildren() uint16 {
        return m.NumChildren
 }
 
-func (m *_AdsDataTypeTableEntry) GetDataTypeName() string {
-       return m.DataTypeName
+func (m *_AdsDataTypeTableEntry) GetMainName() string {
+       return m.MainName
 }
 
-func (m *_AdsDataTypeTableEntry) GetSimpleTypeName() string {
-       return m.SimpleTypeName
+func (m *_AdsDataTypeTableEntry) GetSecondaryName() string {
+       return m.SecondaryName
 }
 
 func (m *_AdsDataTypeTableEntry) GetComment() string {
@@ -360,7 +360,7 @@ func (m *_AdsDataTypeTableEntry) GetArrayInfo() 
[]AdsDataTypeArrayInfo {
        return m.ArrayInfo
 }
 
-func (m *_AdsDataTypeTableEntry) GetChildren() []AdsDataTypeTableChildEntry {
+func (m *_AdsDataTypeTableEntry) GetChildren() []AdsDataTypeTableEntry {
        return m.Children
 }
 
@@ -377,12 +377,12 @@ func (m *_AdsDataTypeTableEntry) GetRest() []byte {
 /////////////////////// Accessors for const fields.
 ///////////////////////
 
-func (m *_AdsDataTypeTableEntry) GetDataTypeNameTerminator() uint8 {
-       return AdsDataTypeTableEntry_DATATYPENAMETERMINATOR
+func (m *_AdsDataTypeTableEntry) GetMainNameTerminator() uint8 {
+       return AdsDataTypeTableEntry_MAINNAMETERMINATOR
 }
 
-func (m *_AdsDataTypeTableEntry) GetSimpleTypeNameTerminator() uint8 {
-       return AdsDataTypeTableEntry_SIMPLETYPENAMETERMINATOR
+func (m *_AdsDataTypeTableEntry) GetSecondaryNameTerminator() uint8 {
+       return AdsDataTypeTableEntry_SECONDARYNAMETERMINATOR
 }
 
 func (m *_AdsDataTypeTableEntry) GetCommentTerminator() uint8 {
@@ -436,10 +436,10 @@ func (m *_AdsDataTypeTableEntry) GetLengthInBits(ctx 
context.Context) uint16 {
        // Simple field (flags)
        lengthInBits += 32
 
-       // Implicit Field (dataTypeNameLength)
+       // Implicit Field (mainNameLength)
        lengthInBits += 16
 
-       // Implicit Field (simpleTypeNameLength)
+       // Implicit Field (secondaryNameLength)
        lengthInBits += 16
 
        // Implicit Field (commentLength)
@@ -451,16 +451,16 @@ func (m *_AdsDataTypeTableEntry) GetLengthInBits(ctx 
context.Context) uint16 {
        // Simple field (numChildren)
        lengthInBits += 16
 
-       // Simple field (dataTypeName)
-       lengthInBits += uint16(int32(uint16(len(m.GetDataTypeName()))) * 
int32(int32(8)))
+       // Simple field (mainName)
+       lengthInBits += uint16(int32(uint16(len(m.GetMainName()))) * 
int32(int32(8)))
 
-       // Const Field (dataTypeNameTerminator)
+       // Const Field (mainNameTerminator)
        lengthInBits += 8
 
-       // Simple field (simpleTypeName)
-       lengthInBits += uint16(int32(uint16(len(m.GetSimpleTypeName()))) * 
int32(int32(8)))
+       // Simple field (secondaryName)
+       lengthInBits += uint16(int32(uint16(len(m.GetSecondaryName()))) * 
int32(int32(8)))
 
-       // Const Field (simpleTypeNameTerminator)
+       // Const Field (secondaryNameTerminator)
        lengthInBits += 8
 
        // Simple field (comment)
@@ -574,17 +574,17 @@ func (m *_AdsDataTypeTableEntry) parse(ctx 
context.Context, readBuffer utils.Rea
        }
        m.Flags = flags
 
-       dataTypeNameLength, err := ReadImplicitField[uint16](ctx, 
"dataTypeNameLength", ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
+       mainNameLength, err := ReadImplicitField[uint16](ctx, "mainNameLength", 
ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'dataTypeNameLength' field"))
+               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'mainNameLength' field"))
        }
-       _ = dataTypeNameLength
+       _ = mainNameLength
 
-       simpleTypeNameLength, err := ReadImplicitField[uint16](ctx, 
"simpleTypeNameLength", ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
+       secondaryNameLength, err := ReadImplicitField[uint16](ctx, 
"secondaryNameLength", ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'simpleTypeNameLength' field"))
+               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'secondaryNameLength' field"))
        }
-       _ = simpleTypeNameLength
+       _ = secondaryNameLength
 
        commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", 
ReadUnsignedShort(readBuffer, uint8(16)), 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
@@ -604,29 +604,29 @@ func (m *_AdsDataTypeTableEntry) parse(ctx 
context.Context, readBuffer utils.Rea
        }
        m.NumChildren = numChildren
 
-       dataTypeName, err := ReadSimpleField(ctx, "dataTypeName", 
ReadString(readBuffer, uint32(int32(dataTypeNameLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
+       mainName, err := ReadSimpleField(ctx, "mainName", 
ReadString(readBuffer, uint32(int32(mainNameLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'dataTypeName' field"))
+               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'mainName' field"))
        }
-       m.DataTypeName = dataTypeName
+       m.MainName = mainName
 
-       dataTypeNameTerminator, err := ReadConstField[uint8](ctx, 
"dataTypeNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), 
AdsDataTypeTableEntry_DATATYPENAMETERMINATOR, 
codegen.WithByteOrder(binary.LittleEndian))
+       mainNameTerminator, err := ReadConstField[uint8](ctx, 
"mainNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), 
AdsDataTypeTableEntry_MAINNAMETERMINATOR, 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'dataTypeNameTerminator' field"))
+               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'mainNameTerminator' field"))
        }
-       _ = dataTypeNameTerminator
+       _ = mainNameTerminator
 
-       simpleTypeName, err := ReadSimpleField(ctx, "simpleTypeName", 
ReadString(readBuffer, uint32(int32(simpleTypeNameLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
+       secondaryName, err := ReadSimpleField(ctx, "secondaryName", 
ReadString(readBuffer, uint32(int32(secondaryNameLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'simpleTypeName' field"))
+               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'secondaryName' field"))
        }
-       m.SimpleTypeName = simpleTypeName
+       m.SecondaryName = secondaryName
 
-       simpleTypeNameTerminator, err := ReadConstField[uint8](ctx, 
"simpleTypeNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), 
AdsDataTypeTableEntry_SIMPLETYPENAMETERMINATOR, 
codegen.WithByteOrder(binary.LittleEndian))
+       secondaryNameTerminator, err := ReadConstField[uint8](ctx, 
"secondaryNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), 
AdsDataTypeTableEntry_SECONDARYNAMETERMINATOR, 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
-               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'simpleTypeNameTerminator' field"))
+               return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'secondaryNameTerminator' field"))
        }
-       _ = simpleTypeNameTerminator
+       _ = secondaryNameTerminator
 
        comment, err := ReadSimpleField(ctx, "comment", ReadString(readBuffer, 
uint32(int32(commentLength)*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
@@ -646,7 +646,7 @@ func (m *_AdsDataTypeTableEntry) parse(ctx context.Context, 
readBuffer utils.Rea
        }
        m.ArrayInfo = arrayInfo
 
-       children, err := ReadCountArrayField[AdsDataTypeTableChildEntry](ctx, 
"children", 
ReadComplex[AdsDataTypeTableChildEntry](AdsDataTypeTableChildEntryParseWithBuffer,
 readBuffer), uint64(numChildren), codegen.WithByteOrder(binary.LittleEndian))
+       children, err := ReadCountArrayField[AdsDataTypeTableEntry](ctx, 
"children", 
ReadComplex[AdsDataTypeTableEntry](AdsDataTypeTableEntryParseWithBuffer, 
readBuffer), uint64(numChildren), codegen.WithByteOrder(binary.LittleEndian))
        if err != nil {
                return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 
'children' field"))
        }
@@ -713,13 +713,13 @@ func (m *_AdsDataTypeTableEntry) 
SerializeWithWriteBuffer(ctx context.Context, w
        if err := WriteSimpleField[uint32](ctx, "flags", m.GetFlags(), 
WriteUnsignedInt(writeBuffer, 32), codegen.WithByteOrder(binary.LittleEndian)); 
err != nil {
                return errors.Wrap(err, "Error serializing 'flags' field")
        }
-       dataTypeNameLength := uint16(uint16(len(m.GetDataTypeName())))
-       if err := WriteImplicitField(ctx, "dataTypeNameLength", 
dataTypeNameLength, WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'dataTypeNameLength' 
field")
+       mainNameLength := uint16(uint16(len(m.GetMainName())))
+       if err := WriteImplicitField(ctx, "mainNameLength", mainNameLength, 
WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
+               return errors.Wrap(err, "Error serializing 'mainNameLength' 
field")
        }
-       simpleTypeNameLength := uint16(uint16(len(m.GetSimpleTypeName())))
-       if err := WriteImplicitField(ctx, "simpleTypeNameLength", 
simpleTypeNameLength, WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 
'simpleTypeNameLength' field")
+       secondaryNameLength := uint16(uint16(len(m.GetSecondaryName())))
+       if err := WriteImplicitField(ctx, "secondaryNameLength", 
secondaryNameLength, WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
+               return errors.Wrap(err, "Error serializing 
'secondaryNameLength' field")
        }
        commentLength := uint16(uint16(len(m.GetComment())))
        if err := WriteImplicitField(ctx, "commentLength", commentLength, 
WriteUnsignedShort(writeBuffer, 16), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
@@ -734,20 +734,20 @@ func (m *_AdsDataTypeTableEntry) 
SerializeWithWriteBuffer(ctx context.Context, w
                return errors.Wrap(err, "Error serializing 'numChildren' field")
        }
 
-       if err := WriteSimpleField[string](ctx, "dataTypeName", 
m.GetDataTypeName(), WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetDataTypeName())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'dataTypeName' 
field")
+       if err := WriteSimpleField[string](ctx, "mainName", m.GetMainName(), 
WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetMainName())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
+               return errors.Wrap(err, "Error serializing 'mainName' field")
        }
 
-       if err := WriteConstField(ctx, "dataTypeNameTerminator", 
AdsDataTypeTableEntry_DATATYPENAMETERMINATOR, WriteUnsignedByte(writeBuffer, 
8), codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 
'dataTypeNameTerminator' field")
+       if err := WriteConstField(ctx, "mainNameTerminator", 
AdsDataTypeTableEntry_MAINNAMETERMINATOR, WriteUnsignedByte(writeBuffer, 8), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
+               return errors.Wrap(err, "Error serializing 'mainNameTerminator' 
field")
        }
 
-       if err := WriteSimpleField[string](ctx, "simpleTypeName", 
m.GetSimpleTypeName(), WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetSimpleTypeName())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 'simpleTypeName' 
field")
+       if err := WriteSimpleField[string](ctx, "secondaryName", 
m.GetSecondaryName(), WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetSecondaryName())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
+               return errors.Wrap(err, "Error serializing 'secondaryName' 
field")
        }
 
-       if err := WriteConstField(ctx, "simpleTypeNameTerminator", 
AdsDataTypeTableEntry_SIMPLETYPENAMETERMINATOR, WriteUnsignedByte(writeBuffer, 
8), codegen.WithByteOrder(binary.LittleEndian)); err != nil {
-               return errors.Wrap(err, "Error serializing 
'simpleTypeNameTerminator' field")
+       if err := WriteConstField(ctx, "secondaryNameTerminator", 
AdsDataTypeTableEntry_SECONDARYNAMETERMINATOR, WriteUnsignedByte(writeBuffer, 
8), codegen.WithByteOrder(binary.LittleEndian)); err != nil {
+               return errors.Wrap(err, "Error serializing 
'secondaryNameTerminator' field")
        }
 
        if err := WriteSimpleField[string](ctx, "comment", m.GetComment(), 
WriteString(writeBuffer, 
int32(int32(uint16(len(m.GetComment())))*int32(int32(8)))), 
codegen.WithByteOrder(binary.LittleEndian)); err != nil {
@@ -797,11 +797,11 @@ func (m *_AdsDataTypeTableEntry) deepCopy() 
*_AdsDataTypeTableEntry {
                m.Flags,
                m.ArrayDimensions,
                m.NumChildren,
-               m.DataTypeName,
-               m.SimpleTypeName,
+               m.MainName,
+               m.SecondaryName,
                m.Comment,
                utils.DeepCopySlice[AdsDataTypeArrayInfo, 
AdsDataTypeArrayInfo](m.ArrayInfo),
-               utils.DeepCopySlice[AdsDataTypeTableChildEntry, 
AdsDataTypeTableChildEntry](m.Children),
+               utils.DeepCopySlice[AdsDataTypeTableEntry, 
AdsDataTypeTableEntry](m.Children),
                utils.DeepCopySlice[byte, byte](m.Rest),
        }
        return _AdsDataTypeTableEntryCopy
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequestInterceptor.java
 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequestInterceptor.java
index 495a27c5cf..893987de86 100644
--- 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequestInterceptor.java
+++ 
b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcBrowseRequestInterceptor.java
@@ -18,8 +18,10 @@
  */
 package org.apache.plc4x.java.api.messages;
 
+import org.apache.plc4x.java.api.model.PlcQuery;
+
 public interface PlcBrowseRequestInterceptor {
 
-    boolean intercept(PlcBrowseItem item);
+    boolean intercept(PlcQuery query, PlcBrowseItem item);
 
 }
diff --git 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataTypeTableChildEntry.java
 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataTypeTableChildEntry.java
deleted file mode 100644
index 2cd336d1a9..0000000000
--- 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataTypeTableChildEntry.java
+++ /dev/null
@@ -1,679 +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.ads.readwrite;
-
-import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
-import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
-import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
-import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
-import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
-
-import java.time.*;
-import java.util.*;
-import org.apache.plc4x.java.api.exceptions.*;
-import org.apache.plc4x.java.api.value.*;
-import org.apache.plc4x.java.spi.codegen.*;
-import org.apache.plc4x.java.spi.codegen.fields.*;
-import org.apache.plc4x.java.spi.codegen.io.*;
-import org.apache.plc4x.java.spi.generation.*;
-
-// Code generated by code-generation. DO NOT EDIT.
-
-/**
- * In data-type child entries, the name seems to be used by the property name 
and the data-type name
- * seems to contain what in the parent case the "name" attribute seems to use. 
TODO: In general only
- * the propertyName, dataTypeName and offset are interesting here. The rest is 
mostly not fully
- * initialized
- */
-public class AdsDataTypeTableChildEntry implements Message {
-
-  // Constant values.
-  public static final Short PROPERTYNAMETERMINATOR = 0x00;
-  public static final Short DATATYPENAMETERMINATOR = 0x00;
-  public static final Short COMMENTTERMINATOR = 0x00;
-
-  // Properties.
-  protected final long entryLength;
-  protected final long version;
-  protected final long hashValue;
-  protected final long typeHashValue;
-  protected final long size;
-  protected final long offset;
-  protected final long dataType;
-  protected final long flags;
-  protected final int arrayDimensions;
-  protected final int numChildren;
-  protected final String propertyName;
-  protected final String dataTypeName;
-  protected final String comment;
-  protected final List<AdsDataTypeArrayInfo> arrayInfo;
-  protected final List<AdsDataTypeTableEntry> children;
-
-  /**
-   * 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.
-   */
-  protected final byte[] rest;
-
-  public AdsDataTypeTableChildEntry(
-      long entryLength,
-      long version,
-      long hashValue,
-      long typeHashValue,
-      long size,
-      long offset,
-      long dataType,
-      long flags,
-      int arrayDimensions,
-      int numChildren,
-      String propertyName,
-      String dataTypeName,
-      String comment,
-      List<AdsDataTypeArrayInfo> arrayInfo,
-      List<AdsDataTypeTableEntry> children,
-      byte[] rest) {
-    super();
-    this.entryLength = entryLength;
-    this.version = version;
-    this.hashValue = hashValue;
-    this.typeHashValue = typeHashValue;
-    this.size = size;
-    this.offset = offset;
-    this.dataType = dataType;
-    this.flags = flags;
-    this.arrayDimensions = arrayDimensions;
-    this.numChildren = numChildren;
-    this.propertyName = propertyName;
-    this.dataTypeName = dataTypeName;
-    this.comment = comment;
-    this.arrayInfo = arrayInfo;
-    this.children = children;
-    this.rest = rest;
-  }
-
-  public long getEntryLength() {
-    return entryLength;
-  }
-
-  public long getVersion() {
-    return version;
-  }
-
-  public long getHashValue() {
-    return hashValue;
-  }
-
-  public long getTypeHashValue() {
-    return typeHashValue;
-  }
-
-  public long getSize() {
-    return size;
-  }
-
-  public long getOffset() {
-    return offset;
-  }
-
-  public long getDataType() {
-    return dataType;
-  }
-
-  public long getFlags() {
-    return flags;
-  }
-
-  public int getArrayDimensions() {
-    return arrayDimensions;
-  }
-
-  public int getNumChildren() {
-    return numChildren;
-  }
-
-  public String getPropertyName() {
-    return propertyName;
-  }
-
-  public String getDataTypeName() {
-    return dataTypeName;
-  }
-
-  public String getComment() {
-    return comment;
-  }
-
-  public List<AdsDataTypeArrayInfo> getArrayInfo() {
-    return arrayInfo;
-  }
-
-  public List<AdsDataTypeTableEntry> getChildren() {
-    return children;
-  }
-
-  /**
-   * 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.
-   */
-  public byte[] getRest() {
-    return rest;
-  }
-
-  public short getPropertyNameTerminator() {
-    return PROPERTYNAMETERMINATOR;
-  }
-
-  public short getDataTypeNameTerminator() {
-    return DATATYPENAMETERMINATOR;
-  }
-
-  public short getCommentTerminator() {
-    return COMMENTTERMINATOR;
-  }
-
-  public void serialize(WriteBuffer writeBuffer) throws SerializationException 
{
-    PositionAware positionAware = writeBuffer;
-    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
-    int startPos = positionAware.getPos();
-    writeBuffer.pushContext("AdsDataTypeTableChildEntry");
-
-    // Simple Field (entryLength)
-    writeSimpleField(
-        "entryLength",
-        entryLength,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (version)
-    writeSimpleField(
-        "version",
-        version,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (hashValue)
-    writeSimpleField(
-        "hashValue",
-        hashValue,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (typeHashValue)
-    writeSimpleField(
-        "typeHashValue",
-        typeHashValue,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (size)
-    writeSimpleField(
-        "size",
-        size,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (offset)
-    writeSimpleField(
-        "offset",
-        offset,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (dataType)
-    writeSimpleField(
-        "dataType",
-        dataType,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (flags)
-    writeSimpleField(
-        "flags",
-        flags,
-        writeUnsignedLong(writeBuffer, 32),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Implicit Field (propertyNameLength) (Used for parsing, but its value is 
not stored as it's
-    // implicitly given by the objects content)
-    int propertyNameLength = (int) (STR_LEN(getPropertyName()));
-    writeImplicitField(
-        "propertyNameLength",
-        propertyNameLength,
-        writeUnsignedInt(writeBuffer, 16),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Implicit Field (dataTypeNameLength) (Used for parsing, but its value is 
not stored as it's
-    // implicitly given by the objects content)
-    int dataTypeNameLength = (int) (STR_LEN(getDataTypeName()));
-    writeImplicitField(
-        "dataTypeNameLength",
-        dataTypeNameLength,
-        writeUnsignedInt(writeBuffer, 16),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Implicit Field (commentLength) (Used for parsing, but its value is not 
stored as it's
-    // implicitly given by the objects content)
-    int commentLength = (int) (STR_LEN(getComment()));
-    writeImplicitField(
-        "commentLength",
-        commentLength,
-        writeUnsignedInt(writeBuffer, 16),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (arrayDimensions)
-    writeSimpleField(
-        "arrayDimensions",
-        arrayDimensions,
-        writeUnsignedInt(writeBuffer, 16),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (numChildren)
-    writeSimpleField(
-        "numChildren",
-        numChildren,
-        writeUnsignedInt(writeBuffer, 16),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (propertyName)
-    writeSimpleField(
-        "propertyName",
-        propertyName,
-        writeString(writeBuffer, (propertyNameLength) * (8)),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Const Field (propertyNameTerminator)
-    writeConstField(
-        "propertyNameTerminator",
-        PROPERTYNAMETERMINATOR,
-        writeUnsignedShort(writeBuffer, 8),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (dataTypeName)
-    writeSimpleField(
-        "dataTypeName",
-        dataTypeName,
-        writeString(writeBuffer, (dataTypeNameLength) * (8)),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Const Field (dataTypeNameTerminator)
-    writeConstField(
-        "dataTypeNameTerminator",
-        DATATYPENAMETERMINATOR,
-        writeUnsignedShort(writeBuffer, 8),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Simple Field (comment)
-    writeSimpleField(
-        "comment",
-        comment,
-        writeString(writeBuffer, (commentLength) * (8)),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Const Field (commentTerminator)
-    writeConstField(
-        "commentTerminator",
-        COMMENTTERMINATOR,
-        writeUnsignedShort(writeBuffer, 8),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Array Field (arrayInfo)
-    writeComplexTypeArrayField(
-        "arrayInfo", arrayInfo, writeBuffer, 
WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Array Field (children)
-    writeComplexTypeArrayField(
-        "children", children, writeBuffer, 
WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    // Array Field (rest)
-    writeByteArrayField(
-        "rest",
-        rest,
-        writeByteArray(writeBuffer, 8),
-        WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    writeBuffer.popContext("AdsDataTypeTableChildEntry");
-  }
-
-  @Override
-  public int getLengthInBytes() {
-    return (int) Math.ceil((float) getLengthInBits() / 8.0);
-  }
-
-  @Override
-  public int getLengthInBits() {
-    int lengthInBits = 0;
-    AdsDataTypeTableChildEntry _value = this;
-    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
-
-    // 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 (offset)
-    lengthInBits += 32;
-
-    // Simple field (dataType)
-    lengthInBits += 32;
-
-    // Simple field (flags)
-    lengthInBits += 32;
-
-    // Implicit Field (propertyNameLength)
-    lengthInBits += 16;
-
-    // Implicit Field (dataTypeNameLength)
-    lengthInBits += 16;
-
-    // Implicit Field (commentLength)
-    lengthInBits += 16;
-
-    // Simple field (arrayDimensions)
-    lengthInBits += 16;
-
-    // Simple field (numChildren)
-    lengthInBits += 16;
-
-    // Simple field (propertyName)
-    lengthInBits += (STR_LEN(getPropertyName())) * (8);
-
-    // Const Field (propertyNameTerminator)
-    lengthInBits += 8;
-
-    // Simple field (dataTypeName)
-    lengthInBits += (STR_LEN(getDataTypeName())) * (8);
-
-    // Const Field (dataTypeNameTerminator)
-    lengthInBits += 8;
-
-    // Simple field (comment)
-    lengthInBits += (STR_LEN(getComment())) * (8);
-
-    // Const Field (commentTerminator)
-    lengthInBits += 8;
-
-    // Array field
-    if (arrayInfo != null) {
-      int i = 0;
-      for (AdsDataTypeArrayInfo element : arrayInfo) {
-        ThreadLocalHelper.lastItemThreadLocal.set(++i >= arrayInfo.size());
-        lengthInBits += element.getLengthInBits();
-      }
-    }
-
-    // Array field
-    if (children != null) {
-      int i = 0;
-      for (AdsDataTypeTableEntry element : children) {
-        ThreadLocalHelper.lastItemThreadLocal.set(++i >= children.size());
-        lengthInBits += element.getLengthInBits();
-      }
-    }
-
-    // Array field
-    if (rest != null) {
-      lengthInBits += 8 * rest.length;
-    }
-
-    return lengthInBits;
-  }
-
-  public static AdsDataTypeTableChildEntry staticParse(ReadBuffer readBuffer)
-      throws ParseException {
-    readBuffer.pullContext("AdsDataTypeTableChildEntry");
-    PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
-
-    long entryLength =
-        readSimpleField(
-            "entryLength",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    long version =
-        readSimpleField(
-            "version",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    long hashValue =
-        readSimpleField(
-            "hashValue",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    long typeHashValue =
-        readSimpleField(
-            "typeHashValue",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    long size =
-        readSimpleField(
-            "size",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    long offset =
-        readSimpleField(
-            "offset",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    long dataType =
-        readSimpleField(
-            "dataType",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    long flags =
-        readSimpleField(
-            "flags",
-            readUnsignedLong(readBuffer, 32),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    int propertyNameLength =
-        readImplicitField(
-            "propertyNameLength",
-            readUnsignedInt(readBuffer, 16),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    int dataTypeNameLength =
-        readImplicitField(
-            "dataTypeNameLength",
-            readUnsignedInt(readBuffer, 16),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    int commentLength =
-        readImplicitField(
-            "commentLength",
-            readUnsignedInt(readBuffer, 16),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    int arrayDimensions =
-        readSimpleField(
-            "arrayDimensions",
-            readUnsignedInt(readBuffer, 16),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    int numChildren =
-        readSimpleField(
-            "numChildren",
-            readUnsignedInt(readBuffer, 16),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    String propertyName =
-        readSimpleField(
-            "propertyName",
-            readString(readBuffer, (propertyNameLength) * (8)),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    short propertyNameTerminator =
-        readConstField(
-            "propertyNameTerminator",
-            readUnsignedShort(readBuffer, 8),
-            AdsDataTypeTableChildEntry.PROPERTYNAMETERMINATOR,
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    String dataTypeName =
-        readSimpleField(
-            "dataTypeName",
-            readString(readBuffer, (dataTypeNameLength) * (8)),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    short dataTypeNameTerminator =
-        readConstField(
-            "dataTypeNameTerminator",
-            readUnsignedShort(readBuffer, 8),
-            AdsDataTypeTableChildEntry.DATATYPENAMETERMINATOR,
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    String comment =
-        readSimpleField(
-            "comment",
-            readString(readBuffer, (commentLength) * (8)),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    short commentTerminator =
-        readConstField(
-            "commentTerminator",
-            readUnsignedShort(readBuffer, 8),
-            AdsDataTypeTableChildEntry.COMMENTTERMINATOR,
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    List<AdsDataTypeArrayInfo> arrayInfo =
-        readCountArrayField(
-            "arrayInfo",
-            readComplex(() -> AdsDataTypeArrayInfo.staticParse(readBuffer), 
readBuffer),
-            arrayDimensions,
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    List<AdsDataTypeTableEntry> children =
-        readCountArrayField(
-            "children",
-            readComplex(() -> AdsDataTypeTableEntry.staticParse(readBuffer), 
readBuffer),
-            numChildren,
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    byte[] rest =
-        readBuffer.readByteArray(
-            "rest",
-            Math.toIntExact((entryLength) - ((positionAware.getPos() - 
startPos))),
-            WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
-
-    readBuffer.closeContext("AdsDataTypeTableChildEntry");
-    // Create the instance
-    AdsDataTypeTableChildEntry _adsDataTypeTableChildEntry;
-    _adsDataTypeTableChildEntry =
-        new AdsDataTypeTableChildEntry(
-            entryLength,
-            version,
-            hashValue,
-            typeHashValue,
-            size,
-            offset,
-            dataType,
-            flags,
-            arrayDimensions,
-            numChildren,
-            propertyName,
-            dataTypeName,
-            comment,
-            arrayInfo,
-            children,
-            rest);
-    return _adsDataTypeTableChildEntry;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (!(o instanceof AdsDataTypeTableChildEntry)) {
-      return false;
-    }
-    AdsDataTypeTableChildEntry that = (AdsDataTypeTableChildEntry) o;
-    return (getEntryLength() == that.getEntryLength())
-        && (getVersion() == that.getVersion())
-        && (getHashValue() == that.getHashValue())
-        && (getTypeHashValue() == that.getTypeHashValue())
-        && (getSize() == that.getSize())
-        && (getOffset() == that.getOffset())
-        && (getDataType() == that.getDataType())
-        && (getFlags() == that.getFlags())
-        && (getArrayDimensions() == that.getArrayDimensions())
-        && (getNumChildren() == that.getNumChildren())
-        && (getPropertyName() == that.getPropertyName())
-        && (getDataTypeName() == that.getDataTypeName())
-        && (getComment() == that.getComment())
-        && (getArrayInfo() == that.getArrayInfo())
-        && (getChildren() == that.getChildren())
-        && (getRest() == that.getRest())
-        && true;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(
-        getEntryLength(),
-        getVersion(),
-        getHashValue(),
-        getTypeHashValue(),
-        getSize(),
-        getOffset(),
-        getDataType(),
-        getFlags(),
-        getArrayDimensions(),
-        getNumChildren(),
-        getPropertyName(),
-        getDataTypeName(),
-        getComment(),
-        getArrayInfo(),
-        getChildren(),
-        getRest());
-  }
-
-  @Override
-  public String toString() {
-    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, 
true);
-    try {
-      writeBufferBoxBased.writeSerializable(this);
-    } catch (SerializationException e) {
-      throw new RuntimeException(e);
-    }
-    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
-  }
-}
diff --git 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataTypeTableEntry.java
 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataTypeTableEntry.java
index 2a7f0848bb..eb7f4a3d7a 100644
--- 
a/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataTypeTableEntry.java
+++ 
b/plc4j/drivers/ads/src/main/generated/org/apache/plc4x/java/ads/readwrite/AdsDataTypeTableEntry.java
@@ -39,8 +39,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AdsDataTypeTableEntry implements Message {
 
   // Constant values.
-  public static final Short DATATYPENAMETERMINATOR = 0x00;
-  public static final Short SIMPLETYPENAMETERMINATOR = 0x00;
+  public static final Short MAINNAMETERMINATOR = 0x00;
+  public static final Short SECONDARYNAMETERMINATOR = 0x00;
   public static final Short COMMENTTERMINATOR = 0x00;
 
   // Properties.
@@ -54,11 +54,11 @@ public class AdsDataTypeTableEntry implements Message {
   protected final long flags;
   protected final int arrayDimensions;
   protected final int numChildren;
-  protected final String dataTypeName;
-  protected final String simpleTypeName;
+  protected final String mainName;
+  protected final String secondaryName;
   protected final String comment;
   protected final List<AdsDataTypeArrayInfo> arrayInfo;
-  protected final List<AdsDataTypeTableChildEntry> children;
+  protected final List<AdsDataTypeTableEntry> children;
 
   /**
    * Gobbling up the rest, but it seems there is content in here, when looking 
at the data in
@@ -79,11 +79,11 @@ public class AdsDataTypeTableEntry implements Message {
       long flags,
       int arrayDimensions,
       int numChildren,
-      String dataTypeName,
-      String simpleTypeName,
+      String mainName,
+      String secondaryName,
       String comment,
       List<AdsDataTypeArrayInfo> arrayInfo,
-      List<AdsDataTypeTableChildEntry> children,
+      List<AdsDataTypeTableEntry> children,
       byte[] rest) {
     super();
     this.entryLength = entryLength;
@@ -96,8 +96,8 @@ public class AdsDataTypeTableEntry implements Message {
     this.flags = flags;
     this.arrayDimensions = arrayDimensions;
     this.numChildren = numChildren;
-    this.dataTypeName = dataTypeName;
-    this.simpleTypeName = simpleTypeName;
+    this.mainName = mainName;
+    this.secondaryName = secondaryName;
     this.comment = comment;
     this.arrayInfo = arrayInfo;
     this.children = children;
@@ -144,12 +144,12 @@ public class AdsDataTypeTableEntry implements Message {
     return numChildren;
   }
 
-  public String getDataTypeName() {
-    return dataTypeName;
+  public String getMainName() {
+    return mainName;
   }
 
-  public String getSimpleTypeName() {
-    return simpleTypeName;
+  public String getSecondaryName() {
+    return secondaryName;
   }
 
   public String getComment() {
@@ -160,7 +160,7 @@ public class AdsDataTypeTableEntry implements Message {
     return arrayInfo;
   }
 
-  public List<AdsDataTypeTableChildEntry> getChildren() {
+  public List<AdsDataTypeTableEntry> getChildren() {
     return children;
   }
 
@@ -174,12 +174,12 @@ public class AdsDataTypeTableEntry implements Message {
     return rest;
   }
 
-  public short getDataTypeNameTerminator() {
-    return DATATYPENAMETERMINATOR;
+  public short getMainNameTerminator() {
+    return MAINNAMETERMINATOR;
   }
 
-  public short getSimpleTypeNameTerminator() {
-    return SIMPLETYPENAMETERMINATOR;
+  public short getSecondaryNameTerminator() {
+    return SECONDARYNAMETERMINATOR;
   }
 
   public short getCommentTerminator() {
@@ -248,21 +248,21 @@ public class AdsDataTypeTableEntry implements Message {
         writeUnsignedLong(writeBuffer, 32),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    // Implicit Field (dataTypeNameLength) (Used for parsing, but its value is 
not stored as it's
+    // Implicit Field (mainNameLength) (Used for parsing, but its value is not 
stored as it's
     // implicitly given by the objects content)
-    int dataTypeNameLength = (int) (STR_LEN(getDataTypeName()));
+    int mainNameLength = (int) (STR_LEN(getMainName()));
     writeImplicitField(
-        "dataTypeNameLength",
-        dataTypeNameLength,
+        "mainNameLength",
+        mainNameLength,
         writeUnsignedInt(writeBuffer, 16),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    // Implicit Field (simpleTypeNameLength) (Used for parsing, but its value 
is not stored as it's
+    // Implicit Field (secondaryNameLength) (Used for parsing, but its value 
is not stored as it's
     // implicitly given by the objects content)
-    int simpleTypeNameLength = (int) (STR_LEN(getSimpleTypeName()));
+    int secondaryNameLength = (int) (STR_LEN(getSecondaryName()));
     writeImplicitField(
-        "simpleTypeNameLength",
-        simpleTypeNameLength,
+        "secondaryNameLength",
+        secondaryNameLength,
         writeUnsignedInt(writeBuffer, 16),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
@@ -289,31 +289,31 @@ public class AdsDataTypeTableEntry implements Message {
         writeUnsignedInt(writeBuffer, 16),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    // Simple Field (dataTypeName)
+    // Simple Field (mainName)
     writeSimpleField(
-        "dataTypeName",
-        dataTypeName,
-        writeString(writeBuffer, (dataTypeNameLength) * (8)),
+        "mainName",
+        mainName,
+        writeString(writeBuffer, (mainNameLength) * (8)),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    // Const Field (dataTypeNameTerminator)
+    // Const Field (mainNameTerminator)
     writeConstField(
-        "dataTypeNameTerminator",
-        DATATYPENAMETERMINATOR,
+        "mainNameTerminator",
+        MAINNAMETERMINATOR,
         writeUnsignedShort(writeBuffer, 8),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    // Simple Field (simpleTypeName)
+    // Simple Field (secondaryName)
     writeSimpleField(
-        "simpleTypeName",
-        simpleTypeName,
-        writeString(writeBuffer, (simpleTypeNameLength) * (8)),
+        "secondaryName",
+        secondaryName,
+        writeString(writeBuffer, (secondaryNameLength) * (8)),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    // Const Field (simpleTypeNameTerminator)
+    // Const Field (secondaryNameTerminator)
     writeConstField(
-        "simpleTypeNameTerminator",
-        SIMPLETYPENAMETERMINATOR,
+        "secondaryNameTerminator",
+        SECONDARYNAMETERMINATOR,
         writeUnsignedShort(writeBuffer, 8),
         WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
@@ -384,10 +384,10 @@ public class AdsDataTypeTableEntry implements Message {
     // Simple field (flags)
     lengthInBits += 32;
 
-    // Implicit Field (dataTypeNameLength)
+    // Implicit Field (mainNameLength)
     lengthInBits += 16;
 
-    // Implicit Field (simpleTypeNameLength)
+    // Implicit Field (secondaryNameLength)
     lengthInBits += 16;
 
     // Implicit Field (commentLength)
@@ -399,16 +399,16 @@ public class AdsDataTypeTableEntry implements Message {
     // Simple field (numChildren)
     lengthInBits += 16;
 
-    // Simple field (dataTypeName)
-    lengthInBits += (STR_LEN(getDataTypeName())) * (8);
+    // Simple field (mainName)
+    lengthInBits += (STR_LEN(getMainName())) * (8);
 
-    // Const Field (dataTypeNameTerminator)
+    // Const Field (mainNameTerminator)
     lengthInBits += 8;
 
-    // Simple field (simpleTypeName)
-    lengthInBits += (STR_LEN(getSimpleTypeName())) * (8);
+    // Simple field (secondaryName)
+    lengthInBits += (STR_LEN(getSecondaryName())) * (8);
 
-    // Const Field (simpleTypeNameTerminator)
+    // Const Field (secondaryNameTerminator)
     lengthInBits += 8;
 
     // Simple field (comment)
@@ -429,7 +429,7 @@ public class AdsDataTypeTableEntry implements Message {
     // Array field
     if (children != null) {
       int i = 0;
-      for (AdsDataTypeTableChildEntry element : children) {
+      for (AdsDataTypeTableEntry element : children) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= children.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -498,15 +498,15 @@ public class AdsDataTypeTableEntry implements Message {
             readUnsignedLong(readBuffer, 32),
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    int dataTypeNameLength =
+    int mainNameLength =
         readImplicitField(
-            "dataTypeNameLength",
+            "mainNameLength",
             readUnsignedInt(readBuffer, 16),
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    int simpleTypeNameLength =
+    int secondaryNameLength =
         readImplicitField(
-            "simpleTypeNameLength",
+            "secondaryNameLength",
             readUnsignedInt(readBuffer, 16),
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
@@ -528,30 +528,30 @@ public class AdsDataTypeTableEntry implements Message {
             readUnsignedInt(readBuffer, 16),
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    String dataTypeName =
+    String mainName =
         readSimpleField(
-            "dataTypeName",
-            readString(readBuffer, (dataTypeNameLength) * (8)),
+            "mainName",
+            readString(readBuffer, (mainNameLength) * (8)),
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    short dataTypeNameTerminator =
+    short mainNameTerminator =
         readConstField(
-            "dataTypeNameTerminator",
+            "mainNameTerminator",
             readUnsignedShort(readBuffer, 8),
-            AdsDataTypeTableEntry.DATATYPENAMETERMINATOR,
+            AdsDataTypeTableEntry.MAINNAMETERMINATOR,
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    String simpleTypeName =
+    String secondaryName =
         readSimpleField(
-            "simpleTypeName",
-            readString(readBuffer, (simpleTypeNameLength) * (8)),
+            "secondaryName",
+            readString(readBuffer, (secondaryNameLength) * (8)),
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    short simpleTypeNameTerminator =
+    short secondaryNameTerminator =
         readConstField(
-            "simpleTypeNameTerminator",
+            "secondaryNameTerminator",
             readUnsignedShort(readBuffer, 8),
-            AdsDataTypeTableEntry.SIMPLETYPENAMETERMINATOR,
+            AdsDataTypeTableEntry.SECONDARYNAMETERMINATOR,
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
     String comment =
@@ -574,10 +574,10 @@ public class AdsDataTypeTableEntry implements Message {
             arrayDimensions,
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
-    List<AdsDataTypeTableChildEntry> children =
+    List<AdsDataTypeTableEntry> children =
         readCountArrayField(
             "children",
-            readComplex(() -> 
AdsDataTypeTableChildEntry.staticParse(readBuffer), readBuffer),
+            readComplex(() -> AdsDataTypeTableEntry.staticParse(readBuffer), 
readBuffer),
             numChildren,
             WithOption.WithByteOrder(ByteOrder.LITTLE_ENDIAN));
 
@@ -602,8 +602,8 @@ public class AdsDataTypeTableEntry implements Message {
             flags,
             arrayDimensions,
             numChildren,
-            dataTypeName,
-            simpleTypeName,
+            mainName,
+            secondaryName,
             comment,
             arrayInfo,
             children,
@@ -630,8 +630,8 @@ public class AdsDataTypeTableEntry implements Message {
         && (getFlags() == that.getFlags())
         && (getArrayDimensions() == that.getArrayDimensions())
         && (getNumChildren() == that.getNumChildren())
-        && (getDataTypeName() == that.getDataTypeName())
-        && (getSimpleTypeName() == that.getSimpleTypeName())
+        && (getMainName() == that.getMainName())
+        && (getSecondaryName() == that.getSecondaryName())
         && (getComment() == that.getComment())
         && (getArrayInfo() == that.getArrayInfo())
         && (getChildren() == that.getChildren())
@@ -652,8 +652,8 @@ public class AdsDataTypeTableEntry implements Message {
         getFlags(),
         getArrayDimensions(),
         getNumChildren(),
-        getDataTypeName(),
-        getSimpleTypeName(),
+        getMainName(),
+        getSecondaryName(),
         getComment(),
         getArrayInfo(),
         getChildren(),
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 1ca0279f13..eb604f254e 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
@@ -380,7 +380,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                             for (int i = 0; i < 
adsTableSizes.getDataTypeCount(); i++) {
                                 try {
                                     AdsDataTypeTableEntry 
adsDataTypeTableEntry = AdsDataTypeTableEntry.staticParse(rb);
-                                    
dataTypeTable.put(adsDataTypeTableEntry.getDataTypeName(), 
adsDataTypeTableEntry);
+                                    
dataTypeTable.put(adsDataTypeTableEntry.getMainName(), adsDataTypeTableEntry);
                                 } catch (ParseException e) {
                                     throw new RuntimeException(e);
                                 }
@@ -492,7 +492,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
 
     @Override
     public CompletableFuture<PlcBrowseResponse> browse(PlcBrowseRequest 
browseRequest) {
-        return browseWithInterceptor(browseRequest, item -> true);
+        return browseWithInterceptor(browseRequest, (query, item) -> true);
     }
 
     public CompletableFuture<PlcBrowseResponse> 
browseWithInterceptor(PlcBrowseRequest browseRequest, 
PlcBrowseRequestInterceptor interceptor) {
@@ -500,6 +500,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
         Map<String, PlcResponseCode> responseCodes = new HashMap<>();
         Map<String, List<PlcBrowseItem>> values = new HashMap<>();
         for (String queryName : browseRequest.getQueryNames()) {
+            PlcQuery query = browseRequest.getQuery(queryName);
             List<PlcBrowseItem> resultsForQuery = new ArrayList<>();
             for (AdsSymbolTableEntry symbol : symbolTable.values()) {
                 // Get the datatype of this entry.
@@ -539,7 +540,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                     true, !symbol.getFlagReadOnly(), true, false, 
itemArrayInfo, childMap, options);
 
                 // Check if this item should be added to the result
-                if (interceptor.intercept(item)) {
+                if (interceptor.intercept(query, item)) {
                     // Add the type itself.
                     resultsForQuery.add(item);
                 }
@@ -555,9 +556,9 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
     protected List<PlcBrowseItem> getBrowseItems(String basePath, long 
baseGroupId, long baseOffset, boolean parentWritable, AdsDataTypeTableEntry 
dataType) {
         // If this is an array type, then we need to lookup it's elemental 
type and use that instead
         if(dataType.getArrayDimensions() > 0) {
-            Optional<AdsDataTypeTableEntry> dataTypeTableEntry = 
getDataTypeTableEntry(dataType.getSimpleTypeName());
+            Optional<AdsDataTypeTableEntry> dataTypeTableEntry = 
getDataTypeTableEntry(dataType.getMainName());
             if(dataTypeTableEntry.isEmpty()) {
-                LOGGER.warn("couldn't find datatype: {}", 
dataType.getSimpleTypeName());
+                LOGGER.warn("couldn't find datatype: {}", 
dataType.getMainName());
                 return Collections.emptyList();
             }
             dataType = dataTypeTableEntry.get();
@@ -568,14 +569,14 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
         }
 
         List<PlcBrowseItem> values = new 
ArrayList<>(dataType.getNumChildren());
-        for (AdsDataTypeTableChildEntry child : dataType.getChildren()) {
-            Optional<AdsDataTypeTableEntry> dataTypeTableEntry = 
getDataTypeTableEntry(child.getDataTypeName());
+        for (AdsDataTypeTableEntry child : dataType.getChildren()) {
+            Optional<AdsDataTypeTableEntry> dataTypeTableEntry = 
getDataTypeTableEntry(child.getSecondaryName());
             if(dataTypeTableEntry.isEmpty()) {
-                LOGGER.warn("couldn't find datatype: {} for child {}", 
dataType.getSimpleTypeName(), child.getPropertyName());
+                LOGGER.warn("couldn't find datatype: {} for child {}", 
dataType.getSecondaryName(), child.getMainName());
                 continue;
             }
             AdsDataTypeTableEntry childDataType = dataTypeTableEntry.get();
-            String itemAddress = basePath + "." + child.getPropertyName();
+            String itemAddress = basePath + "." + child.getMainName();
 
             // Convert the plc value type from the ADS specific one to the 
PLC4X global one.
             org.apache.plc4x.java.api.types.PlcValueType plc4xPlcValueType =
@@ -605,7 +606,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
             }
             // Add the type itself.
             values.add(new DefaultPlcBrowseItem(new SymbolicAdsTag(
-                basePath + "." + child.getPropertyName(), plc4xPlcValueType, 
arrayInfo), child.getPropertyName(),
+                basePath + "." + child.getMainName(), plc4xPlcValueType, 
arrayInfo), child.getMainName(),
                 true, parentWritable, true, false, itemArrayInfo, childMap, 
options));
         }
         return values;
@@ -924,7 +925,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                 Map<String, PlcValue> properties = new HashMap<>();
                 int startPos = readBuffer.getPos();
                 int curPos = 0;
-                for (AdsDataTypeTableChildEntry child : 
adsDataTypeTableEntry.getChildren()) {
+                for (AdsDataTypeTableEntry child : 
adsDataTypeTableEntry.getChildren()) {
                     // In some cases the starting position of the data is not 
where we are expecting it.
                     // So we need to skip some bytes.
                     if (child.getOffset() > curPos) {
@@ -934,16 +935,16 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                         }
                     }
 
-                    String propertyName = child.getPropertyName();
-                    Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional 
= getDataTypeTableEntry(child.getDataTypeName());
+                    String propertyName = child.getMainName();
+                    Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional 
= getDataTypeTableEntry(child.getSecondaryName());
                     if(dataTypeTableEntryOptional.isEmpty()) {
-                        throw new ParseException(String.format("couldn't find 
datatype: %s", child.getDataTypeName()));
+                        throw new ParseException(String.format("couldn't find 
datatype: %s", child.getSecondaryName()));
                     }
                     AdsDataTypeTableEntry propertyDataTypeTableEntry = 
dataTypeTableEntryOptional.get();
                     PlcValueType propertyPlcValueType = 
getPlcValueTypeForAdsDataType(propertyDataTypeTableEntry);
                     int strLen = 0;
                     if ((propertyPlcValueType == PlcValueType.STRING) || 
(propertyPlcValueType == PlcValueType.WSTRING)) {
-                        String dataTypeName = 
propertyDataTypeTableEntry.getDataTypeName();
+                        String dataTypeName = 
propertyDataTypeTableEntry.getMainName();
                         // Extract the string length from the data type name.
                         strLen = 
Integer.parseInt(dataTypeName.substring(dataTypeName.indexOf("(") + 1, 
dataTypeName.indexOf(")")));
                     }
@@ -963,7 +964,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
     private PlcValue parseArrayLevel(AdsDataTypeTableEntry 
adsDataTypeTableEntry, List<AdsDataTypeArrayInfo> arrayLayers, ReadBuffer 
readBuffer) throws ParseException {
         // If this is the last layer of the Array, parse the values themselves.
         if (arrayLayers.isEmpty()) {
-            String dataTypeName = adsDataTypeTableEntry.getDataTypeName();
+            String dataTypeName = adsDataTypeTableEntry.getMainName();
             dataTypeName = dataTypeName.substring(dataTypeName.lastIndexOf(" 
OF ") + 4);
             int stringLength = 0;
             if (dataTypeName.startsWith("STRING(")) {
@@ -1228,9 +1229,9 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                 throw new SerializationException(String.format(
                     "Expected a PlcList of size %d, but got one of size %d", 
curArrayLevel.getNumElements(), list.size()));
             }
-            Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional = 
getDataTypeTableEntry(dataType.getSimpleTypeName());
+            Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional = 
getDataTypeTableEntry(dataType.getSecondaryName());
             if(dataTypeTableEntryOptional.isEmpty()) {
-                throw new SerializationException("Could not find data type: " 
+ dataType.getSimpleTypeName());
+                throw new SerializationException("Could not find data type: " 
+ dataType.getSecondaryName());
             }
             AdsDataTypeTableEntry childDataType = 
dataTypeTableEntryOptional.get();
             for (PlcValue plcValue : list) {
@@ -1246,14 +1247,14 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
             PlcStruct plcStruct = (PlcStruct) contextValue;
             int startPos = writeBuffer.getPos();
             int curPos = 0;
-            for (AdsDataTypeTableChildEntry child : dataType.getChildren()) {
-                Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional = 
getDataTypeTableEntry(child.getDataTypeName());
+            for (AdsDataTypeTableEntry child : dataType.getChildren()) {
+                Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional = 
getDataTypeTableEntry(child.getSecondaryName());
                 if(dataTypeTableEntryOptional.isEmpty()) {
-                    throw new SerializationException("Could not find data 
type: " + child.getDataTypeName());
+                    throw new SerializationException("Could not find data 
type: " + child.getSecondaryName());
                 }
                 AdsDataTypeTableEntry childDataType = 
dataTypeTableEntryOptional.get();
-                if (!plcStruct.hasKey(child.getPropertyName())) {
-                    throw new SerializationException("PlcStruct is missing a 
child with the name " + child.getPropertyName());
+                if (!plcStruct.hasKey(child.getMainName())) {
+                    throw new SerializationException("PlcStruct is missing a 
child with the name " + child.getMainName());
                 }
                 // In some cases the starting position of the data is not 
where we are expecting it.
                 // So we need to add some fill-bytes.
@@ -1264,7 +1265,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
                     }
                 }
 
-                PlcValue childValue = 
plcStruct.getValue(child.getPropertyName());
+                PlcValue childValue = plcStruct.getValue(child.getMainName());
                 serializeInternal(childValue, childDataType, 
childDataType.getArrayInfo(), writeBuffer);
 
                 curPos = writeBuffer.getPos() - startPos;
@@ -1275,11 +1276,11 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
         else {
             PlcValueType plcValueType = 
getPlcValueTypeForAdsDataType(dataType);
             if (plcValueType == null) {
-                throw new SerializationException("Unsupported simple type: " + 
dataType.getDataTypeName());
+                throw new SerializationException("Unsupported simple type: " + 
dataType.getMainName());
             }
             int stringLength = 0;
             if ((plcValueType == PlcValueType.STRING) || (plcValueType == 
PlcValueType.WSTRING)) {
-                String stringTypeName = dataType.getDataTypeName();
+                String stringTypeName = dataType.getMainName();
                 stringLength = Integer.parseInt(
                     stringTypeName.substring(stringTypeName.indexOf("(") + 1, 
stringTypeName.indexOf(")")));
             }
@@ -1839,7 +1840,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
             }
             AdsDataTypeTableEntry dataTypeTableEntry = 
dataTypeTableEntryOptional.get();
             return new DirectAdsTag(adsSymbolTableEntry.getGroup(), 
adsSymbolTableEntry.getOffset(),
-                dataTypeTableEntry.getDataTypeName(), 
dataTypeTableEntry.getArrayDimensions());
+                dataTypeTableEntry.getMainName(), 
dataTypeTableEntry.getArrayDimensions());
         }
         // Otherwise we'll have to crawl through the dataType definitions.
         else {
@@ -1865,21 +1866,21 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
             // TODO: Implement the Array support
             if (adsDataTypeTableEntry.getDataType() == 
AdsDataType.CHAR.getValue()) {
                 int stringLength = (int) adsDataTypeTableEntry.getSize() - 1;
-                return new DirectAdsStringTag(currentGroup, currentOffset, 
adsDataTypeTableEntry.getDataTypeName(), stringLength, 1);
+                return new DirectAdsStringTag(currentGroup, currentOffset, 
adsDataTypeTableEntry.getMainName(), stringLength, 1);
             } else if (adsDataTypeTableEntry.getDataType() == 
AdsDataType.WCHAR.getValue()) {
                 int stringLength = (int) (adsDataTypeTableEntry.getSize() - 2) 
/ 2;
-                return new DirectAdsStringTag(currentGroup, currentOffset, 
adsDataTypeTableEntry.getDataTypeName(), stringLength, 1);
+                return new DirectAdsStringTag(currentGroup, currentOffset, 
adsDataTypeTableEntry.getMainName(), stringLength, 1);
             } else {
-                return new DirectAdsTag(currentGroup, currentOffset, 
adsDataTypeTableEntry.getDataTypeName(), 1);
+                return new DirectAdsTag(currentGroup, currentOffset, 
adsDataTypeTableEntry.getMainName(), 1);
             }
         }
 
         // Go through all children looking for a matching one.
-        for (AdsDataTypeTableChildEntry child : 
adsDataTypeTableEntry.getChildren()) {
-            if (child.getPropertyName().equals(remainingAddressParts.get(0))) {
-                Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional = 
getDataTypeTableEntry(child.getDataTypeName());
+        for (AdsDataTypeTableEntry child : 
adsDataTypeTableEntry.getChildren()) {
+            if (child.getMainName().equals(remainingAddressParts.get(0))) {
+                Optional<AdsDataTypeTableEntry> dataTypeTableEntryOptional = 
getDataTypeTableEntry(child.getSecondaryName());
                 if(dataTypeTableEntryOptional.isEmpty()) {
-                    throw new PlcRuntimeException("Could not resolve data type 
" + child.getDataTypeName());
+                    throw new PlcRuntimeException("Could not resolve data type 
" + child.getSecondaryName());
                 }
                 AdsDataTypeTableEntry childAdsDataTypeTableEntry = 
dataTypeTableEntryOptional.get();
                 return resolveDirectAdsTagForSymbolicNameFromDataType(
@@ -1889,12 +1890,12 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
         }
 
         throw new PlcRuntimeException(String.format("Couldn't find child with 
name '%s' for type '%s'",
-            remainingAddressParts.get(0), 
adsDataTypeTableEntry.getDataTypeName()));
+            remainingAddressParts.get(0), 
adsDataTypeTableEntry.getMainName()));
     }
 
     protected PlcValueType 
getPlcValueTypeForAdsDataTypeForBrowse(AdsDataTypeTableEntry 
dataTypeTableEntry) {
-        String dataTypeName = 
(!dataTypeTableEntry.getSimpleTypeName().isEmpty() && 
!dataTypeTableEntry.getDataTypeName().equals("BOOL")) ?
-            dataTypeTableEntry.getSimpleTypeName() : 
dataTypeTableEntry.getDataTypeName();
+        String dataTypeName = 
(!dataTypeTableEntry.getSecondaryName().isEmpty() && 
!dataTypeTableEntry.getMainName().equals("BOOL")) ?
+            dataTypeTableEntry.getSecondaryName() : 
dataTypeTableEntry.getMainName();
         if (dataTypeName.startsWith("STRING(")) {
             dataTypeName = "STRING";
         } else if (dataTypeName.startsWith("WSTRING(")) {
@@ -1909,7 +1910,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
     }
 
     protected PlcValueType getPlcValueTypeForAdsDataType(AdsDataTypeTableEntry 
dataTypeTableEntry) {
-        String dataTypeName = dataTypeTableEntry.getDataTypeName();
+        String dataTypeName = dataTypeTableEntry.getMainName();
         if (dataTypeName.startsWith("STRING(")) {
             dataTypeName = "STRING";
         } else if (dataTypeName.startsWith("WSTRING(")) {
@@ -1927,7 +1928,7 @@ public class AdsProtocolLogic extends 
Plc4xProtocolBase<AmsTCPPacket> implements
             // So we'll check if their "simpleTypeName" matches instead.
             if (dataTypeTableEntry.getChildren().isEmpty()) {
                 try {
-                    dataTypeName = dataTypeTableEntry.getSimpleTypeName();
+                    dataTypeName = dataTypeTableEntry.getSecondaryName();
                     if (dataTypeName.startsWith("STRING(")) {
                         dataTypeName = "STRING";
                     } else if (dataTypeName.startsWith("WSTRING(")) {
diff --git 
a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsBrowse.java
 
b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsBrowse.java
index 5c850d372e..a4be7ec1ff 100644
--- 
a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsBrowse.java
+++ 
b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsBrowse.java
@@ -26,7 +26,7 @@ public class ManualAdsBrowse {
 
     public static void main(String[] args) throws Exception {
         try (PlcConnection connection = 
PlcDriverManager.getDefault().getConnectionManager().getConnection("ads:tcp://192.168.23.20:48898?target-ams-port=851&source-ams-port=65534&source-ams-net-id=192.168.23.220.1.1&target-ams-net-id=192.168.23.20.1.1")){
-            connection.browseRequestBuilder().addQuery("all", 
"*").build().executeWithInterceptor(item -> {
+            connection.browseRequestBuilder().addQuery("all", 
"*").build().executeWithInterceptor((query, item) -> {
                 System.out.printf("- %s%n", item.getTag().getAddressString());
                 return true;
             }).get();
diff --git 
a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/connection/CtrlXConnection.java
 
b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/connection/CtrlXConnection.java
index 454fdb2f72..58c4a54ba8 100644
--- 
a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/connection/CtrlXConnection.java
+++ 
b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/connection/CtrlXConnection.java
@@ -205,7 +205,7 @@ public class CtrlXConnection implements PlcConnection, 
PlcPinger, PlcBrowser {
 
     @Override
     public CompletableFuture<PlcBrowseResponse> browse(PlcBrowseRequest 
browseRequest) {
-        return browseWithInterceptor(browseRequest, item -> true);
+        return browseWithInterceptor(browseRequest, (query, item) -> true);
     }
 
     @Override
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec 
b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index 109523320c..4b5ae082ba 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -833,7 +833,7 @@
 ]
 
 // 
https://gitlab.com/xilix-systems-llc/go-native-ads/-/blob/master/symbols.go#L15
-[discriminatedType AdsDataTypeTableEntry byteOrder='LITTLE_ENDIAN'
+[type AdsDataTypeTableEntry byteOrder='LITTLE_ENDIAN'
        [simple   uint 32                            entryLength                
                                            ]
        [simple   uint 32                            version                    
                                            ]
        [simple   uint 32                            hashValue                  
                                            ]
@@ -842,19 +842,19 @@
        [simple   uint 32                            offset                     
                                            ]
        [simple   uint 32                            dataType                   
                                            ]
        [simple   uint 32                            flags                      
                                            ]
-       [implicit uint 16                            dataTypeNameLength       
'STR_LEN(dataTypeName)'                       ]
-       [implicit uint 16                            simpleTypeNameLength     
'STR_LEN(simpleTypeName)'                     ]
+       [implicit uint 16                            mainNameLength           
'STR_LEN(mainName)'                           ]
+       [implicit uint 16                            secondaryNameLength      
'STR_LEN(secondaryName)'                      ]
        [implicit uint 16                            commentLength            
'STR_LEN(comment)'                            ]
        [simple   uint 16                            arrayDimensions            
                                            ]
        [simple   uint 16                            numChildren                
                                            ]
-       [simple   vstring 'dataTypeNameLength * 8'   dataTypeName               
                                            ]
-       [const    uint 8                             dataTypeNameTerminator   
0x00                                          ]
-       [simple   vstring 'simpleTypeNameLength * 8' simpleTypeName             
                                            ]
-       [const    uint 8                             simpleTypeNameTerminator 
0x00                                          ]
+       [simple   vstring 'mainNameLength * 8'       mainName                   
                                            ]
+       [const    uint 8                             mainNameTerminator       
0x00                                          ]
+       [simple   vstring 'secondaryNameLength * 8'  secondaryName              
                                            ]
+       [const    uint 8                             secondaryNameTerminator  
0x00                                          ]
        [simple   vstring 'commentLength * 8'        comment                    
                                            ]
        [const    uint 8                             commentTerminator        
0x00                                          ]
     [array    AdsDataTypeArrayInfo               arrayInfo                
count                   'arrayDimensions'     ]
-       [array    AdsDataTypeTableChildEntry         children                 
count                   'numChildren'         ]
+       [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.
@@ -863,39 +863,6 @@
        [array    byte                               rest                     
length                  'entryLength - curPos']
 ]
 
-// In data-type child entries, the name seems to be used by the property name 
and the data-type name seems to contain
-// what in the parent case the "name" attribute seems to use.
-// TODO: In general only the propertyName, dataTypeName and offset are 
interesting here. The rest is mostly not fully initialized
-[discriminatedType AdsDataTypeTableChildEntry 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                          offset                       
                                          ]
-       [simple   uint 32                          dataType                     
                                          ]
-       [simple   uint 32                          flags                        
                                          ]
-       [implicit uint 16                          propertyNameLength       
'STR_LEN(propertyName)'                       ]
-       [implicit uint 16                          dataTypeNameLength       
'STR_LEN(dataTypeName)'                       ]
-       [implicit uint 16                          commentLength            
'STR_LEN(comment)'                            ]
-       [simple   uint 16                          arrayDimensions              
                                          ]
-       [simple   uint 16                          numChildren                  
                                          ]
-       [simple   vstring 'propertyNameLength * 8' propertyName                 
                                          ]
-       [const    uint 8                           propertyNameTerminator   
0x00                                          ]
-       [simple   vstring 'dataTypeNameLength * 8' dataTypeName                 
                                          ]
-       [const    uint 8                           dataTypeNameTerminator   
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                           ]

Reply via email to