You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2021/03/30 08:03:39 UTC

[plc4x] branch develop updated: plc4go: work on ads driver + fixes on model-template.ftlh to enable complex types + fixes on enum-template.ftlh to allow usage of constants + DriverTestRunner.go now properly appends options + fixed possible deadlock in modbus driver + fixed possible deadlock in knx driver

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 92432a7  plc4go: work on ads driver + fixes on model-template.ftlh to enable complex types + fixes on enum-template.ftlh to allow usage of constants + DriverTestRunner.go now properly appends options + fixed possible deadlock in modbus driver + fixed possible deadlock in knx driver
92432a7 is described below

commit 92432a705702acb6a96bc7bc7d0e8572898a8617
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Mar 30 10:03:25 2021 +0200

    plc4go: work on ads driver
    + fixes on model-template.ftlh to enable complex types
    + fixes on enum-template.ftlh to allow usage of constants
    + DriverTestRunner.go now properly appends options
    + fixed possible deadlock in modbus driver
    + fixed possible deadlock in knx driver
---
 .../main/resources/templates/go/enum-template.ftlh |  21 ++++
 .../resources/templates/go/model-template.ftlh     |   6 +-
 plc4go/go.mod                                      |   2 +-
 plc4go/go.sum                                      |   9 ++
 plc4go/internal/plc4go/ads/Connection.go           | 112 ++++++++++++++++++++-
 plc4go/internal/plc4go/ads/Driver.go               |  13 ++-
 plc4go/internal/plc4go/ads/Reader.go               |  47 ++++-----
 plc4go/internal/plc4go/ads/Writer.go               |  49 ++++-----
 .../plc4go/ads/readwrite/model/AdsDataType.go      |  21 ++++
 .../plc4go/ads/readwrite/model/AmsPacket.go        |  18 ++--
 .../plc4go/ads/readwrite/model/AmsSerialFrame.go   |   6 +-
 .../plc4go/ads/readwrite/model/AmsTCPPacket.go     |   6 +-
 .../plc4go/ads/readwrite/model/CommandId.go        |  21 ++++
 .../ads/readwrite/model/ReservedIndexGroups.go     |  21 ++++
 .../plc4go/ads/readwrite/model/ReturnCode.go       |  21 ++++
 .../bacnetip/readwrite/model/APDUComplexAck.go     |  12 +--
 .../readwrite/model/APDUConfirmedRequest.go        |  12 +--
 .../bacnetip/readwrite/model/ApplicationTag.go     |  21 ++++
 .../bacnetip/readwrite/model/BACnetNetworkType.go  |  21 ++++
 .../bacnetip/readwrite/model/BACnetNodeType.go     |  21 ++++
 .../bacnetip/readwrite/model/BACnetNotifyType.go   |  21 ++++
 .../bacnetip/readwrite/model/BACnetObjectType.go   |  21 ++++
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |  12 +--
 .../readwrite/model/BACnetTagWithContent.go        |  12 +--
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  |   6 +-
 .../readwrite/model/BVLCOriginalBroadcastNPDU.go   |   6 +-
 .../readwrite/model/BVLCOriginalUnicastNPDU.go     |   6 +-
 .../plc4go/bacnetip/readwrite/model/NLM.go         |   6 +-
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |  30 +++---
 plc4go/internal/plc4go/knxnetip/Driver.go          |  10 +-
 .../plc4go/knxnetip/readwrite/model/AccessLevel.go |  21 ++++
 .../CEMIAdditionalInformationRelativeTimestamp.go  |   6 +-
 .../knxnetip/readwrite/model/CEMIPriority.go       |  21 ++++
 .../readwrite/model/ComObjectTableAddresses.go     |  21 ++++
 .../model/ComObjectTableRealisationType6.go        |   6 +-
 .../knxnetip/readwrite/model/ComObjectValueType.go |  21 ++++
 .../knxnetip/readwrite/model/ConnectionRequest.go  |  12 +--
 .../knxnetip/readwrite/model/ConnectionResponse.go |   6 +-
 .../ConnectionResponseDataBlockTunnelConnection.go |   6 +-
 .../readwrite/model/ConnectionStateRequest.go      |   6 +-
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      |  30 +++---
 .../knxnetip/readwrite/model/DescriptionRequest.go |   6 +-
 .../readwrite/model/DescriptionResponse.go         |  12 +--
 .../readwrite/model/DeviceConfigurationAck.go      |   6 +-
 .../readwrite/model/DeviceConfigurationRequest.go  |   6 +-
 .../knxnetip/readwrite/model/DeviceDescriptor.go   |  21 ++++
 .../readwrite/model/DeviceDescriptorMediumType.go  |  21 ++++
 .../readwrite/model/DeviceDescriptorType2.go       |  24 ++---
 .../knxnetip/readwrite/model/DisconnectRequest.go  |   6 +-
 .../knxnetip/readwrite/model/FirmwareType.go       |  21 ++++
 .../readwrite/model/HPAIControlEndpoint.go         |   6 +-
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   |   6 +-
 .../readwrite/model/HPAIDiscoveryEndpoint.go       |   6 +-
 .../knxnetip/readwrite/model/HostProtocolCode.go   |  21 ++++
 .../readwrite/model/KnxDatapointMainType.go        |  21 ++++
 .../knxnetip/readwrite/model/KnxDatapointType.go   |  21 ++++
 .../readwrite/model/KnxInterfaceObjectProperty.go  |  21 ++++
 .../readwrite/model/KnxInterfaceObjectType.go      |  21 ++++
 .../plc4go/knxnetip/readwrite/model/KnxLayer.go    |  21 ++++
 .../knxnetip/readwrite/model/KnxManufacturer.go    |  21 ++++
 .../plc4go/knxnetip/readwrite/model/KnxMedium.go   |  21 ++++
 .../readwrite/model/KnxPropertyDataType.go         |  21 ++++
 .../plc4go/knxnetip/readwrite/model/LBusmonInd.go  |   6 +-
 .../knxnetip/readwrite/model/LDataExtended.go      |   6 +-
 .../plc4go/knxnetip/readwrite/model/LPollData.go   |   6 +-
 .../knxnetip/readwrite/model/SearchRequest.go      |   6 +-
 .../knxnetip/readwrite/model/SearchResponse.go     |  18 ++--
 .../plc4go/knxnetip/readwrite/model/Status.go      |  21 ++++
 .../readwrite/model/SupportedPhysicalMedia.go      |  21 ++++
 .../knxnetip/readwrite/model/TunnelingRequest.go   |   6 +-
 .../knxnetip/readwrite/model/TunnelingResponse.go  |   6 +-
 plc4go/internal/plc4go/modbus/Driver.go            |   8 +-
 .../modbus/readwrite/model/ModbusDataType.go       |  21 ++++
 .../modbus/readwrite/model/ModbusErrorCode.go      |  21 ++++
 .../plc4go/s7/readwrite/model/COTPProtocolClass.go |  21 ++++
 .../plc4go/s7/readwrite/model/COTPTpduSize.go      |  21 ++++
 .../s7/readwrite/model/DataTransportErrorCode.go   |  21 ++++
 .../plc4go/s7/readwrite/model/DataTransportSize.go |  21 ++++
 .../plc4go/s7/readwrite/model/DeviceGroup.go       |  21 ++++
 .../plc4go/s7/readwrite/model/MemoryArea.go        |  21 ++++
 .../model/S7ParameterUserDataItemCPUFunctions.go   |  18 ++--
 .../s7/readwrite/model/S7PayloadUserDataItem.go    |   6 +-
 .../s7/readwrite/model/SzlModuleTypeClass.go       |  21 ++++
 .../plc4go/s7/readwrite/model/SzlSublist.go        |  21 ++++
 .../plc4go/s7/readwrite/model/TransportSize.go     |  21 ++++
 .../plc4go/spi/testutils/DriverTestRunner.go       |  11 +-
 86 files changed, 1195 insertions(+), 251 deletions(-)

diff --git a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
index 71df811..2bfdb5a 100644
--- a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
@@ -48,7 +48,9 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/m
 package model
 
 import (
+    "encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -149,6 +151,25 @@ func (e ${type.name}) Serialize(io utils.WriteBuffer) error {
 	</#if>
 </#if>
 
+func (m *${type.name}) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ${type.name}ByName(string(tok))
+		}
+	}
+}
+
 func (e ${type.name}) String() string {
 	switch e {
 	<#list helper.getUniqueEnumValues(type.enumValues) as enumValue>
diff --git a/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
index 5bb865e..7e6928a 100644
--- a/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
@@ -935,11 +935,11 @@ func (m *${type.name}) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
 				}
 				m.${field.name?cap_first} = data
 				<#elseif helper.needsPointerAccess(field)>
-				var data *${helper.getLanguageTypeNameForField(field)}
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data ${helper.getLanguageTypeNameForField(field)}
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.${field.name?cap_first} = data
+				m.${field.name?cap_first} = &data
 				<#else>
 				var data ${helper.getLanguageTypeNameForField(field)}
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/go.mod b/plc4go/go.mod
index 285b6cc..443e834 100644
--- a/plc4go/go.mod
+++ b/plc4go/go.mod
@@ -29,5 +29,5 @@ require (
 	github.com/subchen/go-xmldom v1.1.2
 	github.com/tebeka/go2xunit v1.4.10 // indirect
 	golang.org/x/tools v0.1.0 // indirect
-	gotest.tools/gotestsum v1.6.2 // indirect
+	gotest.tools/gotestsum v1.6.3 // indirect
 )
diff --git a/plc4go/go.sum b/plc4go/go.sum
index 5788901..36a5f8c 100644
--- a/plc4go/go.sum
+++ b/plc4go/go.sum
@@ -9,10 +9,13 @@ github.com/elastic/go-licenser v0.3.1 h1:RmRukU/JUmts+rpexAw0Fvt2ly7VVu6mw8z4HrE
 github.com/elastic/go-licenser v0.3.1/go.mod h1:D8eNQk70FOCVBl3smCGQt/lv7meBeQno2eI1S5apiHQ=
 github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
 github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
+github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg=
+github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
 github.com/icza/bitio v1.0.0 h1:squ/m1SHyFeCA6+6Gyol1AxV9nmPPlJFT8c2vKdj3U8=
@@ -21,9 +24,13 @@ github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lTo
 github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
 github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
+github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
 github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
+github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
 github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
 github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
@@ -85,4 +92,6 @@ gotest.tools v1.4.0 h1:BjtEgfuw8Qyd+jPvQz8CfoxiO/UjFEidWinwEXZiWv0=
 gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
 gotest.tools/gotestsum v1.6.2 h1:QRO7xoLEUQOdSzBzUaasXvn6WOSQjf2hBIBDWEs3VqI=
 gotest.tools/gotestsum v1.6.2/go.mod h1:H74H1IvjJE+E/1INpsn2P4+QW0uLDgL/T2sVajPHmTM=
+gotest.tools/gotestsum v1.6.3 h1:E3wOF4wmxKA19BB5wTY7t0L1m+QNARtDcBX4yqG6DEc=
+gotest.tools/gotestsum v1.6.3/go.mod h1:fTR9ZhxC/TLAAx2/WMk/m3TkMB9eEI89gdEzhiRVJT8=
 gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
diff --git a/plc4go/internal/plc4go/ads/Connection.go b/plc4go/internal/plc4go/ads/Connection.go
index 4ffefcc..6d3e4d5 100644
--- a/plc4go/internal/plc4go/ads/Connection.go
+++ b/plc4go/internal/plc4go/ads/Connection.go
@@ -20,13 +20,17 @@ package ads
 
 import (
 	"fmt"
+	readWriteModel "github.com/apache/plc4x/plc4go/internal/plc4go/ads/readwrite/model"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/interceptors"
 	internalModel "github.com/apache/plc4x/plc4go/internal/plc4go/spi/model"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/transports"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go"
 	apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -60,16 +64,116 @@ type Connection struct {
 	fieldHandler       spi.PlcFieldHandler
 	valueHandler       spi.PlcValueHandler
 	requestInterceptor internalModel.RequestInterceptor
+	// TODO: check if this is the right place here (it is kinda connection bound)
+	sourceAmsNetId readWriteModel.AmsNetId
+	sourceAmsPort  uint16
+	targetAmsNetId readWriteModel.AmsNetId
+	targetAmsPort  uint16
 }
 
-func NewConnection(messageCodec spi.MessageCodec, options map[string][]string, fieldHandler spi.PlcFieldHandler) Connection {
-	return Connection{
+func NewConnection(messageCodec spi.MessageCodec, options map[string][]string, fieldHandler spi.PlcFieldHandler) (*Connection, error) {
+	if err := checkForRequiredParameters(options, []string{"sourceAmsNetId", "sourceAmsPort", "targetAmsNetId", "targetAmsPort"}); err != nil {
+		return nil, err
+	}
+	// TODO: check array
+	split := strings.Split(options["sourceAmsNetId"][0], ".")
+	octet1, err := strconv.Atoi(split[0])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing sourceAmsNetId")
+	}
+	octet2, err := strconv.Atoi(split[1])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing sourceAmsNetId")
+	}
+	octet3, err := strconv.Atoi(split[2])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing sourceAmsNetId")
+	}
+	octet4, err := strconv.Atoi(split[3])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing sourceAmsNetId")
+	}
+	octet5, err := strconv.Atoi(split[4])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing sourceAmsNetId")
+	}
+	octet6, err := strconv.Atoi(split[5])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing sourceAmsNetId")
+	}
+	sourceAmsNetId := readWriteModel.AmsNetId{
+		Octet1: uint8(octet1),
+		Octet2: uint8(octet2),
+		Octet3: uint8(octet3),
+		Octet4: uint8(octet4),
+		Octet5: uint8(octet5),
+		Octet6: uint8(octet6),
+	}
+	// TODO: check array
+	sourceAmsPort, err := strconv.Atoi(options["sourceAmsPort"][0])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing sourceAmsPort")
+	}
+	// TODO: check array
+	split = strings.Split(options["targetAmsNetId"][0], ".")
+	octet1, err = strconv.Atoi(split[0])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing targetAmsNetId")
+	}
+	octet2, err = strconv.Atoi(split[1])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing targetAmsNetId")
+	}
+	octet3, err = strconv.Atoi(split[2])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing targetAmsNetId")
+	}
+	octet4, err = strconv.Atoi(split[3])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing targetAmsNetId")
+	}
+	octet5, err = strconv.Atoi(split[4])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing targetAmsNetId")
+	}
+	octet6, err = strconv.Atoi(split[5])
+	if err != nil {
+		return nil, errors.Wrap(err, "error parsing targetAmsNetId")
+	}
+	targetAmsNetId := readWriteModel.AmsNetId{
+		Octet1: uint8(octet1),
+		Octet2: uint8(octet2),
+		Octet3: uint8(octet3),
+		Octet4: uint8(octet4),
+		Octet5: uint8(octet5),
+		Octet6: uint8(octet6),
+	}
+	// TODO: check array
+	targetAmsPort, err := strconv.Atoi(options["targetAmsPort"][0])
+	if err != nil {
+		return nil, errors.Wrap(err, "error prasing targetAmsPort")
+	}
+	return &Connection{
 		messageCodec:       messageCodec,
 		options:            options,
 		fieldHandler:       fieldHandler,
 		valueHandler:       NewValueHandler(),
 		requestInterceptor: interceptors.NewSingleItemRequestInterceptor(),
+		sourceAmsNetId:     sourceAmsNetId,
+		sourceAmsPort:      uint16(sourceAmsPort),
+		targetAmsNetId:     targetAmsNetId,
+		targetAmsPort:      uint16(targetAmsPort),
+	}, nil
+}
+
+// TODO: move to a common utils place
+func checkForRequiredParameters(options map[string][]string, requiredParameters []string) error {
+	for _, parameter := range requiredParameters {
+		if options[parameter] == nil {
+			return errors.Errorf("required parameter %s missing", parameter)
+		}
 	}
+	return nil
 }
 
 func (m Connection) Connect() <-chan plc4go.PlcConnectionConnectResult {
@@ -117,12 +221,12 @@ func (m Connection) GetMetadata() apiModel.PlcConnectionMetadata {
 
 func (m Connection) ReadRequestBuilder() apiModel.PlcReadRequestBuilder {
 	return internalModel.NewDefaultPlcReadRequestBuilderWithInterceptor(m.fieldHandler,
-		NewReader(m.messageCodec), m.requestInterceptor)
+		NewReader(m.messageCodec, m.targetAmsNetId, m.targetAmsPort, m.sourceAmsNetId, m.sourceAmsPort), m.requestInterceptor)
 }
 
 func (m Connection) WriteRequestBuilder() apiModel.PlcWriteRequestBuilder {
 	return internalModel.NewDefaultPlcWriteRequestBuilder(
-		m.fieldHandler, m.valueHandler, NewWriter(m.messageCodec))
+		m.fieldHandler, m.valueHandler, NewWriter(m.messageCodec, m.targetAmsNetId, m.targetAmsPort, m.sourceAmsNetId, m.sourceAmsPort))
 }
 
 func (m Connection) SubscriptionRequestBuilder() apiModel.PlcSubscriptionRequestBuilder {
diff --git a/plc4go/internal/plc4go/ads/Driver.go b/plc4go/internal/plc4go/ads/Driver.go
index b13bdb4..7cadb1f 100644
--- a/plc4go/internal/plc4go/ads/Driver.go
+++ b/plc4go/internal/plc4go/ads/Driver.go
@@ -61,7 +61,9 @@ func (m Driver) GetConnection(transportUrl url.URL, transports map[string]transp
 	if !ok {
 		log.Error().Stringer("transportUrl", &transportUrl).Msgf("We couldn't find a transport for scheme %s", transportUrl.Scheme)
 		ch := make(chan plc4go.PlcConnectionConnectResult)
-		ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.Errorf("couldn't find transport for given transport url %#v", transportUrl))
+		go func() {
+			ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.Errorf("couldn't find transport for given transport url %#v", transportUrl))
+		}()
 		return ch
 	}
 	// Provide a default-port to the transport, which is used, if the user doesn't provide on in the connection string.
@@ -80,7 +82,14 @@ func (m Driver) GetConnection(transportUrl url.URL, transports map[string]transp
 	log.Debug().Msgf("working with codec %#v", codec)
 
 	// Create the new connection
-	connection := NewConnection(codec, options, m.fieldHandler)
+	connection, err := NewConnection(codec, options, m.fieldHandler)
+	if err != nil {
+		ch := make(chan plc4go.PlcConnectionConnectResult)
+		go func() {
+			ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.Wrap(err, "couldn't create connection"))
+		}()
+		return ch
+	}
 	log.Info().Stringer("connection", connection).Msg("created connection, connecting now")
 	return connection.Connect()
 }
diff --git a/plc4go/internal/plc4go/ads/Reader.go b/plc4go/internal/plc4go/ads/Reader.go
index 904a933..a3d0dea 100644
--- a/plc4go/internal/plc4go/ads/Reader.go
+++ b/plc4go/internal/plc4go/ads/Reader.go
@@ -34,12 +34,20 @@ import (
 
 type Reader struct {
 	transactionIdentifier uint32
+	targetAmsNetId        readWriteModel.AmsNetId
+	targetAmsPort         uint16
+	sourceAmsNetId        readWriteModel.AmsNetId
+	sourceAmsPort         uint16
 	messageCodec          spi.MessageCodec
 }
 
-func NewReader(messageCodec spi.MessageCodec) *Reader {
+func NewReader(messageCodec spi.MessageCodec, targetAmsNetId readWriteModel.AmsNetId, targetAmsPort uint16, sourceAmsNetId readWriteModel.AmsNetId, sourceAmsPort uint16) *Reader {
 	return &Reader{
 		transactionIdentifier: 0,
+		targetAmsNetId:        targetAmsNetId,
+		targetAmsPort:         targetAmsPort,
+		sourceAmsNetId:        sourceAmsNetId,
+		sourceAmsPort:         sourceAmsPort,
 		messageCodec:          messageCodec,
 	}
 }
@@ -70,31 +78,16 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
 			log.Debug().Msgf("Invalid field item type %T", field)
 			return
 		}
-		// TODO: move TargetAmsNetId, TargetAmsPort, SourceAmsNetId, SourceAmsPort to Connection
 		userdata := readWriteModel.AmsPacket{
-			TargetAmsNetId: &readWriteModel.AmsNetId{
-				Octet1: 0,
-				Octet2: 0,
-				Octet3: 0,
-				Octet4: 0,
-				Octet5: 0,
-				Octet6: 0,
-			},
-			TargetAmsPort: 0,
-			SourceAmsNetId: &readWriteModel.AmsNetId{
-				Octet1: 0,
-				Octet2: 0,
-				Octet3: 0,
-				Octet4: 0,
-				Octet5: 0,
-				Octet6: 0,
-			},
-			SourceAmsPort: 0,
-			CommandId:     readWriteModel.CommandId_ADS_READ,
-			State:         readWriteModel.NewState(false, false, false, false, false, true, false, false, false),
-			ErrorCode:     0,
-			InvokeId:      0,
-			Data:          nil,
+			TargetAmsNetId: &m.targetAmsNetId,
+			TargetAmsPort:  m.targetAmsPort,
+			SourceAmsNetId: &m.sourceAmsNetId,
+			SourceAmsPort:  m.sourceAmsPort,
+			CommandId:      readWriteModel.CommandId_ADS_READ,
+			State:          readWriteModel.NewState(false, false, false, false, false, true, false, false, false),
+			ErrorCode:      0,
+			InvokeId:       0,
+			Data:           nil,
 		}
 		switch adsField.FieldType {
 		case StringField:
@@ -141,8 +134,8 @@ func (m *Reader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequ
 				return paket.Userdata.InvokeId == transactionIdentifier
 			},
 			func(message interface{}) error {
-				// Convert the response into an ADU
-				log.Trace().Msg("convert response to ADU")
+				// Convert the response into an amsTcpPaket
+				log.Trace().Msg("convert response to amsTcpPaket")
 				amsTcpPaket := readWriteModel.CastAmsTCPPacket(message)
 				// Convert the ads response into a PLC4X response
 				log.Trace().Msg("convert response to PLC4X response")
diff --git a/plc4go/internal/plc4go/ads/Writer.go b/plc4go/internal/plc4go/ads/Writer.go
index 1228370..117a392 100644
--- a/plc4go/internal/plc4go/ads/Writer.go
+++ b/plc4go/internal/plc4go/ads/Writer.go
@@ -33,12 +33,20 @@ import (
 
 type Writer struct {
 	transactionIdentifier uint32
+	targetAmsNetId        readWriteModel.AmsNetId
+	targetAmsPort         uint16
+	sourceAmsNetId        readWriteModel.AmsNetId
+	sourceAmsPort         uint16
 	messageCodec          spi.MessageCodec
 }
 
-func NewWriter(messageCodec spi.MessageCodec) Writer {
+func NewWriter(messageCodec spi.MessageCodec, targetAmsNetId readWriteModel.AmsNetId, targetAmsPort uint16, sourceAmsNetId readWriteModel.AmsNetId, sourceAmsPort uint16) Writer {
 	return Writer{
 		transactionIdentifier: 0,
+		targetAmsNetId:        targetAmsNetId,
+		targetAmsPort:         targetAmsPort,
+		sourceAmsNetId:        sourceAmsNetId,
+		sourceAmsPort:         sourceAmsPort,
 		messageCodec:          messageCodec,
 	}
 }
@@ -82,31 +90,16 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
 		}
 		data := utils.Uint8ArrayToInt8Array(io.GetBytes())
 
-		// TODO: move TargetAmsNetId, TargetAmsPort, SourceAmsNetId, SourceAmsPort to Connection
 		userdata := readWriteModel.AmsPacket{
-			TargetAmsNetId: &readWriteModel.AmsNetId{
-				Octet1: 0,
-				Octet2: 0,
-				Octet3: 0,
-				Octet4: 0,
-				Octet5: 0,
-				Octet6: 0,
-			},
-			TargetAmsPort: 0,
-			SourceAmsNetId: &readWriteModel.AmsNetId{
-				Octet1: 0,
-				Octet2: 0,
-				Octet3: 0,
-				Octet4: 0,
-				Octet5: 0,
-				Octet6: 0,
-			},
-			SourceAmsPort: 0,
-			CommandId:     readWriteModel.CommandId_ADS_READ,
-			State:         readWriteModel.NewState(false, false, false, false, false, true, false, false, false),
-			ErrorCode:     0,
-			InvokeId:      0,
-			Data:          nil,
+			TargetAmsNetId: &m.targetAmsNetId,
+			TargetAmsPort:  m.targetAmsPort,
+			SourceAmsNetId: &m.sourceAmsNetId,
+			SourceAmsPort:  m.sourceAmsPort,
+			CommandId:      readWriteModel.CommandId_ADS_READ,
+			State:          readWriteModel.NewState(false, false, false, false, false, true, false, false, false),
+			ErrorCode:      0,
+			InvokeId:       0,
+			Data:           nil,
 		}
 		switch adsField.FieldType {
 		case StringField:
@@ -136,8 +129,8 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
 		}
 		userdata.InvokeId = transactionIdentifier
 
-		// Assemble the finished ADU
-		log.Trace().Msg("Assemble ADU")
+		// Assemble the finished amsTcpPaket
+		log.Trace().Msg("Assemble amsTcpPaket")
 		amsTcpPaket := readWriteModel.AmsTCPPacket{
 			Userdata: &userdata,
 		}
@@ -150,7 +143,7 @@ func (m Writer) Write(writeRequest model.PlcWriteRequest) <-chan model.PlcWriteR
 				return paket.Userdata.InvokeId == transactionIdentifier
 			},
 			func(message interface{}) error {
-				// Convert the response into an ADU
+				// Convert the response into an responseAmsTcpPaket
 				responseAmsTcpPaket := readWriteModel.CastAmsTCPPacket(message)
 				// Convert the ads response into a PLC4X response
 				readResponse, err := m.ToPlc4xWriteResponse(amsTcpPaket, *responseAmsTcpPaket, writeRequest)
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go b/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go
index 06960fd..5fa75f7 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AdsDataType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -615,6 +617,25 @@ func (e AdsDataType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *AdsDataType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = AdsDataTypeByName(string(tok))
+		}
+	}
+}
+
 func (e AdsDataType) String() string {
 	switch e {
 	case AdsDataType_BOOL:
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AmsPacket.go b/plc4go/internal/plc4go/ads/readwrite/model/AmsPacket.go
index 009398c..fb359c2 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AmsPacket.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AmsPacket.go
@@ -261,11 +261,11 @@ func (m *AmsPacket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "targetAmsNetId":
-				var data *AmsNetId
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data AmsNetId
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.TargetAmsNetId = data
+				m.TargetAmsNetId = &data
 			case "targetAmsPort":
 				var data uint16
 				if err := d.DecodeElement(&data, &tok); err != nil {
@@ -273,11 +273,11 @@ func (m *AmsPacket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 				}
 				m.TargetAmsPort = data
 			case "sourceAmsNetId":
-				var data *AmsNetId
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data AmsNetId
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SourceAmsNetId = data
+				m.SourceAmsNetId = &data
 			case "sourceAmsPort":
 				var data uint16
 				if err := d.DecodeElement(&data, &tok); err != nil {
@@ -291,11 +291,11 @@ func (m *AmsPacket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 				}
 				m.CommandId = data
 			case "state":
-				var data *State
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data State
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.State = data
+				m.State = &data
 			case "errorCode":
 				var data uint32
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AmsSerialFrame.go b/plc4go/internal/plc4go/ads/readwrite/model/AmsSerialFrame.go
index 04242b1..df1211e 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AmsSerialFrame.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AmsSerialFrame.go
@@ -245,11 +245,11 @@ func (m *AmsSerialFrame) UnmarshalXML(d *xml.Decoder, start xml.StartElement) er
 				}
 				m.Length = data
 			case "userdata":
-				var data *AmsPacket
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data AmsPacket
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.Userdata = data
+				m.Userdata = &data
 			case "crc":
 				var data uint16
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/AmsTCPPacket.go b/plc4go/internal/plc4go/ads/readwrite/model/AmsTCPPacket.go
index afbdb7e..8c369f1 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/AmsTCPPacket.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/AmsTCPPacket.go
@@ -155,11 +155,11 @@ func (m *AmsTCPPacket) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "userdata":
-				var data *AmsPacket
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data AmsPacket
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.Userdata = data
+				m.Userdata = &data
 			}
 		}
 	}
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go b/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go
index 2def90b..79f6a22 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/CommandId.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -126,6 +128,25 @@ func (e CommandId) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *CommandId) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = CommandIdByName(string(tok))
+		}
+	}
+}
+
 func (e CommandId) String() string {
 	switch e {
 	case CommandId_INVALID:
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go b/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go
index 98bb081..321d995 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/ReservedIndexGroups.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -226,6 +228,25 @@ func (e ReservedIndexGroups) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *ReservedIndexGroups) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ReservedIndexGroupsByName(string(tok))
+		}
+	}
+}
+
 func (e ReservedIndexGroups) String() string {
 	switch e {
 	case ReservedIndexGroups_ADSIOFFS_DEVDATA_ADSSTATE:
diff --git a/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go b/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go
index 92151f2..9027219 100644
--- a/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go
+++ b/plc4go/internal/plc4go/ads/readwrite/model/ReturnCode.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -686,6 +688,25 @@ func (e ReturnCode) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *ReturnCode) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ReturnCodeByName(string(tok))
+		}
+	}
+}
+
 func (e ReturnCode) String() string {
 	switch e {
 	case ReturnCode_OK:
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
index eeda4e7..59af479 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
@@ -294,17 +294,17 @@ func (m *APDUComplexAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) er
 				}
 				m.OriginalInvokeId = data
 			case "sequenceNumber":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SequenceNumber = data
+				m.SequenceNumber = &data
 			case "proposedWindowSize":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ProposedWindowSize = data
+				m.ProposedWindowSize = &data
 			case "serviceAck":
 				var dt *BACnetServiceAck
 				if err := d.DecodeElement(&dt, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
index 88e1586..cc6ccc7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -369,17 +369,17 @@ func (m *APDUConfirmedRequest) UnmarshalXML(d *xml.Decoder, start xml.StartEleme
 				}
 				m.InvokeId = data
 			case "sequenceNumber":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SequenceNumber = data
+				m.SequenceNumber = &data
 			case "proposedWindowSize":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ProposedWindowSize = data
+				m.ProposedWindowSize = &data
 			case "serviceRequest":
 				var dt *BACnetConfirmedServiceRequest
 				if err := d.DecodeElement(&dt, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
index 1924ce5..2502fe4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -141,6 +143,25 @@ func (e ApplicationTag) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *ApplicationTag) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ApplicationTagByName(string(tok))
+		}
+	}
+}
+
 func (e ApplicationTag) String() string {
 	switch e {
 	case ApplicationTag_NULL:
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
index 1d4bc73..dc30101 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -131,6 +133,25 @@ func (e BACnetNetworkType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *BACnetNetworkType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = BACnetNetworkTypeByName(string(tok))
+		}
+	}
+}
+
 func (e BACnetNetworkType) String() string {
 	switch e {
 	case BACnetNetworkType_ETHERNET:
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
index bff92ee..b78c7ed 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -186,6 +188,25 @@ func (e BACnetNodeType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *BACnetNodeType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = BACnetNodeTypeByName(string(tok))
+		}
+	}
+}
+
 func (e BACnetNodeType) String() string {
 	switch e {
 	case BACnetNodeType_UNKNOWN:
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
index 1000973..a9934c4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -91,6 +93,25 @@ func (e BACnetNotifyType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *BACnetNotifyType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = BACnetNotifyTypeByName(string(tok))
+		}
+	}
+}
+
 func (e BACnetNotifyType) String() string {
 	switch e {
 	case BACnetNotifyType_ALARM:
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
index 537713d..18269c7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -371,6 +373,25 @@ func (e BACnetObjectType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *BACnetObjectType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = BACnetObjectTypeByName(string(tok))
+		}
+	}
+}
+
 func (e BACnetObjectType) String() string {
 	switch e {
 	case BACnetObjectType_ANALOG_INPUT:
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
index 2678c99..3f62e31 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
@@ -278,17 +278,17 @@ func (m *BACnetTag) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 				}
 				m.LengthValueType = data
 			case "extTagNumber":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ExtTagNumber = data
+				m.ExtTagNumber = &data
 			case "extLength":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ExtLength = data
+				m.ExtLength = &data
 			default:
 				switch start.Attr[0].Value {
 				case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationNull":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
index 2057e9e..ad7a8fa 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
@@ -304,17 +304,17 @@ func (m *BACnetTagWithContent) UnmarshalXML(d *xml.Decoder, start xml.StartEleme
 				}
 				m.LengthValueType = data
 			case "extTagNumber":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ExtTagNumber = data
+				m.ExtTagNumber = &data
 			case "extLength":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ExtLength = data
+				m.ExtLength = &data
 			case "propertyIdentifier":
 				var data []uint8
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
index 004100e..b86c8c8 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
@@ -197,11 +197,11 @@ func (m *BVLCForwardedNPDU) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
 				}
 				m.Port = data
 			case "npdu":
-				var data *NPDU
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data NPDU
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.Npdu = data
+				m.Npdu = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
index 228631e..da4db1d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
@@ -137,11 +137,11 @@ func (m *BVLCOriginalBroadcastNPDU) UnmarshalXML(d *xml.Decoder, start xml.Start
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "npdu":
-				var data *NPDU
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data NPDU
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.Npdu = data
+				m.Npdu = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
index 0cbab76..fb0992b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
@@ -137,11 +137,11 @@ func (m *BVLCOriginalUnicastNPDU) UnmarshalXML(d *xml.Decoder, start xml.StartEl
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "npdu":
-				var data *NPDU
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data NPDU
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.Npdu = data
+				m.Npdu = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
index 0de9671..71ddeec 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
@@ -182,11 +182,11 @@ func (m *NLM) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "vendorId":
-				var data *uint16
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint16
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.VendorId = data
+				m.VendorId = &data
 			default:
 				switch start.Attr[0].Value {
 				case "org.apache.plc4x.java.bacnetip.readwrite.NLMWhoIsRouterToNetwork":
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
index 8ac8e85..eef33eb 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
@@ -522,17 +522,17 @@ func (m *NPDU) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 				}
 				m.NetworkPriority = data
 			case "destinationNetworkAddress":
-				var data *uint16
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint16
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DestinationNetworkAddress = data
+				m.DestinationNetworkAddress = &data
 			case "destinationLength":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DestinationLength = data
+				m.DestinationLength = &data
 			case "destinationAddress":
 				var data []uint8
 				if err := d.DecodeElement(&data, &tok); err != nil {
@@ -540,17 +540,17 @@ func (m *NPDU) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 				}
 				m.DestinationAddress = data
 			case "sourceNetworkAddress":
-				var data *uint16
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint16
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SourceNetworkAddress = data
+				m.SourceNetworkAddress = &data
 			case "sourceLength":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SourceLength = data
+				m.SourceLength = &data
 			case "sourceAddress":
 				var data []uint8
 				if err := d.DecodeElement(&data, &tok); err != nil {
@@ -558,11 +558,11 @@ func (m *NPDU) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 				}
 				m.SourceAddress = data
 			case "hopCount":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HopCount = data
+				m.HopCount = &data
 			case "nlm":
 				var dt *NLM
 				if err := d.DecodeElement(&dt, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/Driver.go b/plc4go/internal/plc4go/knxnetip/Driver.go
index 2cd3314..8bef0c9 100644
--- a/plc4go/internal/plc4go/knxnetip/Driver.go
+++ b/plc4go/internal/plc4go/knxnetip/Driver.go
@@ -19,11 +19,11 @@
 package knxnetip
 
 import (
-	"errors"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/transports"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go"
 	"github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+	"github.com/pkg/errors"
 	"net/url"
 )
 
@@ -59,7 +59,9 @@ func (m Driver) GetConnection(transportUrl url.URL, transports map[string]transp
 	transport, ok := transports[transportUrl.Scheme]
 	if !ok {
 		ch := make(chan plc4go.PlcConnectionConnectResult)
-		ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.New("couldn't find transport for given transport url "+transportUrl.String()))
+		go func() {
+			ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.Errorf("couldn't find transport for given transport url %#v", transportUrl))
+		}()
 		return ch
 	}
 	// Provide a default-port to the transport, which is used, if the user doesn't provide on in the connection string.
@@ -68,7 +70,9 @@ func (m Driver) GetConnection(transportUrl url.URL, transports map[string]transp
 	transportInstance, err := transport.CreateTransportInstance(transportUrl, options)
 	if err != nil {
 		ch := make(chan plc4go.PlcConnectionConnectResult)
-		ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.New("couldn't initialize transport configuration for given transport url "+transportUrl.String()))
+		go func() {
+			ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.Errorf("couldn't initialize transport configuration for given transport url %#v", transportUrl))
+		}()
 		return ch
 	}
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go
index 6e96fd0..23e5e90 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/AccessLevel.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -160,6 +162,25 @@ func (e AccessLevel) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *AccessLevel) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = AccessLevelByName(string(tok))
+		}
+	}
+}
+
 func (e AccessLevel) String() string {
 	switch e {
 	case AccessLevel_Level0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
index e18df20..0ed7d46 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
@@ -159,11 +159,11 @@ func (m *CEMIAdditionalInformationRelativeTimestamp) UnmarshalXML(d *xml.Decoder
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "relativeTimestamp":
-				var data *RelativeTimestamp
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data RelativeTimestamp
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.RelativeTimestamp = data
+				m.RelativeTimestamp = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
index 0688a5e..44ae803 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -96,6 +98,25 @@ func (e CEMIPriority) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *CEMIPriority) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = CEMIPriorityByName(string(tok))
+		}
+	}
+}
+
 func (e CEMIPriority) String() string {
 	switch e {
 	case CEMIPriority_SYSTEM:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go
index 3ae64e8..05e9476 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableAddresses.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -15439,6 +15441,25 @@ func (e ComObjectTableAddresses) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *ComObjectTableAddresses) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ComObjectTableAddressesByName(string(tok))
+		}
+	}
+}
+
 func (e ComObjectTableAddresses) String() string {
 	switch e {
 	case ComObjectTableAddresses_DEV0001914201:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType6.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType6.go
index f2cc01a..ebbf1d2 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType6.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectTableRealisationType6.go
@@ -137,11 +137,11 @@ func (m *ComObjectTableRealisationType6) UnmarshalXML(d *xml.Decoder, start xml.
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "comObjectDescriptors":
-				var data *GroupObjectDescriptorRealisationType6
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data GroupObjectDescriptorRealisationType6
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ComObjectDescriptors = data
+				m.ComObjectDescriptors = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go
index b25b7e4..4c18010 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ComObjectValueType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -220,6 +222,25 @@ func (e ComObjectValueType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *ComObjectValueType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ComObjectValueTypeByName(string(tok))
+		}
+	}
+}
+
 func (e ComObjectValueType) String() string {
 	switch e {
 	case ComObjectValueType_BIT1:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
index 65cae86..c45e48e 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
@@ -173,17 +173,17 @@ func (m *ConnectionRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "hpaiDiscoveryEndpoint":
-				var data *HPAIDiscoveryEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIDiscoveryEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiDiscoveryEndpoint = data
+				m.HpaiDiscoveryEndpoint = &data
 			case "hpaiDataEndpoint":
-				var data *HPAIDataEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIDataEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiDataEndpoint = data
+				m.HpaiDataEndpoint = &data
 			case "connectionRequestInformation":
 				var dt *ConnectionRequestInformation
 				if err := d.DecodeElement(&dt, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
index dc59aa8..010088d 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
@@ -224,11 +224,11 @@ func (m *ConnectionResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement
 				}
 				m.Status = data
 			case "hpaiDataEndpoint":
-				var data *HPAIDataEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIDataEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiDataEndpoint = data
+				m.HpaiDataEndpoint = &data
 			case "connectionResponseDataBlock":
 				var dt *ConnectionResponseDataBlock
 				if err := d.DecodeElement(&dt, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
index 5cd1897..fe82714 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
@@ -137,11 +137,11 @@ func (m *ConnectionResponseDataBlockTunnelConnection) UnmarshalXML(d *xml.Decode
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "knxAddress":
-				var data *KnxAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data KnxAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.KnxAddress = data
+				m.KnxAddress = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
index daf1536..024f010 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
@@ -188,11 +188,11 @@ func (m *ConnectionStateRequest) UnmarshalXML(d *xml.Decoder, start xml.StartEle
 				}
 				m.CommunicationChannelId = data
 			case "hpaiControlEndpoint":
-				var data *HPAIControlEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIControlEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiControlEndpoint = data
+				m.HpaiControlEndpoint = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
index 6fb1b91..1f5bc8c 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
@@ -294,23 +294,23 @@ func (m *DIBDeviceInfo) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
 				}
 				m.KnxMedium = data
 			case "deviceStatus":
-				var data *DeviceStatus
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data DeviceStatus
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DeviceStatus = data
+				m.DeviceStatus = &data
 			case "knxAddress":
-				var data *KnxAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data KnxAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.KnxAddress = data
+				m.KnxAddress = &data
 			case "projectInstallationIdentifier":
-				var data *ProjectInstallationIdentifier
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data ProjectInstallationIdentifier
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ProjectInstallationIdentifier = data
+				m.ProjectInstallationIdentifier = &data
 			case "knxNetIpDeviceSerialNumber":
 				var _encoded string
 				if err := d.DecodeElement(&_encoded, &tok); err != nil {
@@ -323,17 +323,17 @@ func (m *DIBDeviceInfo) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
 				}
 				m.KnxNetIpDeviceSerialNumber = utils.ByteArrayToInt8Array(_decoded[0:_len])
 			case "knxNetIpDeviceMulticastAddress":
-				var data *IPAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data IPAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.KnxNetIpDeviceMulticastAddress = data
+				m.KnxNetIpDeviceMulticastAddress = &data
 			case "knxNetIpDeviceMacAddress":
-				var data *MACAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data MACAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.KnxNetIpDeviceMacAddress = data
+				m.KnxNetIpDeviceMacAddress = &data
 			case "deviceFriendlyName":
 				var _encoded string
 				if err := d.DecodeElement(&_encoded, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
index 773fcc7..c616e04 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
@@ -137,11 +137,11 @@ func (m *DescriptionRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "hpaiControlEndpoint":
-				var data *HPAIControlEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIControlEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiControlEndpoint = data
+				m.HpaiControlEndpoint = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
index 6eac4a1..2cf00c1 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
@@ -155,17 +155,17 @@ func (m *DescriptionResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElemen
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "dibDeviceInfo":
-				var data *DIBDeviceInfo
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data DIBDeviceInfo
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DibDeviceInfo = data
+				m.DibDeviceInfo = &data
 			case "dibSuppSvcFamilies":
-				var data *DIBSuppSvcFamilies
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data DIBSuppSvcFamilies
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DibSuppSvcFamilies = data
+				m.DibSuppSvcFamilies = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
index 1f01bed..31b76d2 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
@@ -137,11 +137,11 @@ func (m *DeviceConfigurationAck) UnmarshalXML(d *xml.Decoder, start xml.StartEle
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "deviceConfigurationAckDataBlock":
-				var data *DeviceConfigurationAckDataBlock
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data DeviceConfigurationAckDataBlock
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DeviceConfigurationAckDataBlock = data
+				m.DeviceConfigurationAckDataBlock = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
index e491426..bd87f80 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
@@ -155,11 +155,11 @@ func (m *DeviceConfigurationRequest) UnmarshalXML(d *xml.Decoder, start xml.Star
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "deviceConfigurationRequestDataBlock":
-				var data *DeviceConfigurationRequestDataBlock
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data DeviceConfigurationRequestDataBlock
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DeviceConfigurationRequestDataBlock = data
+				m.DeviceConfigurationRequestDataBlock = &data
 			case "cemi":
 				var dt *CEMI
 				if err := d.DecodeElement(&dt, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go
index cb99d63..8028584 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptor.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -472,6 +474,25 @@ func (e DeviceDescriptor) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *DeviceDescriptor) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = DeviceDescriptorByName(string(tok))
+		}
+	}
+}
+
 func (e DeviceDescriptor) String() string {
 	switch e {
 	case DeviceDescriptor_TP1_BCU_1_SYSTEM_1_0:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go
index e130aab..477951e 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -106,6 +108,25 @@ func (e DeviceDescriptorMediumType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *DeviceDescriptorMediumType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = DeviceDescriptorMediumTypeByName(string(tok))
+		}
+	}
+}
+
 func (e DeviceDescriptorMediumType) String() string {
 	switch e {
 	case DeviceDescriptorMediumType_TP1:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorType2.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorType2.go
index 3b5fd36..ffb3102 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorType2.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorType2.go
@@ -299,29 +299,29 @@ func (m *DeviceDescriptorType2) UnmarshalXML(d *xml.Decoder, start xml.StartElem
 				}
 				m.LogicalTagBase = data
 			case "channelInfo1":
-				var data *ChannelInformation
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data ChannelInformation
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ChannelInfo1 = data
+				m.ChannelInfo1 = &data
 			case "channelInfo2":
-				var data *ChannelInformation
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data ChannelInformation
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ChannelInfo2 = data
+				m.ChannelInfo2 = &data
 			case "channelInfo3":
-				var data *ChannelInformation
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data ChannelInformation
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ChannelInfo3 = data
+				m.ChannelInfo3 = &data
 			case "channelInfo4":
-				var data *ChannelInformation
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data ChannelInformation
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ChannelInfo4 = data
+				m.ChannelInfo4 = &data
 			}
 		}
 	}
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
index 64e7a59..116432c 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
@@ -188,11 +188,11 @@ func (m *DisconnectRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
 				}
 				m.CommunicationChannelId = data
 			case "hpaiControlEndpoint":
-				var data *HPAIControlEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIControlEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiControlEndpoint = data
+				m.HpaiControlEndpoint = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go
index 5c7e471..7862eec 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -156,6 +158,25 @@ func (e FirmwareType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *FirmwareType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = FirmwareTypeByName(string(tok))
+		}
+	}
+}
+
 func (e FirmwareType) String() string {
 	switch e {
 	case FirmwareType_SYSTEM_1:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
index 44f190b..5df092c 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
@@ -168,11 +168,11 @@ func (m *HPAIControlEndpoint) UnmarshalXML(d *xml.Decoder, start xml.StartElemen
 				}
 				m.HostProtocolCode = data
 			case "ipAddress":
-				var data *IPAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data IPAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.IpAddress = data
+				m.IpAddress = &data
 			case "ipPort":
 				var data uint16
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
index fa317ad..5dbc8bd 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
@@ -168,11 +168,11 @@ func (m *HPAIDataEndpoint) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
 				}
 				m.HostProtocolCode = data
 			case "ipAddress":
-				var data *IPAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data IPAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.IpAddress = data
+				m.IpAddress = &data
 			case "ipPort":
 				var data uint16
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
index e815724..ffd647c 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
@@ -168,11 +168,11 @@ func (m *HPAIDiscoveryEndpoint) UnmarshalXML(d *xml.Decoder, start xml.StartElem
 				}
 				m.HostProtocolCode = data
 			case "ipAddress":
-				var data *IPAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data IPAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.IpAddress = data
+				m.IpAddress = &data
 			case "ipPort":
 				var data uint16
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
index 360542b..ced5932 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -86,6 +88,25 @@ func (e HostProtocolCode) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *HostProtocolCode) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = HostProtocolCodeByName(string(tok))
+		}
+	}
+}
+
 func (e HostProtocolCode) String() string {
 	switch e {
 	case HostProtocolCode_IPV4_UDP:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go
index ed6eb35..649cb1e 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointMainType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -1125,6 +1127,25 @@ func (e KnxDatapointMainType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxDatapointMainType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxDatapointMainTypeByName(string(tok))
+		}
+	}
+}
+
 func (e KnxDatapointMainType) String() string {
 	switch e {
 	case KnxDatapointMainType_DPT_UNKNOWN:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go
index fa64b39..ca1767f 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -6021,6 +6023,25 @@ func (e KnxDatapointType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxDatapointType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxDatapointTypeByName(string(tok))
+		}
+	}
+}
+
 func (e KnxDatapointType) String() string {
 	switch e {
 	case KnxDatapointType_DPT_UNKNOWN:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
index 5107e01..d7b5f56 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -4651,6 +4653,25 @@ func (e KnxInterfaceObjectProperty) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxInterfaceObjectProperty) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxInterfaceObjectPropertyByName(string(tok))
+		}
+	}
+}
+
 func (e KnxInterfaceObjectProperty) String() string {
 	switch e {
 	case KnxInterfaceObjectProperty_PID_UNKNOWN:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go
index dd1217e..77732d5 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxInterfaceObjectType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -420,6 +422,25 @@ func (e KnxInterfaceObjectType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxInterfaceObjectType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxInterfaceObjectTypeByName(string(tok))
+		}
+	}
+}
+
 func (e KnxInterfaceObjectType) String() string {
 	switch e {
 	case KnxInterfaceObjectType_OT_UNKNOWN:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
index cb7495e..adb47e0 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -91,6 +93,25 @@ func (e KnxLayer) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxLayer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxLayerByName(string(tok))
+		}
+	}
+}
+
 func (e KnxLayer) String() string {
 	switch e {
 	case KnxLayer_TUNNEL_LINK_LAYER:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
index b3a367d..d931476 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -7180,6 +7182,25 @@ func (e KnxManufacturer) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxManufacturer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxManufacturerByName(string(tok))
+		}
+	}
+}
+
 func (e KnxManufacturer) String() string {
 	switch e {
 	case KnxManufacturer_M_UNKNOWN:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go
index 193bd86..9cd305c 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxMedium.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -106,6 +108,25 @@ func (e KnxMedium) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxMedium) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxMediumByName(string(tok))
+		}
+	}
+}
+
 func (e KnxMedium) String() string {
 	switch e {
 	case KnxMedium_MEDIUM_RESERVED_1:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go
index f8f8b23..dea8b86 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxPropertyDataType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -955,6 +957,25 @@ func (e KnxPropertyDataType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *KnxPropertyDataType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = KnxPropertyDataTypeByName(string(tok))
+		}
+	}
+}
+
 func (e KnxPropertyDataType) String() string {
 	switch e {
 	case KnxPropertyDataType_PDT_UNKNOWN:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go
index 3af2460..cc90e84 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LBusmonInd.go
@@ -237,11 +237,11 @@ func (m *LBusmonInd) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error
 				}
 				m.DataFrame = dt
 			case "crc":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.Crc = data
+				m.Crc = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go
index aebe20e..6b94e3d 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataExtended.go
@@ -286,11 +286,11 @@ func (m *LDataExtended) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
 				}
 				m.ExtendedFrameFormat = data
 			case "sourceAddress":
-				var data *KnxAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data KnxAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SourceAddress = data
+				m.SourceAddress = &data
 			case "destinationAddress":
 				var _encoded string
 				if err := d.DecodeElement(&_encoded, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go
index a8b6f01..2935bbf 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/LPollData.go
@@ -222,11 +222,11 @@ func (m *LPollData) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "sourceAddress":
-				var data *KnxAddress
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data KnxAddress
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SourceAddress = data
+				m.SourceAddress = &data
 			case "targetAddress":
 				var _encoded string
 				if err := d.DecodeElement(&_encoded, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
index 1930c03..92a71c9 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
@@ -137,11 +137,11 @@ func (m *SearchRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "hpaiIDiscoveryEndpoint":
-				var data *HPAIDiscoveryEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIDiscoveryEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiIDiscoveryEndpoint = data
+				m.HpaiIDiscoveryEndpoint = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
index 167d323..60608d7 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
@@ -173,23 +173,23 @@ func (m *SearchResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) er
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "hpaiControlEndpoint":
-				var data *HPAIControlEndpoint
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data HPAIControlEndpoint
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.HpaiControlEndpoint = data
+				m.HpaiControlEndpoint = &data
 			case "dibDeviceInfo":
-				var data *DIBDeviceInfo
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data DIBDeviceInfo
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DibDeviceInfo = data
+				m.DibDeviceInfo = &data
 			case "dibSuppSvcFamilies":
-				var data *DIBSuppSvcFamilies
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data DIBSuppSvcFamilies
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DibSuppSvcFamilies = data
+				m.DibSuppSvcFamilies = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
index f49ee99..b633f40 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -136,6 +138,25 @@ func (e Status) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *Status) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = StatusByName(string(tok))
+		}
+	}
+}
+
 func (e Status) String() string {
 	switch e {
 	case Status_NO_ERROR:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go
index 442db6c..a1c49a2 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/SupportedPhysicalMedia.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -368,6 +370,25 @@ func (e SupportedPhysicalMedia) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *SupportedPhysicalMedia) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = SupportedPhysicalMediaByName(string(tok))
+		}
+	}
+}
+
 func (e SupportedPhysicalMedia) String() string {
 	switch e {
 	case SupportedPhysicalMedia_OTHER:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
index 110af10..8d0f223 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
@@ -155,11 +155,11 @@ func (m *TunnelingRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "tunnelingRequestDataBlock":
-				var data *TunnelingRequestDataBlock
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data TunnelingRequestDataBlock
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.TunnelingRequestDataBlock = data
+				m.TunnelingRequestDataBlock = &data
 			case "cemi":
 				var dt *CEMI
 				if err := d.DecodeElement(&dt, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
index e2a7924..86bd39a 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
@@ -137,11 +137,11 @@ func (m *TunnelingResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement)
 			tok := token.(xml.StartElement)
 			switch tok.Name.Local {
 			case "tunnelingResponseDataBlock":
-				var data *TunnelingResponseDataBlock
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data TunnelingResponseDataBlock
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.TunnelingResponseDataBlock = data
+				m.TunnelingResponseDataBlock = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/modbus/Driver.go b/plc4go/internal/plc4go/modbus/Driver.go
index ee5f9df..eb82b36 100644
--- a/plc4go/internal/plc4go/modbus/Driver.go
+++ b/plc4go/internal/plc4go/modbus/Driver.go
@@ -65,7 +65,9 @@ func (m Driver) GetConnection(transportUrl url.URL, transports map[string]transp
 	if !ok {
 		log.Error().Stringer("transportUrl", &transportUrl).Msgf("We couldn't find a transport for scheme %s", transportUrl.Scheme)
 		ch := make(chan plc4go.PlcConnectionConnectResult)
-		ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.Errorf("couldn't find transport for given transport url %#v", transportUrl))
+		go func() {
+			ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.Errorf("couldn't find transport for given transport url %#v", transportUrl))
+		}()
 		return ch
 	}
 	// Provide a default-port to the transport, which is used, if the user doesn't provide on in the connection string.
@@ -75,7 +77,9 @@ func (m Driver) GetConnection(transportUrl url.URL, transports map[string]transp
 	if err != nil {
 		log.Error().Stringer("transportUrl", &transportUrl).Msgf("We couldn't create a transport instance for port %#v", options["defaultTcpPort"])
 		ch := make(chan plc4go.PlcConnectionConnectResult)
-		ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.New("couldn't initialize transport configuration for given transport url "+transportUrl.String()))
+		go func() {
+			ch <- plc4go.NewPlcConnectionConnectResult(nil, errors.New("couldn't initialize transport configuration for given transport url "+transportUrl.String()))
+		}()
 		return ch
 	}
 
diff --git a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
index b61b719..5278e7f 100644
--- a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
+++ b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -328,6 +330,25 @@ func (e ModbusDataType) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *ModbusDataType) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ModbusDataTypeByName(string(tok))
+		}
+	}
+}
+
 func (e ModbusDataType) String() string {
 	switch e {
 	case ModbusDataType_BOOL:
diff --git a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go
index 310824e..f584919 100644
--- a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go
+++ b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusErrorCode.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -126,6 +128,25 @@ func (e ModbusErrorCode) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *ModbusErrorCode) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = ModbusErrorCodeByName(string(tok))
+		}
+	}
+}
+
 func (e ModbusErrorCode) String() string {
 	switch e {
 	case ModbusErrorCode_ILLEGAL_FUNCTION:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go b/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
index 3192c12..277f410 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -101,6 +103,25 @@ func (e COTPProtocolClass) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *COTPProtocolClass) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = COTPProtocolClassByName(string(tok))
+		}
+	}
+}
+
 func (e COTPProtocolClass) String() string {
 	switch e {
 	case COTPProtocolClass_CLASS_0:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go b/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
index 118f475..fc6443e 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -148,6 +150,25 @@ func (e COTPTpduSize) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *COTPTpduSize) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = COTPTpduSizeByName(string(tok))
+		}
+	}
+}
+
 func (e COTPTpduSize) String() string {
 	switch e {
 	case COTPTpduSize_SIZE_128:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
index 84a8c09..d423064 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -106,6 +108,25 @@ func (e DataTransportErrorCode) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *DataTransportErrorCode) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = DataTransportErrorCodeByName(string(tok))
+		}
+	}
+}
+
 func (e DataTransportErrorCode) String() string {
 	switch e {
 	case DataTransportErrorCode_RESERVED:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
index 3d95458..77a505c 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -148,6 +150,25 @@ func (e DataTransportSize) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *DataTransportSize) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = DataTransportSizeByName(string(tok))
+		}
+	}
+}
+
 func (e DataTransportSize) String() string {
 	switch e {
 	case DataTransportSize_NULL:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go b/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
index 350a84f..eb17bb3 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -91,6 +93,25 @@ func (e DeviceGroup) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *DeviceGroup) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = DeviceGroupByName(string(tok))
+		}
+	}
+}
+
 func (e DeviceGroup) String() string {
 	switch e {
 	case DeviceGroup_PG_OR_PC:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go b/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
index a83a3b3..ccdd34a 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -166,6 +168,25 @@ func (e MemoryArea) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *MemoryArea) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = MemoryAreaByName(string(tok))
+		}
+	}
+}
+
 func (e MemoryArea) String() string {
 	switch e {
 	case MemoryArea_COUNTERS:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
index 4408c4e..d361dda 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
@@ -344,23 +344,23 @@ func (m *S7ParameterUserDataItemCPUFunctions) UnmarshalXML(d *xml.Decoder, start
 				}
 				m.SequenceNumber = data
 			case "dataUnitReferenceNumber":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.DataUnitReferenceNumber = data
+				m.DataUnitReferenceNumber = &data
 			case "lastDataUnit":
-				var data *uint8
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint8
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.LastDataUnit = data
+				m.LastDataUnit = &data
 			case "errorCode":
-				var data *uint16
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data uint16
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.ErrorCode = data
+				m.ErrorCode = &data
 			}
 		}
 		token, err = d.Token()
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go
index f4a45cf..8a244c9 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go
@@ -235,11 +235,11 @@ func (m *S7PayloadUserDataItem) UnmarshalXML(d *xml.Decoder, start xml.StartElem
 				}
 				m.TransportSize = data
 			case "szlId":
-				var data *SzlId
-				if err := d.DecodeElement(data, &tok); err != nil {
+				var data SzlId
+				if err := d.DecodeElement(&data, &tok); err != nil {
 					return err
 				}
-				m.SzlId = data
+				m.SzlId = &data
 			case "szlIndex":
 				var data uint16
 				if err := d.DecodeElement(&data, &tok); err != nil {
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go b/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go
index 617c845..57cd402 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/SzlModuleTypeClass.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -96,6 +98,25 @@ func (e SzlModuleTypeClass) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *SzlModuleTypeClass) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = SzlModuleTypeClassByName(string(tok))
+		}
+	}
+}
+
 func (e SzlModuleTypeClass) String() string {
 	switch e {
 	case SzlModuleTypeClass_CPU:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go b/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go
index 32151a4..efea39e 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/SzlSublist.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -171,6 +173,25 @@ func (e SzlSublist) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *SzlSublist) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = SzlSublistByName(string(tok))
+		}
+	}
+}
+
 func (e SzlSublist) String() string {
 	switch e {
 	case SzlSublist_MODULE_IDENTIFICATION:
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
index cdb4360..e58e413 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
@@ -19,7 +19,9 @@
 package model
 
 import (
+	"encoding/xml"
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+	"io"
 )
 
 // Code generated by build-utils. DO NOT EDIT.
@@ -1459,6 +1461,25 @@ func (e TransportSize) Serialize(io utils.WriteBuffer) error {
 	return err
 }
 
+func (m *TransportSize) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+	var token xml.Token
+	var err error
+	for {
+		token, err = d.Token()
+		if err != nil {
+			if err == io.EOF {
+				return nil
+			}
+			return err
+		}
+		switch token.(type) {
+		case xml.CharData:
+			tok := token.(xml.CharData)
+			*m = TransportSizeByName(string(tok))
+		}
+	}
+}
+
 func (e TransportSize) String() string {
 	switch e {
 	case TransportSize_BOOL:
diff --git a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
index e4ff029..2150714 100644
--- a/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
+++ b/plc4go/internal/plc4go/spi/testutils/DriverTestRunner.go
@@ -36,6 +36,7 @@ import (
 	"os"
 	"runtime/debug"
 	"strconv"
+	"strings"
 	"testing"
 	"time"
 )
@@ -50,8 +51,16 @@ type DriverTestsuite struct {
 }
 
 func (m DriverTestsuite) Run(driverManager plc4go.PlcDriverManager, testcase Testcase) error {
+	var options []string
+	for key, value := range m.driverParameters {
+		options = append(options, fmt.Sprintf("%s=%s", key, value))
+	}
+	optionsString := ""
+	if len(options) > 0 {
+		optionsString = "?" + strings.Join(options, "&")
+	}
 	// Get a connection
-	connectionChan := driverManager.GetConnection(m.driverName + ":test://hurz")
+	connectionChan := driverManager.GetConnection(m.driverName + ":test://hurz" + optionsString)
 	connectionResult := <-connectionChan
 
 	if connectionResult.Err != nil {