You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2021/01/24 16:45:03 UTC

[plc4x] branch develop updated (0baecae -> d9b9ddd)

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

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


    from 0baecae  - Removed an unneeded log output
     new 471873a  - Made the KNX driver return an error if the device we try to connect to doesn't support "tunneling"
     new 320cd6d  - Added more documentation on KNX operations
     new 191ecd2  - Added stuff for decoding the KNX DeviceDescriptors
     new d32e91a  - Fixed a wrong package name
     new ad6cc1d  - Replaced the manually created KnxDatatypes and DataIo with a fully generated version
     new 5e874e5  - Updated generated Go code
     new d9b9ddd  - Finished migrating the Go KNX client to the new model.

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


Summary of changes:
 .../BaseFreemarkerLanguageTemplateHelper.java      |     4 +
 .../language/go/GoLanguageTemplateHelper.java      |   208 +-
 .../resources/templates/go/data-io-template.ftlh   |     8 +-
 .../templates/go/parser-factory-template.ftlh      |     2 +-
 .../templates/go/xml-parser-factory-template.ftlh  |     2 +-
 .../knxnetip/ParserSerializerTestsuite.xml         |    35 +-
 plc4go/cmd/main/drivers/knxnetip_test.go           |     5 +-
 .../plc4go/bacnetip/readwrite/ParserHelper.go      |     2 +-
 .../plc4go/bacnetip/readwrite/XmlParserHelper.go   |     2 +-
 .../{KnxNetIpWriter.go => KnxNetIpActiveReader.go} |    48 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go |    10 +-
 .../internal/plc4go/knxnetip/KnxNetIpConnection.go |  1040 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpField.go   |    17 +
 .../plc4go/knxnetip/KnxNetIpMessageCodec.go        |     3 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go  |   967 +-
 .../internal/plc4go/knxnetip/KnxNetIpSubscriber.go |    60 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpWriter.go  |     3 +-
 .../plc4go/knxnetip/readwrite/ParserHelper.go      |   142 +-
 .../plc4go/knxnetip/readwrite/XmlParserHelper.go   |   378 +-
 .../plc4go/knxnetip/readwrite/model/APCI.go        |   193 -
 .../plc4go/knxnetip/readwrite/model/Apdu.go        |   286 +
 .../plc4go/knxnetip/readwrite/model/ApduControl.go |   236 +
 .../model/{LDataFrameAck.go => ApduControlAck.go}  |    68 +-
 .../{LDataFrameAck.go => ApduControlConnect.go}    |    68 +-
 .../readwrite/model/ApduControlContainer.go        |   166 +
 .../{LDataFrameAck.go => ApduControlDisconnect.go} |    68 +-
 .../model/{LDataFrameAck.go => ApduControlNack.go} |    68 +-
 .../plc4go/knxnetip/readwrite/model/ApduData.go    |   404 +
 .../model/{LDataFrameAck.go => ApduDataAdcRead.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataAdcResponse.go}   |    68 +-
 .../knxnetip/readwrite/model/ApduDataContainer.go  |   166 +
 .../model/ApduDataDeviceDescriptorRead.go          |   164 +
 .../model/ApduDataDeviceDescriptorResponse.go      |   210 +
 .../plc4go/knxnetip/readwrite/model/ApduDataExt.go |   754 ++
 ...aFrameAck.go => ApduDataExtAuthorizeRequest.go} |    68 +-
 ...FrameAck.go => ApduDataExtAuthorizeResponse.go} |    68 +-
 ...FrameAck.go => ApduDataExtDomainAddressRead.go} |    68 +-
 ...eAck.go => ApduDataExtDomainAddressResponse.go} |    68 +-
 ...go => ApduDataExtDomainAddressSelectiveRead.go} |    68 +-
 ...=> ApduDataExtDomainAddressSerialNumberRead.go} |    68 +-
 ...pduDataExtDomainAddressSerialNumberResponse.go} |    68 +-
 ...> ApduDataExtDomainAddressSerialNumberWrite.go} |    68 +-
 ...rameAck.go => ApduDataExtDomainAddressWrite.go} |    68 +-
 ...meAck.go => ApduDataExtFileStreamInfoReport.go} |    68 +-
 ... => ApduDataExtGroupPropertyValueInfoReport.go} |    68 +-
 ...Ack.go => ApduDataExtGroupPropertyValueRead.go} |    68 +-
 ...go => ApduDataExtGroupPropertyValueResponse.go} |    68 +-
 ...ck.go => ApduDataExtGroupPropertyValueWrite.go} |    68 +-
 ...pduDataExtIndividualAddressSerialNumberRead.go} |    68 +-
 ...ataExtIndividualAddressSerialNumberResponse.go} |    68 +-
 ...duDataExtIndividualAddressSerialNumberWrite.go} |    68 +-
 ...{LDataFrameAck.go => ApduDataExtKeyResponse.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataExtKeyWrite.go}   |    68 +-
 .../{LDataFrameAck.go => ApduDataExtLinkRead.go}   |    68 +-
 ...LDataFrameAck.go => ApduDataExtLinkResponse.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataExtLinkWrite.go}  |    68 +-
 ...ataFrameAck.go => ApduDataExtMemoryBitWrite.go} |    68 +-
 ...meAck.go => ApduDataExtNetworkParameterRead.go} |    68 +-
 ...k.go => ApduDataExtNetworkParameterResponse.go} |    68 +-
 ...eAck.go => ApduDataExtNetworkParameterWrite.go} |    68 +-
 ...ck.go => ApduDataExtOpenRoutingTableRequest.go} |    68 +-
 ...ck.go => ApduDataExtPropertyDescriptionRead.go} |    68 +-
 ...o => ApduDataExtPropertyDescriptionResponse.go} |    68 +-
 .../model/ApduDataExtPropertyValueRead.go          |   248 +
 .../model/ApduDataExtPropertyValueResponse.go      |   292 +
 ...rameAck.go => ApduDataExtPropertyValueWrite.go} |    68 +-
 ...ck.go => ApduDataExtReadRouterMemoryRequest.go} |    68 +-
 ...k.go => ApduDataExtReadRouterMemoryResponse.go} |    68 +-
 ...ck.go => ApduDataExtReadRouterStatusRequest.go} |    68 +-
 ...k.go => ApduDataExtReadRouterStatusResponse.go} |    68 +-
 ...ck.go => ApduDataExtReadRoutingTableRequest.go} |    68 +-
 ...k.go => ApduDataExtReadRoutingTableResponse.go} |    68 +-
 ...k.go => ApduDataExtWriteRouterMemoryRequest.go} |    68 +-
 ...k.go => ApduDataExtWriteRouterStatusRequest.go} |    68 +-
 ...k.go => ApduDataExtWriteRoutingTableRequest.go} |    68 +-
 ...{LDataFrameAck.go => ApduDataGroupValueRead.go} |    68 +-
 ...taFrameAck.go => ApduDataGroupValueResponse.go} |    68 +-
 .../readwrite/model/ApduDataGroupValueWrite.go     |   210 +
 ...rameAck.go => ApduDataIndividualAddressRead.go} |    68 +-
 ...Ack.go => ApduDataIndividualAddressResponse.go} |    68 +-
 ...ameAck.go => ApduDataIndividualAddressWrite.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataMemoryRead.go}    |    68 +-
 ...{LDataFrameAck.go => ApduDataMemoryResponse.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataMemoryWrite.go}   |    68 +-
 .../knxnetip/readwrite/model/ApduDataOther.go      |   163 +
 .../model/{LDataFrameAck.go => ApduDataRestart.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataUserMessage.go}   |    68 +-
 .../knxnetip/readwrite/model/ChannelInformation.go |   167 +
 .../plc4go/knxnetip/readwrite/model/ControlType.go |   109 -
 .../readwrite/model/DeviceDescriptorMediumType.go  |   123 +
 .../readwrite/model/DeviceDescriptorType0.go       |   476 +
 .../readwrite/model/DeviceDescriptorType2.go       |   371 +
 .../knxnetip/readwrite/model/ExtendedAPCI.go       |   368 -
 .../knxnetip/readwrite/model/FirmwareType.go       |   220 +
 .../knxnetip/readwrite/model/KnxDatapoint.go       | 13147 ++++++++++++++-----
 ...KnxDatapointType.go => KnxDatapointMainType.go} |   474 +-
 .../readwrite/model/KnxDatapointSubtype.go         |  5260 --------
 .../knxnetip/readwrite/model/KnxDatapointType.go   |  5492 +++++++-
 .../plc4go/knxnetip/readwrite/model/LBusmonInd.go  |     2 +-
 .../plc4go/knxnetip/readwrite/model/LDataFrame.go  |    63 +-
 .../knxnetip/readwrite/model/LDataFrameData.go     |   325 +-
 .../knxnetip/readwrite/model/LDataFrameDataExt.go  |   325 +-
 .../readwrite/model/LDataFramePollingData.go       |    11 +-
 .../plc4go/modbus/readwrite/ParserHelper.go        |     2 +-
 .../plc4go/modbus/readwrite/XmlParserHelper.go     |     2 +-
 .../internal/plc4go/s7/readwrite/ParserHelper.go   |     2 +-
 .../plc4go/s7/readwrite/XmlParserHelper.go         |     2 +-
 .../plc4x/java/knxnetip/ets5/Ets5Parser.java       |    10 +-
 .../java/knxnetip/ets5/model/GroupAddress.java     |     8 +-
 .../knxnetip/protocol/KnxNetIpProtocolLogic.java   |    92 +-
 .../resources/protocols/knxnetip/knxnetip.mspec    |  1496 +--
 protocols/knxnetip/src/main/xslt/knx-types.xsl     |   281 +-
 protocols/knxnetip/src/site/asciidoc/index.adoc    |   114 +-
 .../knxnetip/ParserSerializerTestsuite.xml         |    35 +-
 114 files changed, 23376 insertions(+), 15769 deletions(-)
 copy plc4go/internal/plc4go/knxnetip/{KnxNetIpWriter.go => KnxNetIpActiveReader.go} (51%)
 delete mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/Apdu.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControl.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduControlAck.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduControlConnect.go} (55%)
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlContainer.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduControlDisconnect.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduControlNack.go} (56%)
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataAdcRead.go} (56%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataAdcResponse.go} (55%)
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataContainer.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtAuthorizeRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtAuthorizeResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtDomainAddressRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtDomainAddressResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtDomainAddressSelectiveRead.go} (54%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtDomainAddressSerialNumberRead.go} (53%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtDomainAddressSerialNumberResponse.go} (52%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtDomainAddressSerialNumberWrite.go} (53%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtDomainAddressWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtFileStreamInfoReport.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtGroupPropertyValueInfoReport.go} (54%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtGroupPropertyValueRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtGroupPropertyValueResponse.go} (54%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtGroupPropertyValueWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtIndividualAddressSerialNumberRead.go} (52%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtIndividualAddressSerialNumberResponse.go} (51%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtIndividualAddressSerialNumberWrite.go} (52%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtKeyResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtKeyWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtLinkRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtLinkResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtLinkWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtMemoryBitWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtNetworkParameterRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtNetworkParameterResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtNetworkParameterWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtOpenRoutingTableRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtPropertyDescriptionRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtPropertyDescriptionResponse.go} (54%)
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueRead.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyValueResponse.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtPropertyValueWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtReadRouterMemoryRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtReadRouterMemoryResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtReadRouterStatusRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtReadRouterStatusResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtReadRoutingTableRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtReadRoutingTableResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtWriteRouterMemoryRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtWriteRouterStatusRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataExtWriteRoutingTableRequest.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataGroupValueRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataGroupValueResponse.go} (55%)
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataGroupValueWrite.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataIndividualAddressRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataIndividualAddressResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataIndividualAddressWrite.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataMemoryRead.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataMemoryResponse.go} (55%)
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataMemoryWrite.go} (55%)
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataOther.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataRestart.go} (56%)
 rename plc4go/internal/plc4go/knxnetip/readwrite/model/{LDataFrameAck.go => ApduDataUserMessage.go} (55%)
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ChannelInformation.go
 delete mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ControlType.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorMediumType.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorType0.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceDescriptorType2.go
 delete mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/ExtendedAPCI.go
 create mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/FirmwareType.go
 copy plc4go/internal/plc4go/knxnetip/readwrite/model/{KnxDatapointType.go => KnxDatapointMainType.go} (55%)
 delete mode 100644 plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapointSubtype.go


[plc4x] 02/07: - Added more documentation on KNX operations

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

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

commit 320cd6d9aabfeb7b54c1947464417514ed3f7937
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Jan 22 13:55:29 2021 +0100

    - Added more documentation on KNX operations
---
 protocols/knxnetip/src/site/asciidoc/index.adoc | 114 ++++++++++++++++++++++--
 1 file changed, 108 insertions(+), 6 deletions(-)

diff --git a/protocols/knxnetip/src/site/asciidoc/index.adoc b/protocols/knxnetip/src/site/asciidoc/index.adoc
index dda2161..4e7d603 100644
--- a/protocols/knxnetip/src/site/asciidoc/index.adoc
+++ b/protocols/knxnetip/src/site/asciidoc/index.adoc
@@ -21,18 +21,36 @@
 
 === Connection establishment
 
-
 [seqdiag,knx-connection]
 ....
 {
-    === Connect ===
+// Just added this in order to have the order of the columns right ...
+    "KNX Group Address (224.0.23.12)" <- "KNX Gateway" <- Client [label = "ignore this ..."]
 
-    Client -> "KNX Group Address (224.0.23.12)" [label = "Search Request"]
-    Client <- "KNX Gateway" [label = "Search Response"]
+    === Discover ===
+
+    "KNX Group Address (224.0.23.12)" <<-- Client [label = "Search Request"]
+    "KNX Gateway" -> Client [label = "Search Response"]
 
     Client -> "KNX Gateway" [label = "Description Request"]
     Client <- "KNX Gateway" [label = "Description Response"]
 
+    === Negotiate Parameters ===
+
+    Client -> "KNX Gateway" [label = "Config Connection Request"]
+    Client <- "KNX Gateway" [label = "Config Connection Response"]
+
+    Client -> "KNX Gateway" [label = "Property Read Request (Device Descriptor)"]
+    Client <- "KNX Gateway" [label = "Property Read Response (Device Descriptor)"]
+
+    Client -> "KNX Gateway" [label = "Property Read Request (Max APDU Length)"]
+    Client <- "KNX Gateway" [label = "Property Read Response (Max APDU Length)"]
+
+    Client -> "KNX Gateway" [label = "Disconnect Request"]
+    Client <- "KNX Gateway" [label = "Disconnect Response"]
+
+    === Connect ===
+
     Client -> "KNX Gateway" [label = "Connection Request"]
     Client <- "KNX Gateway" [label = "Connection Response"]
 
@@ -44,7 +62,7 @@
     === Data on the KNX Bus ===
 
     Client <- "KNX Gateway" [label = "Tunneling Request"]
-    Client -> "KNX Gateway" [label = "Tunneling Response"]
+    Client -> "KNX Gateway" [label = "Tunneling Ack"]
 
     === Disconnect ===
 
@@ -54,4 +72,88 @@
 }
 ....
 
-http://knxer.net/?p=78
\ No newline at end of file
+If we send a sear request to the pre-defined KNX broadcast address, normal KNXNet/IP Devices will respond.
+
+We then issue a description request in order to find out which capabilities the responding KNXNet/IP Device has. If it's a gateway and supports the tunneling service, we will try to connect to it.
+
+KNX seems to glue together a wide variety of differently functioning devices. In order to communicate with a given device, we first need to read the so-called device descriptor. Based on this information will we know how to interact with that device.
+
+NOTE: Please note that this device descriptor only applies to this particular device. This setting doesn't automatically apply to other devices in the KNX network.
+
+As soon as we know how to talk to the current device, we need to find out the maximum APDU size in order to be able to utilize the packets to the max.
+This will be the overall maximum size of APDU messages.
+
+NOTE: Please note that this max APDU only applies for the communication with the current device. Other devices in the KNX network might support other APDU sizes. However, keep in mind that even if a KNX device would support a larger message than the gateway we are not able to send bigger messages than the max APDU of the gateway.
+
+Now that we have all important information, we establish the actual tunneling connection, which will make us an official participant of the KNX network.
+
+We have to ensure at least every 60 seconds a message is exchanged, or the gateway will hang up. So in case of low activity, a heartbeat will be sent via "Connection State Request".
+
+As soon as we're finished communicating, the connection is terminated by actively sending a "Disconnect Request".
+
+=== Tunneling Mode
+
+As soon as the tunneling connection is established, we become part of the KNX bus, therefore the KNX gateway will forward all messages on the current segment of the KNX bus to us.
+
+In general most incoming messages will be so-called LData.ind messages containing GroupValueWrite messages. These are emitted by KNX devices if they are configured to send them upon events happening in the device.
+
+For example a KNX light-switch will send a GroupValueWrite indicating it was switched to "on" in order for the light actor to react on this and turn on the light. Similar if the thermostat sends a temperature change. The heating controller will use this in order to decide if he has to open the heating valve or not.
+
+[seqdiag,knx-tunneling]
+....
+{
+    "KNX Gateway" -> Client [label = "Tunnel Request (LData.ind)"]
+    "KNX Gateway" <- Client [label = "Tunnel Ack"]
+}
+....
+
+NOTE: Keep in mind, if we send messages to the KNX bus, these are sent to every bus participant. So we will also receive our request as well. This makes interactions appear overly complicated, but if you simply keep in mind this simple fact, it actually explains a lot.
+
+=== Read Property on KNX device
+
+In order to read a property on a device, we first need to connect to that device.
+
+At first this confused me a bit, as this connection wasn't assigned a connection identifier or anything similar, so it appeared as if it was just a formality.
+However, a KNX network can be partitioned into Areas and Lines. Filtering rules prevent flooding one segment with the message of another (unless it's explicitly configured to forward them by configuring the filter tables in the line- or area-connectors). I assume that the connection request will set up a temporary route to allow communication.
+
+I would even assume that this connection request isn't even processed on the targeted KNX device, but only by the routing devices involved.
+
+[seqdiag,knx-property-read]
+....
+{
+
+    === Connect ===
+
+    Client -> "KNX Gateway" [label = "Tunnel Request (LData.req (Connect)"]
+    Client <- "KNX Gateway" [label = "Tunnel Request (LData.con (Connect)"]
+
+    === Read Device Descriptor ===
+
+    Client -> "KNX Gateway" [label = "Tunnel Request (LData.req (Device Descriptor Read Request)"]
+    "KNX Gateway" -> "KNX Device" [label = "Tunnel Request (LData.con (Device Descriptor Read)"]
+    Client <- "KNX Gateway" [label = "Tunnel Request (LData.ind (ACK)"]
+    Client <- "KNX Gateway" <- "KNX Device" [label = "Tunnel Request (LData.ind (Device Descriptor Response)"]
+    Client -> "KNX Gateway" [label = "Tunnel Request (LData.ind (ACK)"]
+
+    === Read max APDU Length ===
+
+    Client -> "KNX Gateway" [label = "Tunnel Request (LData.req (Prop Value Read Request Obj=0 Prop=78)"]
+    Client <- "KNX Gateway" [label = "Tunnel Request (LData.ind (ACK)"]
+    "KNX Gateway" -> "KNX Device" [label = "Tunnel Request (LData.con (Prop Value Read Request Obj=0 Prop=78))"]
+    Client <- "KNX Gateway" <- "KNX Device" [label = "Tunnel Request (LData.ind (Prop Value Read Response)"]
+    Client -> "KNX Gateway" [label = "Tunnel Request (LData.ind (ACK)"]
+
+    === Read Property (Obj=?, Prop=?) ===
+
+    Client -> "KNX Gateway" [label = "Tunnel Request (LData.req (Prop Value Read Request Obj=? Prop=?)"]
+    Client <- "KNX Gateway" [label = "Tunnel Request (LData.ind (ACK)"]
+    "KNX Gateway" -> "KNX Device" [label = "Tunnel Request (LData.con (Prop Value Read Request Obj=? Prop=?))"]
+    Client <- "KNX Gateway" <- "KNX Device" [label = "Tunnel Request (LData.ind (Prop Value Read Response)"]
+    Client -> "KNX Gateway" [label = "Tunnel Request (LData.ind (ACK)"]
+
+}
+....
+
+So after connecting, the max APDU size the driver should use, would be "Min(Max APDU Gateway, Max APDU Device)". While reading of properties should be handled equally fo all devices, the availability of properties is highly dependent on the response of the Device Descriptor Read Request. This should be more important for internal workings of the driver.
+
+For example when Browsing a device there are great differences in the procedure of reading and processing the location and content of the "Group Address Table", "Association Table" and "ComObject Table".
\ No newline at end of file


[plc4x] 01/07: - Made the KNX driver return an error if the device we try to connect to doesn't support "tunneling"

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

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

commit 471873a71e30e1eb993a48f60ae006c3e3736913
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Jan 22 13:02:55 2021 +0100

    - Made the KNX driver return an error if the device we try to connect to doesn't support "tunneling"
---
 plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go
index 2439065..397337e 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go
@@ -304,6 +304,8 @@ func (m *KnxNetIpConnection) Connect() <-chan plc4go.PlcConnectionConnectResult
 							return nil
 						},
 						time.Second*1)
+				} else {
+					return errors.New("current device doesn't support tunneling")
 				}
 				return nil
 			},


[plc4x] 04/07: - Fixed a wrong package name

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

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

commit d32e91af824ecf6eb4032405f3b0e2f8752a94cc
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 24 12:52:06 2021 +0100

    - Fixed a wrong package name
---
 .../src/main/resources/templates/go/parser-factory-template.ftlh        | 2 +-
 .../src/main/resources/templates/go/xml-parser-factory-template.ftlh    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh
index b5bb914..c764a90 100644
--- a/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh
@@ -60,7 +60,7 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/P
 // specific language governing permissions and limitations
 // under the License.
 //
-package model
+package ${outputFlavor?replace("-","")}
 
 import (
     "errors"
diff --git a/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh
index 873c89f..a67a1fa 100644
--- a/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh
@@ -60,7 +60,7 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/X
 // specific language governing permissions and limitations
 // under the License.
 //
-package model
+package ${outputFlavor?replace("-","")}
 
 import (
     "encoding/xml"


[plc4x] 03/07: - Added stuff for decoding the KNX DeviceDescriptors

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

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

commit 191ecd22f8a72ae750ac2d4e9243655ef5ad5f3a
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Jan 22 13:56:03 2021 +0100

    - Added stuff for decoding the KNX DeviceDescriptors
---
 .../resources/protocols/knxnetip/knxnetip.mspec    | 89 ++++++++++++++++++++++
 1 file changed, 89 insertions(+)

diff --git a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index 55e9882..5686916 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -1677,4 +1677,93 @@
     ['0x37' RADIO_CONVERTER           ['enables_the_radio_transmission_of_a_meter_without_a_radio_interface',   'false']]
 ]
 
+// The definition of the constants for medium type in the device descriptor differs from that of the other parts
+// 03_05_01 Resources v01.09.03 AS.pdf Page 22
+[enum uint 4 DeviceDescriptorMediumType
+    ['0x0' TP1      ]
+    ['0x1' PL110    ]
+    ['0x2' RF       ]
+    ['0x3' TP0      ]
+    ['0x4' PL132    ]
+    ['0x5' KNX_IP   ]
+]
+
+// 03_05_01 Resources v01.09.03 AS.pdf Page 22
+[enum uint 8 FirmwareType
+    ['0xAF' NONE                      ]
+    ['0x00' BCU_1                     ]
+    ['0x01' BCU_1_SYSTEM_1            ]
+    ['0x02' BCU_2_SYSTEM_2            ]
+    ['0x70' BIM_M112                  ]
+    ['0x7B' SYSTEM_B                  ]
+    ['0x81' IR_DECODER                ]
+    ['0x90' MEDIA_COUPLER_PL_TP       ]
+    ['0x91' COUPLER                   ]
+    ['0x20' RF_BI_DIRECTIONAL_DEVICES ]
+    ['0x21' RF_UNI_DIRECTIONAL_DEVICES]
+    ['0x' SYSTEM_300                  ]
+    ['0x' SYSTEM_7                    ]
+]
+
+// Helper enum that binds the combinations of medium type and firmware
+// type to the pre-defined constants the spec defines
+// 03_05_01 Resources v01.09.03 AS.pdf Page 22
+[enum uint 16 'DeviceDescriptorType0'   [DeviceDescriptorMediumType 'mediumType',   FirmwareType 'firmwareType'               ]
+    ['0x0010' TP1_BCU_1_SYSTEM_1_0      ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    ['0x0011' TP1_BCU_1_SYSTEM_1_1      ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    ['0x0012' TP1_BCU_1_SYSTEM_1_2      ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    ['0x0013' TP1_BCU_1_SYSTEM_1_3      ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    ['0x0020' TP1_BCU_2_SYSTEM_2_0      ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BCU_2_SYSTEM_2'            ]]
+    ['0x0021' TP1_BCU_2_SYSTEM_2_1      ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BCU_2_SYSTEM_2'            ]]
+    ['0x0025' TP1_BCU_2_SYSTEM_2_5      ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BCU_2_SYSTEM_2'            ]]
+    ['0x0300' TP1_SYSTEM_300            ['DeviceDescriptorMediumType.TP1',          'FirmwareType.SYSTEM_300'                ]]
+    ['0x0700' TP1_BIM_M112_0            ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BIM_M112'                  ]]
+    ['0x0701' TP1_BIM_M112_1            ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BIM_M112'                  ]]
+    ['0x0705' TP1_BIM_M112_5            ['DeviceDescriptorMediumType.TP1',          'FirmwareType.BIM_M112'                  ]]
+    ['0x07B0' TP1_SYSTEM_B              ['DeviceDescriptorMediumType.TP1',          'FirmwareType.SYSTEM_B'                  ]]
+    ['0x0810' TP1_IR_DECODER_0          ['DeviceDescriptorMediumType.TP1',          'FirmwareType.IR_DECODER'                ]]
+    ['0x0811' TP1_IR_DECODER_1          ['DeviceDescriptorMediumType.TP1',          'FirmwareType.IR_DECODER'                ]]
+    ['0x0910' TP1_COUPLER_0             ['DeviceDescriptorMediumType.TP1',          'FirmwareType.COUPLER'                   ]]
+    ['0x0911' TP1_COUPLER_1             ['DeviceDescriptorMediumType.TP1',          'FirmwareType.COUPLER'                   ]]
+    ['0x0912' TP1_COUPLER_2             ['DeviceDescriptorMediumType.TP1',          'FirmwareType.COUPLER'                   ]]
+    ['0x091A' TP1_KNXNETIP_ROUTER       ['DeviceDescriptorMediumType.TP1',          'FirmwareType.COUPLER'                   ]]
+    ['0x0AFD' TP1_NONE_D                ['DeviceDescriptorMediumType.TP1',          'FirmwareType.NONE'                      ]]
+    ['0x0AFE' TP1_NONE_E                ['DeviceDescriptorMediumType.TP1',          'FirmwareType.NONE'                      ]]
+    ['0x1012' PL110_BCU_1_2             ['DeviceDescriptorMediumType.PL110',        'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    ['0x1013' PL110_BCU_1_3             ['DeviceDescriptorMediumType.PL110',        'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    ['0x17B0' PL110_SYSTEM_B            ['DeviceDescriptorMediumType.PL110',        'FirmwareType.SYSTEM_B'                  ]]
+    ['0x1900' PL110_MEDIA_COUPLER_PL_TP ['DeviceDescriptorMediumType.PL110',        'FirmwareType.MEDIA_COUPLER_PL_TP'       ]]
+    ['0x2010' RF_BI_DIRECTIONAL_DEVICES ['DeviceDescriptorMediumType.RF',           'FirmwareType.RF_BI_DIRECTIONAL_DEVICES' ]]
+    ['0x2110' RF_UNI_DIRECTIONAL_DEVICES['DeviceDescriptorMediumType.RF',           'FirmwareType.RF_UNI_DIRECTIONAL_DEVICES']]
+    // This should actually be BCU_1 and not BCU_1_SYSTEM_1, unfortunately the code seems to be different in this case
+    ['0x3012' TP0_BCU_1                 ['DeviceDescriptorMediumType.TP0',          'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    // This should actually be BCU_1 and not BCU_1_SYSTEM_1, unfortunately the code seems to be different in this case
+    ['0x4012' PL132_BCU_1               ['DeviceDescriptorMediumType.PL132',        'FirmwareType.BCU_1_SYSTEM_1'            ]]
+    // This should actually be SYSTEM7 and not BIM_M112, unfortunately the code seems to be the same in this case
+    ['0x5705' KNX_IP_SYSTEM7            ['DeviceDescriptorMediumType.KNX_IP',       'FirmwareType.BIM_M112'                  ]]
+]
+
+// 03_05_01 Resources v01.09.03 AS.pdf Page 23ff
+[type 'DeviceDescriptorType2'
+    // Same manufacturer id as used elsewhere (Assigned by KNX Association)
+    [simple uint 16            'manufacturerId' ]
+    // Manufacturer specific device type id
+    [simple uint 16            'deviceType'     ]
+    // Manufacturer specific device type version
+    [simple uint 8             'version'        ]
+    // Indicates the Network Management procedures based on A_Link_Read-service are supported
+    [simple bit                'readSupported'  ]
+    // Indicates the Network Management procedures based on A_Link_Write-service are supported
+    [simple bit                'writeSupported' ]
+    [simple uint 6             'logicalTagBase' ]
+    [simple ChannelInformation 'channelInfo1'   ]
+    [simple ChannelInformation 'channelInfo2'   ]
+    [simple ChannelInformation 'channelInfo3'   ]
+    [simple ChannelInformation 'channelInfo4'   ]
+]
 
+// 03_05_01 Resources v01.09.03 AS.pdf Page 24
+[type 'ChannelInformation'
+    [simple uint 3  'numChannels']
+    [simple uint 13 'channelCode']
+]
\ No newline at end of file


[plc4x] 05/07: - Replaced the manually created KnxDatatypes and DataIo with a fully generated version

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

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

commit ad6cc1d28eb87ad65bc6331a28fa29d317cafd21
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 24 12:52:59 2021 +0100

    - Replaced the manually created KnxDatatypes and DataIo with a fully generated version
---
 .../resources/protocols/knxnetip/knxnetip.mspec    | 1446 +++-----------------
 protocols/knxnetip/src/main/xslt/knx-types.xsl     |  261 +++-
 2 files changed, 474 insertions(+), 1233 deletions(-)

diff --git a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
index 5686916..620bc3c 100644
--- a/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
+++ b/protocols/knxnetip/src/main/resources/protocols/knxnetip/knxnetip.mspec
@@ -245,7 +245,7 @@
             [simple   uint 8                    'additionalInformationLength']
             [array    CEMIAdditionalInformation 'additionalInformation' length 'additionalInformationLength']
             [simple   LDataFrame                'dataFrame']
-            [optional uint 8                    'crc'                   'dataFrame.notAckFrame']
+            //[optional uint 8                    'crc'                   'dataFrame.notAckFrame']
         ]
 
         // Page 72ff
@@ -350,68 +350,226 @@
     [discriminator bit          'extendedFrame']
     [discriminator bit          'polling']
     [simple        bit          'repeated']
-    [discriminator bit          'notAckFrame']
+    [simple        bit          'notAckFrame']
     [enum          CEMIPriority 'priority']
     [simple        bit          'acknowledgeRequested']
     [simple        bit          'errorFlag']
-    [typeSwitch 'notAckFrame','extendedFrame','polling'
-        ['false' LDataFrameAck
-        ]
-        // Page 28ff
-        ['true','false','false' LDataFrameData
+    [typeSwitch 'extendedFrame','polling'
+       // Page 28ff
+        ['false','false' LDataFrameData
             [simple   KnxAddress   'sourceAddress']
             [array    int 8        'destinationAddress' count '2']
             [simple   bit          'groupAddress']
             [simple   uint 3       'hopCount']
-            [simple   uint 4       'dataLength']
-            // 10_01 Logical Tag Extended v01.02.01 AS.pdf Page 74ff
-            [simple   bit          'control']
-            [simple   bit          'numbered']
-            [simple   uint 4       'counter']
-            [optional ControlType  'controlType'   'control']
-            [optional APCI         'apci'          '!control']
-            // The 4 bit of APCI only allow 16 options, in order to extend, if APCI is set to 0xF
-            // the following 6 bit allow a bit more room for selection
-            [optional ExtendedAPCI 'extendedApci'  '!control && apci == APCI.OTHER_PDU']
-            // If the extended APCI is used, these 6 bits can't be used for data.
-            [optional int 6        'dataFirstByte' '!control && apci != APCI.OTHER_PDU']
-            [array    int 8        'data' count    '(dataLength < 1) ? 0 : dataLength - 1']
+            [simple   Apdu         'apdu']
+        ]
+        // Page 29ff
+        ['true','false' LDataFrameDataExt
+            [simple   bit          'groupAddress']
+            [simple   uint 3       'hopCount']
+            [simple   uint 4       'extendedFrameFormat']
+            [simple   KnxAddress   'sourceAddress']
+            [array    int 8        'destinationAddress' count '2']
+            [simple   Apdu         'apdu']
         ]
         // Page 31ff
-        ['true','true','true' LDataFramePollingData
+        ['true','true' LDataFramePollingData
             [simple   KnxAddress   'sourceAddress']
             [array    int 8        'targetAddress' count '2']
             [reserved uint 4       '0x00']
             [simple   uint 6       'numberExpectedPollData']
         ]
         // Page 31ff
-        ['true','false','true' LDataFramePollingData
+        ['false','true' LDataFramePollingData
             [simple   KnxAddress   'sourceAddress']
             [array    int 8        'targetAddress' count '2']
             [reserved uint 4       '0x00']
             [simple   uint 6       'numberExpectedPollData']
         ]
-        // Page 29ff
-        ['true','true','false' LDataFrameDataExt
-            [simple   bit          'groupAddress']
-            [simple   uint 3       'hopCount']
-            [simple   uint 4       'extendedFrameFormat']
-            [simple   KnxAddress   'sourceAddress']
-            [array    int 8        'destinationAddress' count '2']
-            [simple   uint 8       'dataLength']
-            // 10_01 Logical Tag Extended v01.02.01 AS.pdf Page 74ff
-            [simple   bit          'control']
-            [simple   bit          'numbered']
-            [simple   uint 4       'counter']
-            [optional ControlType  'controlType'   'control']
-            [optional APCI         'apci'          '!control']
-            // The 4 bit of APCI only allow 16 options, in order to extend, if APCI is set to 0xF
-            // the following 6 bit allow a bit more room for selection
-            [optional ExtendedAPCI 'extendedApci'  '!control && apci == APCI.OTHER_PDU']
-            // If the extended APCI is used, these 6 bits can't be used for data.
-            [optional int 6        'dataFirstByte' '!control && apci != APCI.OTHER_PDU']
-            [array    int 8        'data' count    '(dataLength < 1) ? 0 : dataLength - 1']
+    ]
+]
+
+[discriminatedType 'Apdu'
+    [simple   uint 8      'dataLength']
+    // 10_01 Logical Tag Extended v01.02.01 AS.pdf Page 74ff
+    [discriminator uint 1 'control']
+    [simple        bit    'numbered']
+    [simple        uint 4 'counter']
+    [typeSwitch 'control'
+        ['1' ApduControlContainer
+            [simple ApduControl 'controlApdu']
+        ]
+        ['0' ApduDataContainer [uint 8 'dataLength']
+            [simple ApduData 'dataApdu' ['dataLength']]
+        ]
+    ]
+]
+
+[discriminatedType 'ApduControl'
+    [discriminator uint 2 'controlType']
+    [typeSwitch 'controlType'
+        ['0x0' ApduControlConnect
+        ]
+        ['0x1' ApduControlDisconnect
+        ]
+        ['0x2' ApduControlAck
+        ]
+        ['0x3' ApduControlNack
+        ]
+    ]
+]
+
+[discriminatedType 'ApduData' [uint 8 'dataLength']
+    [discriminator uint 4 'apciType']
+    // 03_03_07 Application Layer v01.06.02 AS Page 9ff
+    [typeSwitch 'apciType'
+        ['0x0' ApduDataGroupValueRead
+        ]
+        ['0x1' ApduDataGroupValueResponse
+        ]
+        ['0x2' ApduDataGroupValueWrite [uint 8 'dataLength']
+            [simple int 6 'dataFirstByte']
+            [array  int 8 'data' count  '(dataLength < 1) ? 0 : dataLength - 1']
+        ]
+        ['0x3' ApduDataIndividualAddressWrite
+        ]
+        ['0x4' ApduDataIndividualAddressRead
+        ]
+        ['0x5' ApduDataIndividualAddressResponse
+        ]
+        ['0x6' ApduDataAdcRead
+        ]
+        // In case of this type the following 6 bits contain more detailed information
+        ['0x7' ApduDataAdcResponse
+        ]
+        ['0x8' ApduDataMemoryRead
+        ]
+        ['0x9' ApduDataMemoryResponse
+        ]
+        ['0xA' ApduDataMemoryWrite
+        ]
+        // In case of this type the following 6 bits contain more detailed information
+        ['0xB' ApduDataUserMessage
+        ]
+        ['0xC' ApduDataDeviceDescriptorRead
+        ]
+        ['0xD' ApduDataDeviceDescriptorResponse
+        ]
+        ['0xE' ApduDataRestart
+        ]
+        ['0xF' ApduDataOther [uint 8 'dataLength']
+            [simple ApduDataExt 'extendedApdu' ['dataLength']]
+        ]
+    ]
+]
+
+// 03_03_07 Application Layer v01.06.02 AS Page 9ff
+[discriminatedType 'ApduDataExt' [uint 8 'length']
+    [discriminator uint 8 'extApciType']
+    [typeSwitch 'extApciType'
+        ['0x00' ApduDataExtOpenRoutingTableRequest
+        ]
+        ['0x01' ApduDataExtReadRoutingTableRequest
+        ]
+        ['0x02' ApduDataExtReadRoutingTableResponse
+        ]
+        ['0x03' ApduDataExtWriteRoutingTableRequest
+        ]
+        ['0x08' ApduDataExtReadRouterMemoryRequest
+        ]
+        ['0x09' ApduDataExtReadRouterMemoryResponse
+        ]
+        ['0x0A' ApduDataExtWriteRouterMemoryRequest
+        ]
+        ['0x0D' ApduDataExtReadRouterStatusRequest
+        ]
+        ['0x0E' ApduDataExtReadRouterStatusResponse
+        ]
+        ['0x0F' ApduDataExtWriteRouterStatusRequest
+        ]
+
+        ['0x10' ApduDataExtMemoryBitWrite
+        ]
+
+        ['0x11' ApduDataExtAuthorizeRequest
+        ]
+        ['0x12' ApduDataExtAuthorizeResponse
         ]
+        ['0x13' ApduDataExtKeyWrite
+        ]
+        ['0x14' ApduDataExtKeyResponse
+        ]
+
+        ['0x15' ApduDataExtPropertyValueRead
+            [simple uint 8  'objectIndex']
+            [simple uint 8  'propertyId']
+            [simple uint 4  'count']
+            [simple uint 12 'index']
+        ]
+        ['0x16' ApduDataExtPropertyValueResponse [uint 8 'length']
+            [simple uint 8  'objectIndex']
+            [simple uint 8  'propertyId']
+            [simple uint 4  'count']
+            [simple uint 12 'index']
+            [array  uint 8 'data' count 'length - 5']
+        ]
+        ['0x17' ApduDataExtPropertyValueWrite
+        ]
+        ['0x18' ApduDataExtPropertyDescriptionRead
+        ]
+        ['0x19' ApduDataExtPropertyDescriptionResponse
+        ]
+
+        ['0x1A' ApduDataExtNetworkParameterRead
+        ]
+        ['0x1B' ApduDataExtNetworkParameterResponse
+        ]
+
+        ['0x1C' ApduDataExtIndividualAddressSerialNumberRead
+        ]
+        ['0x1D' ApduDataExtIndividualAddressSerialNumberResponse
+        ]
+        ['0x1E' ApduDataExtIndividualAddressSerialNumberWrite
+        ]
+
+        ['0x20' ApduDataExtDomainAddressWrite
+        ]
+        ['0x21' ApduDataExtDomainAddressRead
+        ]
+        ['0x22' ApduDataExtDomainAddressResponse
+        ]
+        ['0x23' ApduDataExtDomainAddressSelectiveRead
+        ]
+
+        ['0x24' ApduDataExtNetworkParameterWrite
+        ]
+
+        ['0x25' ApduDataExtLinkRead
+        ]
+        ['0x26' ApduDataExtLinkResponse
+        ]
+        ['0x27' ApduDataExtLinkWrite
+        ]
+
+        ['0x28' ApduDataExtGroupPropertyValueRead
+        ]
+        ['0x29' ApduDataExtGroupPropertyValueResponse
+        ]
+        ['0x2A' ApduDataExtGroupPropertyValueWrite
+        ]
+        ['0x2B' ApduDataExtGroupPropertyValueInfoReport
+        ]
+
+        ['0x2C' ApduDataExtDomainAddressSerialNumberRead
+        ]
+        ['0x2D' ApduDataExtDomainAddressSerialNumberResponse
+        ]
+        ['0x2E' ApduDataExtDomainAddressSerialNumberWrite
+        ]
+
+        ['0x30' ApduDataExtFileStreamInfoReport
+        ]
+
     ]
 ]
 
@@ -436,1086 +594,6 @@
     ]
 ]
 
-[dataIo 'KnxDatapoint' [string 'formatName']
-    [typeSwitch 'formatName'
-        ['B1' BOOL
-            [reserved uint 7 '0x0']
-            [simple   bit    'value']
-        ]
-        ['B2' Struct
-            [reserved uint 6 '0x0']
-            [simple   bit    'control']
-            [simple   bit    'value']
-        ]
-        ['B1U3' Struct
-            [reserved uint 4 '0x0']
-            [simple   bit    'control']
-            [simple   uint 3 'value']
-        ]
-        ['A8_ASCII' STRING
-            [reserved uint 8   '0x0']
-            [simple   string 8 'ASCII' 'value']
-        ]
-        ['A8_8859_1' STRING
-            [reserved uint 8   '0x0']
-            [simple   string 8 'ISO-8859-1' 'value']
-        ]
-        ['U8' USINT
-            [reserved uint 8   '0x0']
-            [simple   uint 8 'value']
-        ]
-        ['V8' SINT
-            [reserved uint 8   '0x0']
-            [simple   int 8 'value']
-        ]
-        // TODO value should actually be an enum ...
-        ['B5N3' Struct
-            [reserved uint 3 '0x0']
-            [simple   bit    'a']
-            [simple   bit    'b']
-            [simple   bit    'c']
-            [simple   bit    'd']
-            [simple   bit    'e']
-            [simple   int 8  'value']
-        ]
-        ['U16' UINT
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'value']
-        ]
-        ['V16' INT
-            [reserved uint 8  '0x0']
-            [simple   int 16 'value']
-        ]
-        ['F16' REAL
-            [reserved uint 8     '0x0']
-            [simple   float 4.11 'value']
-        ]
-        // TODO Not sure how to encode the day in this
-        ['N3N5r2N6r2N6' TIME_OF_DAY
-            [reserved uint 8 '0x0']
-            [simple   uint 3 'day']
-            [simple   uint 5 'hour']
-            [reserved uint 2 '0x00']
-            [simple   uint 6 'minutes']
-            [reserved uint 2 '0x00']
-            [simple   uint 6 'seconds']
-        ]
-        ['r3N5r4N4r1U7' DATE
-            [reserved uint 3 '0x00']
-            [simple   uint 5 'day']
-            [reserved uint 4 '0x00']
-            [reserved uint 4 '0x00']
-            [simple   uint 4 'month']
-            [reserved uint 1 '0x00']
-            [simple   uint 7 'year']
-        ]
-        ['U32' UDINT
-            [reserved uint 8  '0x0']
-            [simple   uint 32 'value']
-        ]
-        ['V32' DINT
-            [reserved uint 8  '0x0']
-            [simple   int 32 'value']
-        ]
-        ['F32' REAL
-            [reserved uint 8     '0x0']
-            [simple   float 8.23 'value']
-        ]
-        ['U4U4U4U4U4U4B4N4' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 4 'd6']
-            [simple   uint 4 'd5']
-            [simple   uint 4 'd4']
-            [simple   uint 4 'd3']
-            [simple   uint 4 'd2']
-            [simple   uint 4 'd1']
-            [simple   bit    'e']
-            [simple   bit    'p']
-            [simple   bit    'd']
-            [simple   bit    'c']
-            [simple   uint 4 'index']
-        ]
-        ['A112_ASCII' STRING
-            [reserved uint 8  '0x0']
-            [simple   string 112 'ASCII' 'value']
-        ]
-        ['A112_8859_1' STRING
-            [reserved uint 8  '0x0']
-            [simple   string 112 'ISO-8859-1' 'value']
-        ]
-        ['r2U6' USINT
-            [reserved uint 2 '0x00']
-            [simple   uint 6 'value']
-        ]
-        ['B1r1U6' Struct
-            [reserved uint 8  '0x0']
-            [simple   bit    'learn']
-            [reserved uint 1 '0x00']
-            [simple   uint 6 'sceneNumber']
-        ]
-        ['U8r4U4r3U5U3U5r2U6r2U6B16' DATE_AND_TIME
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'year']
-            [reserved uint 4 '0x00']
-            [simple   uint 4 'month']
-            [reserved uint 3 '0x00']
-            [simple   uint 5 'day']
-            [simple   uint 3 'dayOfWeek']
-            [simple   uint 5 'hour']
-            [reserved uint 2 '0x00']
-            [simple   uint 6 'minutes']
-            [reserved uint 2 '0x00']
-            [simple   uint 6 'seconds']
-            [simple   bit    'fault']
-            [simple   bit    'workingDay']
-            [simple   bit    'noWorkingDay']
-            [simple   bit    'noYear']
-            [simple   bit    'noMonthAndDay']
-            [simple   bit    'noDayOfWeek']
-            [simple   bit    'noTime']
-            [simple   bit    'standardSummerTime']
-            [simple   bit    'clockWithSyncSignal']
-        ]
-        // TODO This should actually be enums depending on their type
-        ['N8' USINT
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'value']
-        ]
-        ['B8' BYTE
-            [reserved uint 8  '0x0']
-            [simple uint 8 'value']
-        ]
-        ['B16' WORD
-            [reserved uint 8  '0x0']
-            [simple uint 16 'value']
-        ]
-        // TODO Probably should be a 2-bit unsigned plc-value
-        // TODO value should actually be enums depending on their type
-        ['N2' USINT
-            [reserved uint 6 '0x00']
-            [simple   uint 2 'value']
-        ]
-        ['An_8859_1' STRING
-            [reserved uint 8  '0x0']
-            // TODO: Implement this field
-            //[manual string 8 'ISO-8859-1' 'value' '' '' '']
-        ]
-        ['U4U4' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 4 'busy']
-            [simple   uint 4 'nak']
-        ]
-        ['r1b1U6' Struct
-            [reserved uint 8  '0x0']
-            [reserved uint 1 '0x00']
-            [simple   bit    'sceneActive']
-            [simple   uint 6 'sceneNumber']
-        ]
-        ['B32' DWORD
-            [reserved uint 8  '0x0']
-            [simple uint 32 'value']
-        ]
-        // TODO UTF-8 chars can be two type values. probably better to do a "manual" element
-        ['An_UTF_8' STRING
-            [reserved uint 8  '0x0']
-            // TODO: Implement this field
-            //[manual string 8 'UTF-8' 'value' '' '' '']
-        ]
-        ['V64' LINT
-            [reserved uint 8  '0x0']
-            [simple int 64 'value']
-        ]
-        ['B24' List
-            [reserved uint 8  '0x0']
-            [array bit 'value' count '24']
-        ]
-        // TODO Probably should be a 3-bit unsigned plc-value
-        // TODO value should actually be enums depending on their type
-        ['N3' USINT
-            [reserved uint 5 '0x00']
-            [simple   uint 3 'value']
-        ]
-        ['B1Z8HeatingOrCoolingZ' Struct
-            [reserved uint 7 '0x00']
-            [simple   bit    'heating']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['B1Z8BinaryValueZ' Struct
-            [reserved uint 7 '0x00']
-            [simple   bit    'high']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['N8Z8HvacOperatingMode' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'hvacOperatingMode']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['N8Z8DhwMode' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'dhwMode']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['N8Z8HvacControllingMode' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'hvacControllingMode']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['N8Z8EnableHeatingOrCoolingStage' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'enableHeatingOrCoolingStage']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['N8Z8BuildingMode' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'buildingMode']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['N8Z8OccupancyMode' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'occupancyMode']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['N8Z8EmergencyMode' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'hvacEmergencyMode']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['U8Z8Rel' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'relValue']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['U8Z8Counter' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'counterValue']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['U16Z8TimePeriod' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'timePeriod']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8FlowRate' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'flowRate']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8Counter' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'counterValue']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8ElectricCurrent' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'electricalCurrent']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8Power' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'power']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8AtmPressure' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'atmPressure']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8PercentValue' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'percentValue']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8HvacAirQuality' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'ppmResolution']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8WindSpeed' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'windSpeed']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8SunIntensity' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'sunIntensity']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16Z8HvacAirFlow' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'airFlow']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['V8Z8RelSignedValue' Struct
-            [reserved uint 8  '0x0']
-            [simple   int 8  'relSignedValue']
-            [simple   uint 8 'statusCommand']
-        ]
-        ['V16Z8DeltaTime' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  16 'deltaTime']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['V16Z8RelSignedValue' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  16 'relSignedValue']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U16N8HvacModeAndTimeDelay' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16   'delayTime']
-            [simple   uint 8    'hvacMode']
-        ]
-        ['U16N8DhwModeAndTimeDelay' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16   'delayTime']
-            [simple   uint 8    'dhwMode']
-        ]
-        ['U16N8OccupancyModeAndTimeDelay' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16   'delayTime']
-            [simple   uint 8    'occupationMode']
-        ]
-        ['U16N8BuildingModeAndTimeDelay' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16   'delayTime']
-            [simple   uint 8    'buildingMode']
-        ]
-        ['U8B8StatusBurnerController' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8    'actualRelativePower']
-            [reserved uint 4    '0x00']
-            [simple   bit       'stage2Active']
-            [simple   bit       'stage1Active']
-            [simple   bit       'failure']
-            [simple   bit       'actualRelativePowerValid']
-        ]
-        ['U8B8LockingSignal' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8    'requestedPowerReduction']
-            [reserved uint 6    '0x00']
-            [simple   bit       'critical']
-            [simple   bit       'requestedPowerReductionValid']
-        ]
-        ['U8B8BoilerControllerDemandSignal' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8    'relativeDemand']
-            [reserved uint 6    '0x00']
-            [simple   bit       'controlsOperationStage2']
-            [simple   bit       'controlsOperationStage1']
-        ]
-        ['U8B8ActuatorPositionDemand' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8    'actuatorPositionDemand']
-            [reserved uint 4    '0x00']
-            [simple   bit       'emergencyDemand']
-            [simple   bit       'shiftLoadPriority']
-            [simple   bit       'absoluteLoadPriority']
-            [simple   bit       'actuatorPositionDemandValid']
-        ]
-        ['U8B8ActuatorPositionStatus' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8    'actualActuatorPosition']
-            [reserved uint 3    '0x00']
-            [simple   bit       'synchronizationMode']
-            [simple   bit       'valveKick']
-            [simple   bit       'callibrationMode']
-            [simple   bit       'positionManuallyOverridden']
-            [simple   bit       'failure']
-        ]
-        ['U8B8StatusLightingActuator' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8    'lightingLevel']
-            [simple   bit       'failure']
-            [simple   bit       'localOverride']
-            [simple   bit       'dimming']
-            [simple   bit       'staircaseLightingFunction']
-            [simple   bit       'nightMode']
-            [simple   bit       'forced']
-            [simple   bit       'locked']
-            [simple   bit       'lightingLevelValid']
-        ]
-        ['V16B8HeatProducerManagerStatus' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'tempFlowProdSegmH']
-            [reserved uint 3     '0x00']
-            [simple   bit        'temporarilyOff']
-            [simple   bit        'permanentlyOff']
-            [simple   bit        'switchedOffSummerMode']
-            [simple   bit        'failure']
-            [simple   bit        'tempFlowProdSegmHValid']
-        ]
-        ['V16B8RoomTemperatureDemand' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'roomTemperatureDemand']
-            [reserved uint 4     '0x00']
-            [simple   bit        'emergencyDemand']
-            [simple   bit        'shiftLoadPriority']
-            [simple   bit        'absoluteLoadPriority']
-            [simple   bit        'roomTemperatureDemandValid']
-        ]
-        ['V16B8ColdWaterProducerManagerStatus' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'flowTemperatureProdSegmC']
-            [reserved uint 4     '0x00']
-            [simple   bit        'temporarilyOff']
-            [simple   bit        'permanentlyOff']
-            [simple   bit        'failure']
-            [simple   bit        'flowTemperatureProdSegmCValid']
-        ]
-        ['V16B8WaterTemperatureControllerStatus' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'actualTemperature']
-            [reserved uint 5     '0x00']
-            [simple   bit        'controllerWorking']
-            [simple   bit        'failure']
-            [simple   bit        'actualTemperatureValid']
-        ]
-        ['V16B16' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'flowTemperatureDemand']
-            [reserved uint 4     '0x00']
-            [simple   bit        'demandFromDhwWhileLegionellaFunctionIsActive']
-            [simple   bit        'emergencyDemandForFrostProtection']
-            [simple   bit        'requestForWaterCirculationInPrimaryDistributionSegment']
-            [simple   bit        'demandFromAuxillaryHeatOrCoolConsumer']
-            [simple   bit        'demandFromVentilation']
-            [simple   bit        'demandForRoomHeatingOrCooling']
-            [simple   bit        'heatDemandFromDhw']
-            [simple   bit        'flowTemperatureDemandIsMin']
-            [simple   bit        'flowTemperatureDemandIsMax']
-            [simple   bit        'shiftLoadPriority']
-            [simple   bit        'absoluteLoadPriority']
-            [simple   bit        'flowTemperatureDemandValid']
-        ]
-        ['U8N8' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8  'energyDemand']
-            [simple   uint 8  'actualControllerMode']
-        ]
-        ['V16V16V16RoomTemperature' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'temperatureSetpointComfort']
-            [simple   float 4.11 'temperatureSetpointStandby']
-            [simple   float 4.11 'temperatureSetpointEco']
-        ]
-        ['V16V16V16RoomTemperatureShift' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'temperatureSetpointShiftComfort']
-            [simple   float 4.11 'temperatureSetpointShiftStandby']
-            [simple   float 4.11 'temperatureSetpointShiftEco']
-        ]
-        ['V16V16V16V16RoomTemperature' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'temperatureSetpointComfort']
-            [simple   float 4.11 'temperatureSetpointStandby']
-            [simple   float 4.11 'temperatureSetpointEco']
-            [simple   float 4.11 'temperatureSetpointBProt']
-        ]
-        ['V16V16V16V16DhwtTemperature' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'temperatureSetpointLegioProtect']
-            [simple   float 4.11 'temperatureSetpointNormal']
-            [simple   float 4.11 'temperatureSetpointReduced']
-            [simple   float 4.11 'temperatureSetpointFrostProtect']
-        ]
-        ['V16V16V16V16RoomTemperatureShift' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'temperatureSetpointShiftComfort']
-            [simple   float 4.11 'temperatureSetpointShiftStandby']
-            [simple   float 4.11 'temperatureSetpointShiftEco']
-            [simple   float 4.11 'temperatureSetpointShiftBProt']
-        ]
-        ['V16U8B8Heat' Struct
-            [reserved uint 8  '0x0']
-            [simple   int 16  'flowTemperatureDemand']
-            [simple   uint 8  'relativePower']
-            [reserved uint 2  '0x00']
-            [simple   bit     'boilerEnabled']
-            [simple   bit     'stage2Forced']
-            [simple   bit     'stage2Enabled']
-            [simple   bit     'stage1Forced']
-            [simple   bit     'stage1Enabled']
-            [simple   bit     'flowTemperatureDemandValid']
-        ]
-        ['V16U8B8ChilledWater' Struct
-            [reserved uint 8  '0x0']
-            [simple   int 16  'chilledWaterFlowTemperatureDemand']
-            [simple   uint 8  'relativePower']
-            [reserved uint 5  '0x00']
-            [simple   bit     'chilledWaterPumpEnabled']
-            [simple   bit     'relativePowerValid']
-            [simple   bit     'chilledWaterFlowTemperatureDemandValid']
-        ]
-        ['V16U8B16Boiler' Struct
-            [reserved uint 8  '0x0']
-            [simple   int 16  'tempBoiler']
-            [simple   uint 8  'relativePower']
-            [reserved uint 4  '0x00']
-            [simple   bit     'chimneySweepFunctionActive']
-            [simple   bit     'reducedAvailability']
-            [simple   bit     'powerLimitBoilerReached']
-            [simple   bit     'powerLimitStage1Reached']
-            [simple   bit     'stage2Enabled']
-            [simple   bit     'stage1Enabled']
-            [simple   bit     'boilerTemporarilyNotProvidingHeat']
-            [simple   bit     'permanentlyOff']
-            [simple   bit     'boilerSwitchedOffWinterSummerMode']
-            [simple   bit     'boilerFailure']
-            [simple   bit     'relativePowerValid']
-            [simple   bit     'tempBoilerValid']
-        ]
-        ['V16U8B16Chiller' Struct
-            [reserved uint 8  '0x0']
-            [simple   int 16  'tempChiller']
-            [simple   uint 8  'relativePower']
-            [reserved uint 8  '0x00']
-            [simple   bit     'reducedAvailability']
-            [simple   bit     'powerLimitChillerReached']
-            [simple   bit     'powerLimitCurrentStageReached']
-            [simple   bit     'permanentlyOff']
-            [simple   bit     'chillerFailure']
-            [simple   bit     'chillerRunningStatus']
-            [simple   bit     'relativePowerValid']
-            [simple   bit     'tempChillerValid']
-        ]
-        ['U16U8N8B8' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'nominalPower']
-            [simple   uint 8  'relativePowerLimit']
-            [simple   int  8  'burnerType']
-            [reserved uint 5  '0x00']
-            [simple   bit     'solidState']
-            [simple   bit     'gas']
-            [simple   bit     'oil']
-        ]
-        ['U5U5U6' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 5 'magicNumber']
-            [simple   uint 5 'versionNumber']
-            [simple   uint 6 'revisionNumber']
-        ]
-        ['V32Z8VolumeLiter' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  32 'volumeLiter']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['V32Z8FlowRate' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  32 'flowRate']
-            [simple   uint 8  'statusCommand']
-        ]
-        ['U8N8N8N8B8B8' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8 'logNumber']
-            [simple   uint 8 'alarmPriority']
-            [simple   uint 8 'applicationArea']
-            [simple   uint 8 'errorClass']
-            [reserved uint 4 '0x00']
-            [simple   bit    'errorCode_Sup']
-            [simple   bit    'alarmText_Sup']
-            [simple   bit    'timeStamp_Sup']
-            [simple   bit    'ack_Sup']
-            [reserved uint 5 '0x00']
-            [simple   bit    'alarmUnAck']
-            [simple   bit    'locked']
-            [simple   bit    'inAlarm']
-        ]
-        ['U16V16' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'delayTime']
-            [simple   int  16 'temperature']
-        ]
-        ['N16U32' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'manufacturerCode']
-            [simple   uint 32 'incrementedNumber']
-        ]
-        ['F16F16F16' Struct
-            [reserved uint 8  '0x0']
-            [simple   float 4.11 'temperatureSetpointComfort']
-            [simple   float 4.11 'temperatureSetpointShiftStandby']
-            [simple   float 4.11 'temperatureSetpointShiftEco']
-        ]
-        ['V8N8N8' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  8  'energyDemand']
-            [simple   uint 8  'hvacControllerMode']
-            [simple   uint 8  'hvacEmergencyMode']
-        ]
-        ['V16V16N8N8' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  16 'tempSetpointCooling']
-            [simple   int  16 'tempSetpointHeating']
-            [simple   uint 8  'hvacControllerMode']
-            [simple   uint 8  'hvacEmergencyMode']
-        ]
-        ['U16U8Scaling' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'timePeriod']
-            [simple   uint 8  'percent']
-        ]
-        ['U16U8TariffNext' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'delayTime']
-            [simple   uint 8  'tariff']
-        ]
-        ['V32N8Z8' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  32 'countVal']
-            [simple   uint 8  'valInfField']
-            [simple   uint 8  'statusOrCommand']
-        ]
-        ['U16U32U8N8' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 16 'manufacturerId']
-            [simple   uint 32 'identNumber']
-            [simple   uint 8  'version']
-            [simple   uint 8  'medium']
-        ]
-        ['A8A8A8A8' Struct
-            [reserved uint 8  '0x0']
-            [simple   string 16 'ASCII' 'languageCode']
-            [simple   string 16 'ASCII' 'regionCode']
-        ]
-        ['U8U8U8' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8  'red']
-            [simple   uint 8  'green']
-            [simple   uint 8  'blue']
-        ]
-        ['A8A8Language' Struct
-            [reserved uint 8  '0x0']
-            [simple   string 16 'ASCII' 'languageCode']
-        ]
-        ['A8A8Region' Struct
-            [reserved uint 8  '0x0']
-            [simple   string 16 'ASCII' 'regionCode']
-        ]
-        ['V32U8B8' Struct
-            [reserved uint 8  '0x0']
-            [simple   int  32 'activeElectricalEnergy']
-            [simple   uint 8  'tariff']
-            [reserved uint 6  '0x00']
-            [simple   bit     'noTariff']
-            [simple   bit     'noActiveElectricalEnergy']
-        ]
-        ['B1N3N4' Struct
-            [reserved uint 8  '0x0']
-            [simple   bit     'deactivationOfPriority']
-            [simple   uint 3  'priorityLevel']
-            [simple   uint 4  'modeLevel']
-        ]
-        ['B10U6' Struct
-            [reserved uint 5  '0x00']
-            [simple   bit     'convertorError']
-            [simple   bit     'ballastFailure']
-            [simple   bit     'lampError']
-            [simple   bit     'read']
-            [simple   bit     'groupAddress']
-            [simple   uint 6  'address']
-        ]
-        ['B2U6' Struct
-            [reserved uint 8  '0x0']
-            [simple   bit     'sceneActivationInactive']
-            [simple   bit     'storageFunctionDisable']
-            [simple   uint 6  'sceneNumber']
-        ]
-        ['U8r7B1' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8  'setValue']
-            [reserved uint 7  '0x00']
-            [simple   bit     'channelActivationActive']
-        ]
-        ['U8U8B8' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8  'heightPosition']
-            [simple   uint 8  'slatsPosition']
-            [reserved uint 6  '0x00']
-            [simple   bit     'validSlatsPos']
-            [simple   bit     'validHeightPos']
-        ]
-        ['U8U8B16' Struct
-            [reserved uint 8  '0x0']
-            [simple   uint 8  'heightPosition']
-            [simple   uint 8  'slatsPosition']
-            [simple   bit     'validSlatsPos']
-            [simple   bit     'validHeightPos']
-            [reserved uint 3  '0x00']
-            [simple   bit     'failure']
-            [simple   bit     'localOverride']
-            [simple   bit     'locked']
-            [simple   bit     'forced']
-            [simple   bit     'weatherAlarm']
-            [simple   bit     'targetSPosRestrict']
-            [simple   bit     'targetHPosRestrict']
-            [simple   bit     'driveState']
-            [simple   bit     'lowerPredefPos']
-            [simple   bit     'lowerEndPos']
-            [simple   bit     'upperEndPos']
-        ]
-    ]
-]
-
-[enum string 'KnxDatapointType' [uint 10 'mainNumber', uint 10 'subNumber', string 'formatName']
-    ['DPT_Switch'                               DPT_Switch                             ['1',   '1',    'B1']]
-    ['DPT_Bool'                                 DPT_Bool                               ['1',   '2',    'B1']]
-    ['DPT_Enable'                               DPT_Enable                             ['1',   '3',    'B1']]
-    ['DPT_Ramp'                                 DPT_Ramp                               ['1',   '4',    'B1']]
-    ['DPT_Alarm'                                DPT_Alarm                              ['1',   '5',    'B1']]
-    ['DPT_BinaryValue'                          DPT_BinaryValue                        ['1',   '6',    'B1']]
-    ['DPT_Step'                                 DPT_Step                               ['1',   '7',    'B1']]
-    ['DPT_UpDown'                               DPT_UpDown                             ['1',   '8',    'B1']]
-    ['DPT_OpenClose'                            DPT_OpenClose                          ['1',   '9',    'B1']]
-    ['DPT_Start'                                DPT_Start                              ['1',   '10',   'B1']]
-    ['DPT_State'                                DPT_State                              ['1',   '11',   'B1']]
-    ['DPT_Invert'                               DPT_Invert                             ['1',   '12',   'B1']]
-    ['DPT_DimSendStyle'                         DPT_DimSendStyle                       ['1',   '13',   'B1']]
-    ['DPT_InputSource'                          DPT_InputSource                        ['1',   '14',   'B1']]
-    ['DPT_Reset'                                DPT_Reset                              ['1',   '15',   'B1']]
-    ['DPT_Ack'                                  DPT_Ack                                ['1',   '16',   'B1']]
-    ['DPT_Trigger'                              DPT_Trigger                            ['1',   '17',   'B1']]
-    ['DPT_Occupancy'                            DPT_Occupancy                          ['1',   '18',   'B1']]
-    ['DPT_Window_Door'                          DPT_Window_Door                        ['1',   '19',   'B1']]
-    ['DPT_LogicalFunction'                      DPT_LogicalFunction                    ['1',   '21',   'B1']]
-    ['DPT_Scene_AB'                             DPT_Scene_AB                           ['1',   '22',   'B1']]
-    ['DPT_ShutterBlinds_Mode'                   DPT_ShutterBlinds_Mode                 ['1',   '23',   'B1']]
-    ['DPT_Heat_Cool'                            DPT_Heat_Cool                          ['1',   '100',  'B1']]
-    ['DPT_Switch_Control'                       DPT_Switch_Control                     ['2',   '1',    'B2']]
-    ['DPT_Bool_Control'                         DPT_Bool_Control                       ['2',   '2',    'B2']]
-    ['DPT_Enable_Control'                       DPT_Enable_Control                     ['2',   '3',    'B2']]
-    ['DPT_Ramp_Control'                         DPT_Ramp_Control                       ['2',   '4',    'B2']]
-    ['DPT_Alarm_Control'                        DPT_Alarm_Control                      ['2',   '5',    'B2']]
-    ['DPT_BinaryValue_Control'                  DPT_BinaryValue_Control                ['2',   '6',    'B2']]
-    ['DPT_Step_Control'                         DPT_Step_Control                       ['2',   '7',    'B2']]
-    ['DPT_Direction1_Control'                   DPT_Direction1_Control                 ['2',   '8',    'B2']]
-    ['DPT_Direction2_Control'                   DPT_Direction2_Control                 ['2',   '9',    'B2']]
-    ['DPT_Start_Control'                        DPT_Start_Control                      ['2',   '10',   'B2']]
-    ['DPT_State_Control'                        DPT_State_Control                      ['2',   '11',   'B2']]
-    ['DPT_Invert_Control'                       DPT_Invert_Control                     ['2',   '12',   'B2']]
-    ['DPT_Control_Dimming'                      DPT_Control_Dimming                    ['3',   '7',    'B1U3']]
-    ['DPT_Control_Blinds'                       DPT_Control_Blinds                     ['3',   '8',    'B1U3']]
-    ['DPT_Char_ASCII'                           DPT_Char_ASCII                         ['4',   '1',    'A8_ASCII']]
-    ['DPT_Char_8859_1'                          DPT_Char_8859_1                        ['4',   '2',    'A8_8859_1']]
-    ['DPT_Scaling'                              DPT_Scaling                            ['5',   '1',    'U8']]
-    ['DPT_Angle'                                DPT_Angle                              ['5',   '3',    'U8']]
-    ['DPT_Percent_U8'                           DPT_Percent_U8                         ['5',   '4',    'U8']]
-    ['DPT_DecimalFactor'                        DPT_DecimalFactor                      ['5',   '5',    'U8']]
-    ['DPT_Tariff'                               DPT_Tariff                             ['5',   '6',    'U8']]
-    ['DPT_Value_1_Ucount'                       DPT_Value_1_Ucount                     ['5',   '10',   'U8']]
-    ['DPT_Percent_V8'                           DPT_Percent_V8                         ['6',   '1',    'V8']]
-    ['DPT_Value_1_Count'                        DPT_Value_1_Count                      ['6',   '10',   'V8']]
-    ['DPT_Status_Mode3'                         DPT_Status_Mode3                       ['6',   '20',   'B5N3']]
-    ['DPT_Value_2_Ucount'                       DPT_Value_2_Ucount                     ['7',   '1',    'U16']]
-    ['DPT_TimePeriodMsec'                       DPT_TimePeriodMsec                     ['7',   '2',    'U16']]
-    ['DPT_TimePeriod10MSec'                     DPT_TimePeriod10MSec                   ['7',   '3',    'U16']]
-    ['DPT_TimePeriod100MSec'                    DPT_TimePeriod100MSec                  ['7',   '4',    'U16']]
-    ['DPT_TimePeriodSec'                        DPT_TimePeriodSec                      ['7',   '5',    'U16']]
-    ['DPT_TimePeriodMin'                        DPT_TimePeriodMin                      ['7',   '6',    'U16']]
-    ['DPT_TimePeriodHrs'                        DPT_TimePeriodHrs                      ['7',   '7',    'U16']]
-    ['DPT_PropDataType'                         DPT_PropDataType                       ['7',   '10',   'U16']]
-    ['DPT_Length_mm'                            DPT_Length_mm                          ['7',   '11',   'U16']]
-    ['DPT_UElCurrentmA'                         DPT_UElCurrentmA                       ['7',   '12',   'U16']]
-    ['DPT_Brightness'                           DPT_Brightness                         ['7',   '13',   'U16']]
-    ['DPT_Value_2_Count'                        DPT_Value_2_Count                      ['8',   '1',    'V16']]
-    ['DPT_DeltaTimeMsec'                        DPT_DeltaTimeMsec                      ['8',   '2',    'V16']]
-    ['DPT_DeltaTime10MSec'                      DPT_DeltaTime10MSec                    ['8',   '3',    'V16']]
-    ['DPT_DeltaTime100MSec'                     DPT_DeltaTime100MSec                   ['8',   '4',    'V16']]
-    ['DPT_DeltaTimeSec'                         DPT_DeltaTimeSec                       ['8',   '5',    'V16']]
-    ['DPT_DeltaTimeMin'                         DPT_DeltaTimeMin                       ['8',   '6',    'V16']]
-    ['DPT_DeltaTimeHrs'                         DPT_DeltaTimeHrs                       ['8',   '7',    'V16']]
-    ['DPT_Percent_V16'                          DPT_Percent_V16                        ['8',   '10',   'V16']]
-    ['DPT_Rotation_Angle'                       DPT_Rotation_Angle                     ['8',   '11',   'V16']]
-    ['DPT_Value_Temp'                           DPT_Value_Temp                         ['9',   '1',    'F16']]
-    ['DPT_Value_Tempd'                          DPT_Value_Tempd                        ['9',   '2',    'F16']]
-    ['DPT_Value_Tempa'                          DPT_Value_Tempa                        ['9',   '3',    'F16']]
-    ['DPT_Value_Lux'                            DPT_Value_Lux                          ['9',   '4',    'F16']]
-    ['DPT_Value_Wsp'                            DPT_Value_Wsp                          ['9',   '5',    'F16']]
-    ['DPT_Value_Pres'                           DPT_Value_Pres                         ['9',   '6',    'F16']]
-    ['DPT_Value_Humidity'                       DPT_Value_Humidity                     ['9',   '7',    'F16']]
-    ['DPT_Value_AirQuality'                     DPT_Value_AirQuality                   ['9',   '8',    'F16']]
-    ['DPT_Value_Time1'                          DPT_Value_Time1                        ['9',   '10',   'F16']]
-    ['DPT_Value_Time2'                          DPT_Value_Time2                        ['9',   '11',   'F16']]
-    ['DPT_Value_Volt'                           DPT_Value_Volt                         ['9',   '20',   'F16']]
-    ['DPT_Value_Curr'                           DPT_Value_Curr                         ['9',   '21',   'F16']]
-    ['DPT_PowerDensity'                         DPT_PowerDensity                       ['9',   '22',   'F16']]
-    ['DPT_KelvinPerPercent'                     DPT_KelvinPerPercent                   ['9',   '23',   'F16']]
-    ['DPT_Power'                                DPT_Power                              ['9',   '24',   'F16']]
-    ['DPT_Value_Volume_Flow'                    DPT_Value_Volume_Flow                  ['9',   '25',   'F16']]
-    ['DPT_Rain_Amount'                          DPT_Rain_Amount                        ['9',   '26',   'F16']]
-    ['DPT_Value_Temp_F'                         DPT_Value_Temp_F                       ['9',   '27',   'F16']]
-    ['DPT_Value_Wsp_kmh'                        DPT_Value_Wsp_kmh                      ['9',   '28',   'F16']]
-    ['DPT_TimeOfDay'                            DPT_TimeOfDay                          ['10',  '1',    'N3N5r2N6r2N6']]
-    ['DPT_Date'                                 DPT_Date                               ['11',  '1',    'r3N5r4N4r1U7']]
-    ['DPT_Value_4_Ucount'                       DPT_Value_4_Ucount                     ['12',  '1',    'U32']]
-    ['DPT_Value_4_Count'                        DPT_Value_4_Count                      ['13',  '1',    'V32']]
-    ['DPT_FlowRate_m3h'                         DPT_FlowRate_m3h                       ['13',  '2',    'V32']]
-    ['DPT_ActiveEnergy'                         DPT_ActiveEnergy                       ['13',  '10',   'V32']]
-    ['DPT_ApparantEnergy'                       DPT_ApparantEnergy                     ['13',  '11',   'V32']]
-    ['DPT_ReactiveEnergy'                       DPT_ReactiveEnergy                     ['13',  '12',   'V32']]
-    ['DPT_ActiveEnergy_kWh'                     DPT_ActiveEnergy_kWh                   ['13',  '13',   'V32']]
-    ['DPT_ApparantEnergy_kVAh'                  DPT_ApparantEnergy_kVAh                ['13',  '14',   'V32']]
-    ['DPT_ReactiveEnergy_kVARh'                 DPT_ReactiveEnergy_kVARh               ['13',  '15',   'V32']]
-    ['DPT_LongDeltaTimeSec'                     DPT_LongDeltaTimeSec                   ['13',  '100',  'V32']]
-    ['DPT_Value_Acceleration'                   DPT_Value_Acceleration                 ['14',  '0',    'F32']]
-    ['DPT_Value_Acceleration_Angular'           DPT_Value_Acceleration_Angular         ['14',  '1',    'F32']]
-    ['DPT_Value_Activation_Energy'              DPT_Value_Activation_Energy            ['14',  '2',    'F32']]
-    ['DPT_Value_Activity'                       DPT_Value_Activity                     ['14',  '3',    'F32']]
-    ['DPT_Value_Mol'                            DPT_Value_Mol                          ['14',  '4',    'F32']]
-    ['DPT_Value_Amplitude'                      DPT_Value_Amplitude                    ['14',  '5',    'F32']]
-    ['DPT_Value_AngleRad'                       DPT_Value_AngleRad                     ['14',  '6',    'F32']]
-    ['DPT_Value_AngleDeg'                       DPT_Value_AngleDeg                     ['14',  '7',    'F32']]
-    ['DPT_Value_Angular_Momentum'               DPT_Value_Angular_Momentum             ['14',  '8',    'F32']]
-    ['DPT_Value_Angular_Velocity'               DPT_Value_Angular_Velocity             ['14',  '9',    'F32']]
-    ['DPT_Value_Area'                           DPT_Value_Area                         ['14',  '10',   'F32']]
-    ['DPT_Value_Capacitance'                    DPT_Value_Capacitance                  ['14',  '11',   'F32']]
-    ['DPT_Value_Charge_DensitySurface'          DPT_Value_Charge_DensitySurface        ['14',  '12',   'F32']]
-    ['DPT_Value_Charge_DensityVolume'           DPT_Value_Charge_DensityVolume         ['14',  '13',   'F32']]
-    ['DPT_Value_Compressibility'                DPT_Value_Compressibility              ['14',  '14',   'F32']]
-    ['DPT_Value_Conductance'                    DPT_Value_Conductance                  ['14',  '15',   'F32']]
-    ['DPT_Value_Electrical_Conductivity'        DPT_Value_Electrical_Conductivity      ['14',  '16',   'F32']]
-    ['DPT_Value_Density'                        DPT_Value_Density                      ['14',  '17',   'F32']]
-    ['DPT_Value_Electric_Charge'                DPT_Value_Electric_Charge              ['14',  '18',   'F32']]
-    ['DPT_Value_Electric_Current'               DPT_Value_Electric_Current             ['14',  '19',   'F32']]
-    ['DPT_Value_Electric_CurrentDensity'        DPT_Value_Electric_CurrentDensity      ['14',  '20',   'F32']]
-    ['DPT_Value_Electric_DipoleMoment'          DPT_Value_Electric_DipoleMoment        ['14',  '21',   'F32']]
-    ['DPT_Value_Electric_Displacement'          DPT_Value_Electric_Displacement        ['14',  '22',   'F32']]
-    ['DPT_Value_Electric_FieldStrength'         DPT_Value_Electric_FieldStrength       ['14',  '23',   'F32']]
-    ['DPT_Value_Electric_Flux'                  DPT_Value_Electric_Flux                ['14',  '24',   'F32']]
-    ['DPT_Value_Electric_FluxDensity'           DPT_Value_Electric_FluxDensity         ['14',  '25',   'F32']]
-    ['DPT_Value_Electric_Polarization'          DPT_Value_Electric_Polarization        ['14',  '26',   'F32']]
-    ['DPT_Value_Electric_Potential'             DPT_Value_Electric_Potential           ['14',  '27',   'F32']]
-    ['DPT_Value_Electric_PotentialDifference'   DPT_Value_Electric_PotentialDifference ['14',  '28',   'F32']]
-    ['DPT_Value_ElectromagneticMoment'          DPT_Value_ElectromagneticMoment        ['14',  '29',   'F32']]
-    ['DPT_Value_Electromotive_Force'            DPT_Value_Electromotive_Force          ['14',  '30',   'F32']]
-    ['DPT_Value_Energy'                         DPT_Value_Energy                       ['14',  '31',   'F32']]
-    ['DPT_Value_Force'                          DPT_Value_Force                        ['14',  '32',   'F32']]
-    ['DPT_Value_Frequency'                      DPT_Value_Frequency                    ['14',  '33',   'F32']]
-    ['DPT_Value_Angular_Frequency'              DPT_Value_Angular_Frequency            ['14',  '34',   'F32']]
-    ['DPT_Value_Heat_Capacity'                  DPT_Value_Heat_Capacity                ['14',  '35',   'F32']]
-    ['DPT_Value_Heat_FlowRate'                  DPT_Value_Heat_FlowRate                ['14',  '36',   'F32']]
-    ['DPT_Value_Heat_Quantity'                  DPT_Value_Heat_Quantity                ['14',  '37',   'F32']]
-    ['DPT_Value_Impedance'                      DPT_Value_Impedance                    ['14',  '38',   'F32']]
-    ['DPT_Value_Length'                         DPT_Value_Length                       ['14',  '39',   'F32']]
-    ['DPT_Value_Light_Quantity'                 DPT_Value_Light_Quantity               ['14',  '40',   'F32']]
-    ['DPT_Value_Luminance'                      DPT_Value_Luminance                    ['14',  '41',   'F32']]
-    ['DPT_Value_Luminous_Flux'                  DPT_Value_Luminous_Flux                ['14',  '42',   'F32']]
-    ['DPT_Value_Luminous_Intensity'             DPT_Value_Luminous_Intensity           ['14',  '43',   'F32']]
-    ['DPT_Value_Magnetic_FieldStrength'         DPT_Value_Magnetic_FieldStrength       ['14',  '44',   'F32']]
-    ['DPT_Value_Magnetic_Flux'                  DPT_Value_Magnetic_Flux                ['14',  '45',   'F32']]
-    ['DPT_Value_Magnetic_FluxDensity'           DPT_Value_Magnetic_FluxDensity         ['14',  '46',   'F32']]
-    ['DPT_Value_Magnetic_Moment'                DPT_Value_Magnetic_Moment              ['14',  '47',   'F32']]
-    ['DPT_Value_Magnetic_Polarization'          DPT_Value_Magnetic_Polarization        ['14',  '48',   'F32']]
-    ['DPT_Value_Magnetization'                  DPT_Value_Magnetization                ['14',  '49',   'F32']]
-    ['DPT_Value_MagnetomotiveForce'             DPT_Value_MagnetomotiveForce           ['14',  '50',   'F32']]
-    ['DPT_Value_Mass'                           DPT_Value_Mass                         ['14',  '51',   'F32']]
-    ['DPT_Value_MassFlux'                       DPT_Value_MassFlux                     ['14',  '52',   'F32']]
-    ['DPT_Value_Momentum'                       DPT_Value_Momentum                     ['14',  '53',   'F32']]
-    ['DPT_Value_Phase_AngleRad'                 DPT_Value_Phase_AngleRad               ['14',  '54',   'F32']]
-    ['DPT_Value_Phase_AngleDeg'                 DPT_Value_Phase_AngleDeg               ['14',  '55',   'F32']]
-    ['DPT_Value_Power'                          DPT_Value_Power                        ['14',  '56',   'F32']]
-    ['DPT_Value_Power_Factor'                   DPT_Value_Power_Factor                 ['14',  '57',   'F32']]
-    ['DPT_Value_Pressure'                       DPT_Value_Pressure                     ['14',  '58',   'F32']]
-    ['DPT_Value_Reactance'                      DPT_Value_Reactance                    ['14',  '59',   'F32']]
-    ['DPT_Value_Resistance'                     DPT_Value_Resistance                   ['14',  '60',   'F32']]
-    ['DPT_Value_Resistivity'                    DPT_Value_Resistivity                  ['14',  '61',   'F32']]
-    ['DPT_Value_SelfInductance'                 DPT_Value_SelfInductance               ['14',  '62',   'F32']]
-    ['DPT_Value_SolidAngle'                     DPT_Value_SolidAngle                   ['14',  '63',   'F32']]
-    ['DPT_Value_Sound_Intensity'                DPT_Value_Sound_Intensity              ['14',  '64',   'F32']]
-    ['DPT_Value_Speed'                          DPT_Value_Speed                        ['14',  '65',   'F32']]
-    ['DPT_Value_Stress'                         DPT_Value_Stress                       ['14',  '66',   'F32']]
-    ['DPT_Value_Surface_Tension'                DPT_Value_Surface_Tension              ['14',  '67',   'F32']]
-    ['DPT_Value_Common_Temperature'             DPT_Value_Common_Temperature           ['14',  '68',   'F32']]
-    ['DPT_Value_Absolute_Temperature'           DPT_Value_Absolute_Temperature         ['14',  '69',   'F32']]
-    ['DPT_Value_TemperatureDifference'          DPT_Value_TemperatureDifference        ['14',  '70',   'F32']]
-    ['DPT_Value_Thermal_Capacity'               DPT_Value_Thermal_Capacity             ['14',  '71',   'F32']]
-    ['DPT_Value_Thermal_Conductivity'           DPT_Value_Thermal_Conductivity         ['14',  '72',   'F32']]
-    ['DPT_Value_ThermoelectricPower'            DPT_Value_ThermoelectricPower          ['14',  '73',   'F32']]
-    ['DPT_Value_Time'                           DPT_Value_Time                         ['14',  '74',   'F32']]
-    ['DPT_Value_Torque'                         DPT_Value_Torque                       ['14',  '75',   'F32']]
-    ['DPT_Value_Volume'                         DPT_Value_Volume                       ['14',  '76',   'F32']]
-    ['DPT_Value_Volume_Flux'                    DPT_Value_Volume_Flux                  ['14',  '77',   'F32']]
-    ['DPT_Value_Weight'                         DPT_Value_Weight                       ['14',  '78',   'F32']]
-    ['DPT_Value_Work'                           DPT_Value_Work                         ['14',  '79',   'F32']]
-    ['DPT_Access_Data'                          DPT_Access_Data                        ['15',  '0',    'U4U4U4U4U4U4B4N4']]
-    ['DPT_String_ASCII'                         DPT_String_ASCII                       ['16',  '0',    'A112_ASCII']]
-    ['DPT_String_8859_1'                        DPT_String_8859_1                      ['16',  '1',    'A112_8859_1']]
-    ['DPT_SceneNumber'                          DPT_SceneNumber                        ['17',  '1',    'r2U6']]
-    ['DPT_SceneControl'                         DPT_SceneControl                       ['18',  '1',    'B1r1U6']]
-    ['DPT_DateTime'                             DPT_DateTime                           ['19',  '1',    'U8r4U4r3U5U3U5r2U6r2U6B16']]
-    ['DPT_SCLOMode'                             DPT_SCLOMode                           ['20',  '1',    'N8']]
-    ['DPT_BuildingMode'                         DPT_BuildingMode                       ['20',  '2',    'N8']]
-    ['DPT_OccMode'                              DPT_OccMode                            ['20',  '3',    'N8']]
-    ['DPT_Priority'                             DPT_Priority                           ['20',  '4',    'N8']]
-    ['DPT_LightApplicationMode'                 DPT_LightApplicationMode               ['20',  '5',    'N8']]
-    ['DPT_ApplicationArea'                      DPT_ApplicationArea                    ['20',  '6',    'N8']]
-    ['DPT_AlarmClassType'                       DPT_AlarmClassType                     ['20',  '7',    'N8']]
-    ['DPT_PSUMode'                              DPT_PSUMode                            ['20',  '8',    'N8']]
-    ['DPT_ErrorClass_System'                    DPT_ErrorClass_System                  ['20',  '11',   'N8']]
-    ['DPT_ErrorClass_HVAC'                      DPT_ErrorClass_HVAC                    ['20',  '12',   'N8']]
-    ['DPT_Time_Delay'                           DPT_Time_Delay                         ['20',  '13',   'N8']]
-    ['DPT_Beaufort_Wind_Force_Scale'            DPT_Beaufort_Wind_Force_Scale          ['20',  '14',   'N8']]
-    ['DPT_SensorSelect'                         DPT_SensorSelect                       ['20',  '17',   'N8']]
-    ['DPT_ActuatorConnectType'                  DPT_ActuatorConnectType                ['20',  '20',   'N8']]
-    ['DPT_FuelType'                             DPT_FuelType                           ['20',  '100',  'N8']]
-    ['DPT_BurnerType'                           DPT_BurnerType                         ['20',  '101',  'N8']]
-    ['DPT_HVACMode'                             DPT_HVACMode                           ['20',  '102',  'N8']]
-    ['DPT_DHWMode'                              DPT_DHWMode                            ['20',  '103',  'N8']]
-    ['DPT_LoadPriority'                         DPT_LoadPriority                       ['20',  '104',  'N8']]
-    ['DPT_HVACContrMode'                        DPT_HVACContrMode                      ['20',  '105',  'N8']]
-    ['DPT_HVACEmergMode'                        DPT_HVACEmergMode                      ['20',  '106',  'N8']]
-    ['DPT_ChangeoverMode'                       DPT_ChangeoverMode                     ['20',  '107',  'N8']]
-    ['DPT_ValveMode'                            DPT_ValveMode                          ['20',  '108',  'N8']]
-    ['DPT_DamperMode'                           DPT_DamperMode                         ['20',  '109',  'N8']]
-    ['DPT_HeaterMode'                           DPT_HeaterMode                         ['20',  '110',  'N8']]
-    ['DPT_FanMode'                              DPT_FanMode                            ['20',  '111',  'N8']]
-    ['DPT_MasterSlaveMode'                      DPT_MasterSlaveMode                    ['20',  '112',  'N8']]
-    ['DPT_StatusRoomSetp'                       DPT_StatusRoomSetp                     ['20',  '113',  'N8']]
-    ['DPT_ADAType'                              DPT_ADAType                            ['20',  '120',  'N8']]
-    ['DPT_BackupMode'                           DPT_BackupMode                         ['20',  '121',  'N8']]
-    ['DPT_StartSynchronization'                 DPT_StartSynchronization               ['20',  '122',  'N8']]
-    ['DPT_Behaviour_Lock_Unlock'                DPT_Behaviour_Lock_Unlock              ['20',  '600',  'N8']]
-    ['DPT_Behaviour_Bus_Power_Up_Down'          DPT_Behaviour_Bus_Power_Up_Down        ['20',  '601',  'N8']]
-    ['DPT_DALI_Fade_Time'                       DPT_DALI_Fade_Time                     ['20',  '602',  'N8']]
-    ['DPT_BlinkingMode'                         DPT_BlinkingMode                       ['20',  '603',  'N8']]
-    ['DPT_LightControlMode'                     DPT_LightControlMode                   ['20',  '604',  'N8']]
-    ['DPT_SwitchPBModel'                        DPT_SwitchPBModel                      ['20',  '605',  'N8']]
-    ['DPT_PBAction'                             DPT_PBAction                           ['20',  '606',  'N8']]
-    ['DPT_DimmPBModel'                          DPT_DimmPBModel                        ['20',  '607',  'N8']]
-    ['DPT_SwitchOnMode'                         DPT_SwitchOnMode                       ['20',  '608',  'N8']]
-    ['DPT_LoadTypeSet'                          DPT_LoadTypeSet                        ['20',  '609',  'N8']]
-    ['DPT_LoadTypeDetected'                     DPT_LoadTypeDetected                   ['20',  '610',  'N8']]
-    ['DPT_SABExceptBehaviour'                   DPT_SABExceptBehaviour                 ['20',  '801',  'N8']]
-    ['DPT_SABBehaviour_Lock_Unlock'             DPT_SABBehaviour_Lock_Unlock           ['20',  '802',  'N8']]
-    ['DPT_SSSBMode'                             DPT_SSSBMode                           ['20',  '803',  'N8']]
-    ['DPT_BlindsControlMode'                    DPT_BlindsControlMode                  ['20',  '804',  'N8']]
-    ['DPT_CommMode'                             DPT_CommMode                           ['20',  '1000', 'N8']]
-    ['DPT_AddInfoTypes'                         DPT_AddInfoTypes                       ['20',  '1001', 'N8']]
-    ['DPT_RF_ModeSelect'                        DPT_RF_ModeSelect                      ['20',  '1002', 'N8']]
-    ['DPT_RF_FilterSelect'                      DPT_RF_FilterSelect                    ['20',  '1003', 'N8']]
-    ['DPT_StatusGen'                            DPT_StatusGen                          ['21',  '1',    'B8']]
-    ['DPT_Device_Control'                       DPT_Device_Control                     ['21',  '2',    'B8']]
-    ['DPT_ForceSign'                            DPT_ForceSign                          ['21',  '100',  'B8']]
-    ['DPT_ForceSignCool'                        DPT_ForceSignCool                      ['21',  '101',  'B8']]
-    ['DPT_StatusRHC'                            DPT_StatusRHC                          ['21',  '102',  'B8']]
-    ['DPT_StatusSDHWC'                          DPT_StatusSDHWC                        ['21',  '103',  'B8']]
-    ['DPT_FuelTypeSet'                          DPT_FuelTypeSet                        ['21',  '104',  'B8']]
-    ['DPT_StatusRCC'                            DPT_StatusRCC                          ['21',  '105',  'B8']]
-    ['DPT_StatusAHU'                            DPT_StatusAHU                          ['21',  '106',  'B8']]
-    ['DPT_LightActuatorErrorInfo'               DPT_LightActuatorErrorInfo             ['21',  '601',  'B8']]
-    ['DPT_RF_ModeInfo'                          DPT_RF_ModeInfo                        ['21',  '1000', 'B8']]
-    ['DPT_RF_FilterInfo'                        DPT_RF_FilterInfo                      ['21',  '1001', 'B8']]
-    ['DPT_Channel_Activation_8'                 DPT_Channel_Activation_8               ['21',  '1010', 'B8']]
-    ['DPT_StatusDHWC'                           DPT_StatusDHWC                         ['22',  '100',  'B16']]
-    ['DPT_StatusRHCC'                           DPT_StatusRHCC                         ['22',  '101',  'B16']]
-    ['DPT_Media'                                DPT_Media                              ['22',  '1000', 'B16']]
-    ['DPT_Channel_Activation_16'                DPT_Channel_Activation_16              ['22',  '1010', 'B16']]
-    ['DPT_OnOff_Action'                         DPT_OnOff_Action                       ['23',  '1',    'N2']]
-    ['DPT_Alarm_Reaction'                       DPT_Alarm_Reaction                     ['23',  '2',    'N2']]
-    ['DPT_UpDown_Action'                        DPT_UpDown_Action                      ['23',  '3',    'N2']]
-    ['DPT_HVAC_PB_Action'                       DPT_HVAC_PB_Action                     ['23',  '102',  'N2']]
-    ['DPT_VarString_8859_1'                     DPT_VarString_8859_1                   ['24',  '1',    'An_8859_1']]
-    ['DPT_DoubleNibble'                         DPT_DoubleNibble                       ['25',  '1000', 'U4U4']]
-    ['DPT_SceneInfo'                            DPT_SceneInfo                          ['26',  '1',    'r1b1U6']]
-    ['DPT_CombinedInfoOnOff'                    DPT_CombinedInfoOnOff                  ['27',  '1',    'B32']]
-    ['DPT_UTF_8'                                DPT_UTF_8                              ['28',  '1',    'An_UTF_8']]
-    ['DPT_ActiveEnergy_V64'                     DPT_ActiveEnergy_V64                   ['29',  '10',   'V64']]
-    ['DPT_ApparantEnergy_V64'                   DPT_ApparantEnergy_V64                 ['29',  '11',   'V64']]
-    ['DPT_ReactiveEnergy_V64'                   DPT_ReactiveEnergy_V64                 ['29',  '12',   'V64']]
-    ['DPT_Channel_Activation_24'                DPT_Channel_Activation_24              ['30',  '1010', 'B24']]
-    ['DPT_PB_Action_HVAC_Extended'              DPT_PB_Action_HVAC_Extended            ['31',  '101',  'N3']]
-    ['DPT_Heat_Cool_Z'                          DPT_Heat_Cool_Z                        ['200', '100',  'B1Z8HeatingOrCoolingZ']]
-    ['DPT_BinaryValue_Z'                        DPT_BinaryValue_Z                      ['200', '101',  'B1Z8BinaryValueZ']]
-    ['DPT_HVACMode_Z'                           DPT_HVACMode_Z                         ['201', '100',  'N8Z8HvacOperatingMode']]
-    ['DPT_DHWMode_Z'                            DPT_DHWMode_Z                          ['201', '102',  'N8Z8DhwMode']]
-    ['DPT_HVACContrMode_Z'                      DPT_HVACContrMode_Z                    ['201', '104',  'N8Z8HvacControllingMode']]
-    ['DPT_EnablH_Cstage_Z_DPT_EnablH_CStage'    DPT_EnablH_Cstage_Z_DPT_EnablH_CStage  ['201', '105',  'N8Z8EnableHeatingOrCoolingStage']]
-    ['DPT_BuildingMode_Z'                       DPT_BuildingMode_Z                     ['201', '107',  'N8Z8BuildingMode']]
-    ['DPT_OccMode_Z'                            DPT_OccMode_Z                          ['201', '108',  'N8Z8OccupancyMode']]
-    ['DPT_HVACEmergMode_Z'                      DPT_HVACEmergMode_Z                    ['201', '109',  'N8Z8EmergencyMode']]
-    ['DPT_RelValue_Z'                           DPT_RelValue_Z                         ['202', '1',    'U8Z8Rel']]
-    ['DPT_UCountValue8_Z'                       DPT_UCountValue8_Z                     ['202', '2',    'U8Z8Counter']]
-    ['DPT_TimePeriodMsec_Z'                     DPT_TimePeriodMsec_Z                   ['203', '2',    'U16Z8TimePeriod']]
-    ['DPT_TimePeriod10Msec_Z'                   DPT_TimePeriod10Msec_Z                 ['203', '3',    'U16Z8TimePeriod']]
-    ['DPT_TimePeriod100Msec_Z'                  DPT_TimePeriod100Msec_Z                ['203', '4',    'U16Z8TimePeriod']]
-    ['DPT_TimePeriodSec_Z'                      DPT_TimePeriodSec_Z                    ['203', '5',    'U16Z8TimePeriod']]
-    ['DPT_TimePeriodMin_Z'                      DPT_TimePeriodMin_Z                    ['203', '6',    'U16Z8TimePeriod']]
-    ['DPT_TimePeriodHrs_Z'                      DPT_TimePeriodHrs_Z                    ['203', '7',    'U16Z8TimePeriod']]
-    ['DPT_UFlowRateLiter_h_Z'                   DPT_UFlowRateLiter_h_Z                 ['203', '11',   'U16Z8FlowRate']]
-    ['DPT_UCountValue16_Z'                      DPT_UCountValue16_Z                    ['203', '12',   'U16Z8Counter']]
-    ['DPT_UElCurrentyA_Z'                       DPT_UElCurrentyA_Z                     ['203', '13',   'U16Z8ElectricCurrent']]
-    ['DPT_PowerKW_Z'                            DPT_PowerKW_Z                          ['203', '14',   'U16Z8Power']]
-    ['DPT_AtmPressureAbs_Z'                     DPT_AtmPressureAbs_Z                   ['203', '15',   'U16Z8AtmPressure']]
-    ['DPT_PercentU16_Z'                         DPT_PercentU16_Z                       ['203', '17',   'U16Z8PercentValue']]
-    ['DPT_HVACAirQual_Z'                        DPT_HVACAirQual_Z                      ['203', '100',  'U16Z8HvacAirQuality']]
-    ['DPT_WindSpeed_Z_DPT_WindSpeed'            DPT_WindSpeed_Z_DPT_WindSpeed          ['203', '101',  'U16Z8WindSpeed']]
-    ['DPT_SunIntensity_Z'                       DPT_SunIntensity_Z                     ['203', '102',  'U16Z8SunIntensity']]
-    ['DPT_HVACAirFlowAbs_Z'                     DPT_HVACAirFlowAbs_Z                   ['203', '104',  'U16Z8HvacAirFlow']]
-    ['DPT_RelSignedValue_Z'                     DPT_RelSignedValue_Z                   ['204', '1',    'V8Z8RelSignedValue']]
-    ['DPT_DeltaTimeMsec_Z'                      DPT_DeltaTimeMsec_Z                    ['205', '2',    'V16Z8DeltaTime']]
-    ['DPT_DeltaTime10Msec_Z'                    DPT_DeltaTime10Msec_Z                  ['205', '3',    'V16Z8DeltaTime']]
-    ['DPT_DeltaTime100Msec_Z'                   DPT_DeltaTime100Msec_Z                 ['205', '4',    'V16Z8DeltaTime']]
-    ['DPT_DeltaTimeSec_Z'                       DPT_DeltaTimeSec_Z                     ['205', '5',    'V16Z8DeltaTime']]
-    ['DPT_DeltaTimeMin_Z'                       DPT_DeltaTimeMin_Z                     ['205', '6',    'V16Z8DeltaTime']]
-    ['DPT_DeltaTimeHrs_Z'                       DPT_DeltaTimeHrs_Z                     ['205', '7',    'V16Z8DeltaTime']]
-    ['DPT_Percent_V16_Z'                        DPT_Percent_V16_Z                      ['205', '17',   'V16Z8RelSignedValue']]
-    ['DPT_TempHVACAbs_Z'                        DPT_TempHVACAbs_Z                      ['205', '100',  'V16Z8RelSignedValue']]
-    ['DPT_TempHVACRel_Z'                        DPT_TempHVACRel_Z                      ['205', '101',  'V16Z8RelSignedValue']]
-    ['DPT_HVACAirFlowRel_Z'                     DPT_HVACAirFlowRel_Z                   ['205', '102',  'V16Z8RelSignedValue']]
-    ['DPT_HVACModeNext'                         DPT_HVACModeNext                       ['206', '100',  'U16N8HvacModeAndTimeDelay']]
-    ['DPT_DHWModeNext'                          DPT_DHWModeNext                        ['206', '102',  'U16N8DhwModeAndTimeDelay']]
-    ['DPT_OccModeNext'                          DPT_OccModeNext                        ['206', '104',  'U16N8OccupancyModeAndTimeDelay']]
-    ['DPT_BuildingModeNext'                     DPT_BuildingModeNext                   ['206', '105',  'U16N8BuildingModeAndTimeDelay']]
-    ['DPT_StatusBUC'                            DPT_StatusBUC                          ['207', '100',  'U8B8StatusBurnerController']]
-    ['DPT_LockSign'                             DPT_LockSign                           ['207', '101',  'U8B8LockingSignal']]
-    ['DPT_ValueDemBOC'                          DPT_ValueDemBOC                        ['207', '102',  'U8B8BoilerControllerDemandSignal']]
-    ['DPT_ActPosDemAbs'                         DPT_ActPosDemAbs                       ['207', '104',  'U8B8ActuatorPositionDemand']]
-    ['DPT_StatusAct'                            DPT_StatusAct                          ['207', '105',  'U8B8ActuatorPositionStatus']]
-    ['DPT_StatusLightingActuator'               DPT_StatusLightingActuator             ['207', '600',  'U8B8StatusLightingActuator']]
-    ['DPT_StatusHPM'                            DPT_StatusHPM                          ['209', '100',  'V16B8HeatProducerManagerStatus']]
-    ['DPT_TempRoomDemAbs'                       DPT_TempRoomDemAbs                     ['209', '101',  'V16B8RoomTemperatureDemand']]
-    ['DPT_StatusCPM'                            DPT_StatusCPM                          ['209', '102',  'V16B8ColdWaterProducerManagerStatus']]
-    ['DPT_StatusWTC'                            DPT_StatusWTC                          ['209', '103',  'V16B8WaterTemperatureControllerStatus']]
-    ['DPT_TempFlowWaterDemAbs'                  DPT_TempFlowWaterDemAbs                ['210', '100',  'V16B16']]
-    ['DPT_EnergyDemWater'                       DPT_EnergyDemWater                     ['211', '100',  'U8N8']]
-    ['DPT_TempRoomSetpSetShift3'                DPT_TempRoomSetpSetShift3              ['212', '100',  'V16V16V16RoomTemperatureShift']]
-    ['DPT_TempRoomSetpSet3'                     DPT_TempRoomSetpSet3                   ['212', '101',  'V16V16V16RoomTemperature']]
-    ['DPT_TempRoomSetpSet4'                     DPT_TempRoomSetpSet4                   ['213', '100',  'V16V16V16V16RoomTemperature']]
-    ['DPT_TempDHWSetpSet4'                      DPT_TempDHWSetpSet4                    ['213', '101',  'V16V16V16V16DhwtTemperature']]
-    ['DPT_TempRoomSetpSetShift4'                DPT_TempRoomSetpSetShift4              ['213', '102',  'V16V16V16V16RoomTemperatureShift']]
-    ['DPT_PowerFlowWaterDemHPM'                 DPT_PowerFlowWaterDemHPM               ['214', '100',  'V16U8B8Heat']]
-    ['DPT_PowerFlowWaterDemCPM'                 DPT_PowerFlowWaterDemCPM               ['214', '101',  'V16U8B8ChilledWater']]
-    ['DPT_StatusBOC'                            DPT_StatusBOC                          ['215', '100',  'V16U8B16Boiler']]
-    ['DPT_StatusCC'                             DPT_StatusCC                           ['215', '101',  'V16U8B16Chiller']]
-    ['DPT_SpecHeatProd'                         DPT_SpecHeatProd                       ['216', '100',  'U16U8N8B8']]
-    ['DPT_Version'                              DPT_Version                            ['217', '1',    'U5U5U6']]
-    ['DPT_VolumeLiter_Z'                        DPT_VolumeLiter_Z                      ['218', '1',    'V32Z8VolumeLiter']]
-    ['DPT_FlowRate_m3h_Z'                       DPT_FlowRate_m3h_Z                     ['218', '2',    'V32Z8FlowRate']]
-    ['DPT_AlarmInfo'                            DPT_AlarmInfo                          ['219', '1',    'U8N8N8N8B8B8']]
-    ['DPT_TempHVACAbsNext'                      DPT_TempHVACAbsNext                    ['220', '100',  'U16V16']]
-    ['DPT_SerNum'                               DPT_SerNum                             ['221', '1',    'N16U32']]
-    ['DPT_TempRoomSetpSetF163'                  DPT_TempRoomSetpSetF163                ['222', '100',  'F16F16F16']]
-    ['DPT_TempRoomSetpSetShiftF163'             DPT_TempRoomSetpSetShiftF163           ['222', '101',  'F16F16F16']]
-    ['DPT_EnergyDemAir'                         DPT_EnergyDemAir                       ['223', '100',  'V8N8N8']]
-    ['DPT_TempSupply_AirSetpSet'                DPT_TempSupply_AirSetpSet              ['224', '100',  'V16V16N8N8']]
-    ['DPT_ScalingSpeed'                         DPT_ScalingSpeed                       ['225', '1',    'U16U8Scaling']]
-    ['DPT_Scaling_Step_Time'                    DPT_Scaling_Step_Time                  ['225', '2',    'U16U8Scaling']]
-    ['DPT_TariffNext'                           DPT_TariffNext                         ['225', '3',    'U16U8TariffNext']]
-    ['DPT_MeteringValue'                        DPT_MeteringValue                      ['229', '1',    'V32N8Z8']]
-    ['DPT_MBus_Address'                         DPT_MBus_Address                       ['230', '1000', 'U16U32U8N8']]
-    ['DPT_Locale_ASCII'                         DPT_Locale_ASCII                       ['231', '1',    'A8A8A8A8']]
-    ['DPT_Colour_RGB'                           DPT_Colour_RGB                         ['232', '600',  'U8U8U8']]
-    ['DPT_LanguageCodeAlpha2_ASCII'             DPT_LanguageCodeAlpha2_ASCII           ['234', '1',    'A8A8Language']]
-    ['DPT_RegionCodeAlpha2_ASCII'               DPT_RegionCodeAlpha2_ASCII             ['234', '2',    'A8A8Region']]
-    ['DPT_Tariff_ActiveEnergy'                  DPT_Tariff_ActiveEnergy                ['235', '1',    'V32U8B8']]
-    ['DPT_Prioritised_Mode_Control'             DPT_Prioritised_Mode_Control           ['236', '1',    'B1N3N4']]
-    ['DPT_DALI_Control_Gear_Diagnostic'         DPT_DALI_Control_Gear_Diagnostic       ['237', '600',  'B10U6']]
-    ['DPT_SceneConfig'                          DPT_SceneConfig                        ['238', '1',    'B2U6']]
-    ['DPT_DALI_Diagnostics'                     DPT_DALI_Diagnostics                   ['238', '600',  'B2U6']]
-    ['DPT_FlaggedScaling'                       DPT_FlaggedScaling                     ['239', '1',    'U8r7B1']]
-    ['DPT_CombinedPosition'                     DPT_CombinedPosition                   ['240', '800',  'U8U8B8']]
-    ['DPT_StatusSAB'                            DPT_StatusSAB                          ['241', '800',  'U8U8B16']]
-]
-
 [enum uint 2 'CEMIPriority'
     ['0x0' SYSTEM]
     ['0x1' NORMAL]
@@ -1523,13 +601,6 @@
     ['0x3' LOW]
 ]
 
-[enum uint 2 'ControlType'
-    ['0x0' CONNECT]
-    ['0x1' DISCONNECT]
-    ['0x2' ACK]
-    ['0x3' NACK]
-]
-
 [enum uint 8 'Status'
     ['0x00' NO_ERROR]
     ['0x01' PROTOCOL_TYPE_NOT_SUPPORTED]
@@ -1575,84 +646,6 @@
     ['0x20' MEDIUM_KNX_IP]
 ]
 
-// 03_03_07 Application Layer v01.06.02 AS Page 9ff
-[enum uint 4 'APCI'
-    ['0x0' GROUP_VALUE_READ_PDU]
-    ['0x1' GROUP_VALUE_RESPONSE_PDU]
-    ['0x2' GROUP_VALUE_WRITE_PDU]
-    ['0x3' INDIVIDUAL_ADDRESS_WRITE_PDU]
-    ['0x4' INDIVIDUAL_ADDRESS_READ_PDU]
-    ['0x5' INDIVIDUAL_ADDRESS_RESPONSE_PDU]
-    ['0x6' ADC_READ_PDU]
-    // In case of this type the following 6 bits contain more detailed information
-    ['0x7' ADC_RESPONSE_PDU]
-    ['0x8' MEMORY_READ_PDU]
-    ['0x9' MEMORY_RESPONSE_PDU]
-    ['0xA' MEMORY_WRITE_PDU]
-    // In case of this type the following 6 bits contain more detailed information
-    ['0xB' USER_MESSAGE_PDU]
-    ['0xC' DEVICE_DESCRIPTOR_READ_PDU]
-    ['0xD' DEVICE_DESCRIPTOR_RESPONSE_PDU]
-    ['0xE' RESTART_PDU]
-    ['0xF' OTHER_PDU]
-]
-
-// 03_03_07 Application Layer v01.06.02 AS Page 9ff
-[enum uint 6 'ExtendedAPCI'
-    ['0x00' OPEN_ROUTING_TABLE_REQUEST_PDU]
-    ['0x01' READ_ROUTING_TABLE_REQUEST_PDU]
-    ['0x02' READ_ROUTING_TABLE_RESPONSE_PDU]
-    ['0x03' WRITE_ROUTING_TABLE_REQUEST_PDU]
-    ['0x08' READ_ROUTER_MEMORY_REQUEST_PDU]
-    ['0x09' READ_ROUTER_MEMORY_RESPONSE_PDU]
-    ['0x0A' WRITE_ROUTER_MEMORY_REQUEST_PDU]
-    ['0x0D' READ_ROUTER_STATUS_REQUEST_PDU]
-    ['0x0E' READ_ROUTER_STATUS_RESPONSE_PDU]
-    ['0x0F' WRITE_ROUTER_STATUS_REQUEST_PDU]
-
-    ['0x10' MEMORY_BIT_WRITE_PDU]
-
-    ['0x11' AUTHORIZE_REQUEST_PDU]
-    ['0x12' AUTHORIZE_RESPONSE_PDU]
-    ['0x13' KEY_WRITE_PDU]
-    ['0x14' KEY_RESPONSE_PDU]
-
-    ['0x15' PROPERTY_VALUE_READ_PDU]
-    ['0x16' PROPERTY_VALUE_RESPONSE_PDU]
-    ['0x17' PROPERTY_VALUE_WRITE_PDU]
-    ['0x18' PROPERTY_DESCRIPTION_READ_PDU]
-    ['0x19' PROPERTY_DESCRIPTION_RESPONSE_PDU]
-
-    ['0x1A' NETWORK_PARAMETER_READ_PDU]
-    ['0x1B' NETWORK_PARAMETER_RESPONSE_PDU]
-
-    ['0x1C' INDIVIDUAL_ADDRESS_SERIAL_NUMBER_READ_PDU]
-    ['0x1D' INDIVIDUAL_ADDRESS_SERIAL_NUMBER_RESPONSE_PDU]
-    ['0x1E' INDIVIDUAL_ADDRESS_SERIAL_NUMBER_WRITE_PDU]
-
-    ['0x20' DOMAIN_ADDRESS_WRITE]
-    ['0x21' DOMAIN_ADDRESS_READ]
-    ['0x22' DOMAIN_ADDRESS_RESPONSE]
-    ['0x23' DOMAIN_ADDRESS_SELECTIVE_READ]
-
-    ['0x24' NETWORK_PARAMETER_WRITE]
-
-    ['0x25' LINK_READ]
-    ['0x26' LINK_RESPONSE]
-    ['0x27' LINK_WRITE]
-
-    ['0x28' GROUP_PROPERTY_VALUE_READ]
-    ['0x29' GROUP_PROPERTY_VALUE_RESPONSE]
-    ['0x2A' GROUP_PROPERTY_VALUE_WRITE]
-    ['0x2B' GROUP_PROPERTY_VALUE_INFO_REPORT]
-
-    ['0x2C' DOMAIN_ADDRESS_SERIAL_NUMBER_READ]
-    ['0x2D' DOMAIN_ADDRESS_SERIAL_NUMBER_RESPONSE]
-    ['0x2E' DOMAIN_ADDRESS_SERIAL_NUMBER_WRITE]
-
-    ['0x30' FILE_STREAM_INFO_REPORT]
-]
-
 [enum uint 8 'SupportedPhysicalMedia' [string 'description',                                                    bit 'knxSupport']
     ['0x00' OTHER                     ['used_for_undefined_physical_medium',                                    'true']]
     ['0x01' OIL_METER                 ['measures_volume_of_oil',                                                'true']]
@@ -1679,7 +672,7 @@
 
 // The definition of the constants for medium type in the device descriptor differs from that of the other parts
 // 03_05_01 Resources v01.09.03 AS.pdf Page 22
-[enum uint 4 DeviceDescriptorMediumType
+[enum uint 4 'DeviceDescriptorMediumType'
     ['0x0' TP1      ]
     ['0x1' PL110    ]
     ['0x2' RF       ]
@@ -1689,20 +682,20 @@
 ]
 
 // 03_05_01 Resources v01.09.03 AS.pdf Page 22
-[enum uint 8 FirmwareType
-    ['0xAF' NONE                      ]
-    ['0x00' BCU_1                     ]
-    ['0x01' BCU_1_SYSTEM_1            ]
-    ['0x02' BCU_2_SYSTEM_2            ]
-    ['0x70' BIM_M112                  ]
-    ['0x7B' SYSTEM_B                  ]
-    ['0x81' IR_DECODER                ]
-    ['0x90' MEDIA_COUPLER_PL_TP       ]
-    ['0x91' COUPLER                   ]
-    ['0x20' RF_BI_DIRECTIONAL_DEVICES ]
-    ['0x21' RF_UNI_DIRECTIONAL_DEVICES]
-    ['0x' SYSTEM_300                  ]
-    ['0x' SYSTEM_7                    ]
+[enum uint 4 'FirmwareType' [uint 8 'code']
+    ['0x1' NONE                      ['0xAF']]
+    ['0x2' BCU_1                     ['0x00']]
+    ['0x3' BCU_1_SYSTEM_1            ['0x01']]
+    ['0x4' BCU_2_SYSTEM_2            ['0x02']]
+    ['0x5' BIM_M112                  ['0x70']]
+    ['0x6' SYSTEM_B                  ['0x7B']]
+    ['0x7' IR_DECODER                ['0x81']]
+    ['0x8' MEDIA_COUPLER_PL_TP       ['0x90']]
+    ['0x9' COUPLER                   ['0x91']]
+    ['0xA' RF_BI_DIRECTIONAL_DEVICES ['0x01']]
+    ['0xB' RF_UNI_DIRECTIONAL_DEVICES['0x11']]
+    ['0xC' SYSTEM_300                ['0x30']]
+    ['0xD' SYSTEM_7                  ['0x70']]
 ]
 
 // Helper enum that binds the combinations of medium type and firmware
@@ -1735,12 +728,9 @@
     ['0x1900' PL110_MEDIA_COUPLER_PL_TP ['DeviceDescriptorMediumType.PL110',        'FirmwareType.MEDIA_COUPLER_PL_TP'       ]]
     ['0x2010' RF_BI_DIRECTIONAL_DEVICES ['DeviceDescriptorMediumType.RF',           'FirmwareType.RF_BI_DIRECTIONAL_DEVICES' ]]
     ['0x2110' RF_UNI_DIRECTIONAL_DEVICES['DeviceDescriptorMediumType.RF',           'FirmwareType.RF_UNI_DIRECTIONAL_DEVICES']]
-    // This should actually be BCU_1 and not BCU_1_SYSTEM_1, unfortunately the code seems to be different in this case
-    ['0x3012' TP0_BCU_1                 ['DeviceDescriptorMediumType.TP0',          'FirmwareType.BCU_1_SYSTEM_1'            ]]
-    // This should actually be BCU_1 and not BCU_1_SYSTEM_1, unfortunately the code seems to be different in this case
-    ['0x4012' PL132_BCU_1               ['DeviceDescriptorMediumType.PL132',        'FirmwareType.BCU_1_SYSTEM_1'            ]]
-    // This should actually be SYSTEM7 and not BIM_M112, unfortunately the code seems to be the same in this case
-    ['0x5705' KNX_IP_SYSTEM7            ['DeviceDescriptorMediumType.KNX_IP',       'FirmwareType.BIM_M112'                  ]]
+    ['0x3012' TP0_BCU_1                 ['DeviceDescriptorMediumType.TP0',          'FirmwareType.BCU_1'                     ]]
+    ['0x4012' PL132_BCU_1               ['DeviceDescriptorMediumType.PL132',        'FirmwareType.BCU_1'                     ]]
+    ['0x5705' KNX_IP_SYSTEM7            ['DeviceDescriptorMediumType.KNX_IP',       'FirmwareType.SYSTEM_7'                  ]]
 ]
 
 // 03_05_01 Resources v01.09.03 AS.pdf Page 23ff
diff --git a/protocols/knxnetip/src/main/xslt/knx-types.xsl b/protocols/knxnetip/src/main/xslt/knx-types.xsl
index 65a43f4..f3877a5 100644
--- a/protocols/knxnetip/src/main/xslt/knx-types.xsl
+++ b/protocols/knxnetip/src/main/xslt/knx-types.xsl
@@ -47,13 +47,13 @@
 // specific language governing permissions and limitations
 // under the License.
 //
-[enum uint 16 'KnxDatapointType' [uint 16 'number', uint 8 'sizeInBits', string 'name']
+[enum uint 16 'KnxDatapointMainType' [uint 16 'number', uint 8 'sizeInBits', string 'name']
     ['0' DPT_UNKNOWN ['0', '0', '"Unknown Datapoint Type"']]
     <xsl:apply-templates select="knx:KNX/knx:MasterData/knx:DatapointTypes/knx:DatapointType"/>
 ]
 
-[enum uint 32 'KnxDatapointSubtype' [uint 16 'number', KnxDatapointType 'datapointType', string 'name']
-    ['0' DPST_UNKNOWN ['0', 'KnxDatapointType.DPT_UNKNOWN', '"Unknown Datapoint Subtype"']]
+[enum uint 32 'KnxDatapointType' [uint 16 'number', KnxDatapointType 'datapointType', string 'name']
+    ['0' DPT_UNKNOWN ['0', 'KnxDatapointType.DPT_UNKNOWN', '"Unknown Datapoint Subtype"']]
     <xsl:apply-templates select="knx:KNX/knx:MasterData/knx:DatapointTypes/knx:DatapointType/knx:DatapointSubtypes/knx:DatapointSubtype"/>
 ]
 
@@ -77,6 +77,16 @@
     ['0' M_UNKNOWN ['0', '"Unknown Manufacturer"']]
     <xsl:apply-templates select="knx:KNX/knx:MasterData/knx:Manufacturers/knx:Manufacturer"/>
 ]
+
+[dataIo 'KnxDatapoint' [KnxDatapointType 'datapointType']
+    [typeSwitch 'datapointType'
+    <xsl:for-each select="knx:KNX/knx:MasterData/knx:DatapointTypes/knx:DatapointType/knx:DatapointSubtypes/knx:DatapointSubtype">
+        <xsl:call-template name="generateDataIoEntry">
+            <xsl:with-param name="datapointSubtype" select="."/>
+        </xsl:call-template>
+    </xsl:for-each>
+    ]
+]
     </xsl:template>
 
     <xsl:template match="knx:DatapointType">
@@ -90,8 +100,8 @@
     <xsl:template match="knx:DatapointSubtype">
         <xsl:variable name="datapointSubtypeId">
             <xsl:choose>
-                <xsl:when test="fn:starts-with(@Name, 'DPT')">DPST_<xsl:value-of select="fn:substring-after(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(@Name, '\[', '_'), '\]', ''), '&#x00B3;', '_3'), '&#xB5;', 'y'), '/', ''), '-', '_'), 'DPT_')"/></xsl:when>
-                <xsl:otherwise>DPST_<xsl:for-each select="tokenize(@Name, ' ')"><xsl:value-of select="concat(upper-case(substring(.,1,1)), substring(., 2))"/><xsl:if test="position()!=last()">_</xsl:if></xsl:for-each></xsl:otherwise>
+                <xsl:when test="fn:starts-with(@Name, 'DPT')">DPT_<xsl:value-of select="fn:substring-after(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(@Name, '\[', '_'), '\]', ''), '&#x00B3;', '_3'), '&#xB5;', 'y'), '/', ''), '-', '_'), 'DPT_')"/></xsl:when>
+                <xsl:otherwise>DPT_<xsl:for-each select="tokenize(@Name, ' ')"><xsl:value-of select="concat(upper-case(substring(.,1,1)), substring(., 2))"/><xsl:if test="position()!=last()">_</xsl:if></xsl:for-each></xsl:otherwise>
             </xsl:choose>
         </xsl:variable>
         <xsl:variable name="datapointTypeId">
@@ -185,4 +195,245 @@
         <xsl:value-of select="fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(normalize-space($cleanedText2),'&#xa0;', '_'), '&amp;', 'AND'), '-', '_'), ' ', '_'), '\.', '_'), ',', '_'), '\+', 'Plus'), '/', '_'), 'Ä', 'AE'), 'Ö', 'OE'), 'Ü', 'UE'), 'ß', 'SS'), ':', '_')"/>
     </xsl:template>
 
+    <xsl:template name="generateDataIoEntry">
+        <xsl:param name="datapointSubtype"/>
+        <xsl:variable name="datapointSubtypeId">
+            <xsl:choose>
+                <xsl:when test="fn:starts-with(@Name, 'DPT')">DPT_<xsl:value-of select="fn:substring-after(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(fn:replace(@Name, '\[', '_'), '\]', ''), '&#x00B3;', '_3'), '&#xB5;', 'y'), '/', ''), '-', '_'), 'DPT_')"/></xsl:when>
+                <xsl:otherwise>DPT_<xsl:for-each select="tokenize(@Name, ' ')"><xsl:value-of select="concat(upper-case(substring(.,1,1)), substring(., 2))"/><xsl:if test="position()!=last()">_</xsl:if></xsl:for-each></xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:variable name="datapointValueType">
+            <xsl:choose>
+                <xsl:when test="count($datapointSubtype/knx:Format/knx:Bit|$datapointSubtype/knx:Format/knx:String|$datapointSubtype/knx:Format/knx:UnsignedInteger|$datapointSubtype/knx:Format/knx:SignedInteger|$datapointSubtype/knx:Format/knx:Float|$datapointSubtype/knx:Format/knx:Enumeration|$datapointSubtype/knx:Format/knx:RefType) &gt; 1">Struct</xsl:when>
+                <xsl:when test="$datapointSubtype/knx:Format/knx:Bit">BOOL</xsl:when>
+                <xsl:when test="$datapointSubtype/knx:Format/knx:String">STRING</xsl:when>
+                <xsl:when test="$datapointSubtype/knx:Format/knx:UnsignedInteger">
+                    <xsl:choose>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:UnsignedInteger/@Width) &lt;= 8">USINT</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:UnsignedInteger/@Width) &lt;= 16">UINT</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:UnsignedInteger/@Width) &lt;= 32">UDINT</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:UnsignedInteger/@Width) &lt;= 64">ULINT</xsl:when>
+                    </xsl:choose>
+                </xsl:when>
+                <xsl:when test="$datapointSubtype/knx:Format/knx:SignedInteger">
+                    <xsl:choose>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:SignedInteger/@Width) &lt;= 8">SINT</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:SignedInteger/@Width) &lt;= 16">INT</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:SignedInteger/@Width) &lt;= 32">DINT</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:SignedInteger/@Width) &lt;= 64">LINT</xsl:when>
+                    </xsl:choose>
+                </xsl:when>
+                <xsl:when test="$datapointSubtype/knx:Format/knx:Float">
+                    <xsl:choose>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:Float/@Width) &lt;= 16">REAL</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:Float/@Width) &lt;= 32">REAL</xsl:when>
+                        <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:Float/@Width) &lt;= 64">LREAL</xsl:when>
+                    </xsl:choose>
+                </xsl:when>
+                <xsl:when test="$datapointSubtype/knx:Format/knx:Enumeration">STRING</xsl:when>
+                <xsl:otherwise>Hurz:<xsl:value-of select="name($datapointSubtype/*)"/></xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        ['KnxDatapointType.<xsl:value-of select="$datapointSubtypeId"/>' <xsl:value-of select="$datapointValueType"/>
+        <xsl:choose>
+            <xsl:when test="count($datapointSubtype/knx:Format/knx:Bit|$datapointSubtype/knx:Format/knx:String|$datapointSubtype/knx:Format/knx:UnsignedInteger|$datapointSubtype/knx:Format/knx:SignedInteger|$datapointSubtype/knx:Format/knx:Float|$datapointSubtype/knx:Format/knx:Enumeration|$datapointSubtype/knx:Format/knx:RefType) &gt; 1">
+                <xsl:variable name="resolvedFields">
+                    <xsl:call-template name="resolveTypeReferences">
+                        <xsl:with-param name="fields" select="$datapointSubtype/knx:Format/*"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <xsl:variable name="size">
+                    <xsl:call-template name="fieldsSize">
+                        <xsl:with-param name="fields" select="$resolvedFields/*"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <xsl:choose>
+                    <xsl:when test="(($size mod 8) != 0) and (($size mod 8) &lt;= 6)">
+            [reserved uint <xsl:value-of select="8 - ($size mod 8)"/> '0x00']
+                    </xsl:when>
+                    <xsl:when test="(($size mod 8) = 0) and (name($resolvedFields/*[1]) = 'Reserved') and (number($resolvedFields/*[1]/@Width) > 2)"></xsl:when>
+                    <xsl:otherwise>
+            [reserved uint 8 '0x00']
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:for-each select="$resolvedFields/*">
+                    <xsl:variable name="fieldType">
+                        <xsl:choose>
+                            <xsl:when test="name() = 'Reserved'">reserved</xsl:when>
+                            <xsl:otherwise>simple</xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:variable>
+                    <xsl:variable name="fieldName">
+                        <xsl:choose>
+                            <xsl:when test="name() = 'Reserved'">0x00</xsl:when>
+                            <xsl:when test="@Name">
+                                <xsl:call-template name="getFieldName">
+                                    <xsl:with-param name="fieldName" select="@Name"/>
+                                </xsl:call-template>
+                            </xsl:when>
+                            <xsl:when test="@Set">
+                                <xsl:call-template name="getFieldName">
+                                    <xsl:with-param name="fieldName" select="@Set"/>
+                                </xsl:call-template>
+                            </xsl:when>
+                            <xsl:when test="@Unit">
+                                <xsl:call-template name="getFieldName">
+                                    <xsl:with-param name="fieldName" select="@Unit"/>
+                                </xsl:call-template>
+                            </xsl:when>
+                            <!-- Special case for one enum -->
+                            <xsl:when test="@Id = 'DPST-6-20_F-6'">Mode</xsl:when>
+                            <xsl:when test="@Id = 'DPST-15-0_F-1'">Value1</xsl:when>
+                            <xsl:when test="@Id = 'DPST-15-0_F-1'">Value2</xsl:when>
+                            <xsl:when test="@Id = 'DPST-15-0_F-1'">Value3</xsl:when>
+                            <xsl:when test="@Id = 'DPST-15-0_F-1'">Value4</xsl:when>
+                            <xsl:when test="@Id = 'DPST-15-0_F-1'">Value5</xsl:when>
+                            <xsl:when test="@Id = 'DPST-15-0_F-1'">Value6</xsl:when>
+                            <xsl:otherwise>Hurz</xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:variable>
+                    <xsl:variable name="dataType">
+                        <xsl:call-template name="getMspecType">
+                            <xsl:with-param name="field" select="."/>
+                        </xsl:call-template>
+                    </xsl:variable>                    
+            [<xsl:value-of select="$fieldType"/><xsl:text disable-output-escaping="yes"> </xsl:text><xsl:value-of select="$dataType"/> '<xsl:value-of select="$fieldName"/>']
+                </xsl:for-each>
+            </xsl:when>
+            <xsl:when test="$datapointSubtype/knx:Format/knx:Bit">
+            [reserved uint 7 '0x00']
+            [simple   bit    'value']
+            </xsl:when>
+            <xsl:when test="$datapointSubtype/knx:Format/knx:String">
+                <xsl:variable name="encoding">
+                    <xsl:choose>
+                        <xsl:when test="$datapointSubtype/knx:Format/knx:String/@Encoding = 'us-ascii'">ASCII</xsl:when>
+                        <xsl:when test="$datapointSubtype/knx:Format/knx:String/@Encoding = 'iso-8859-1'">ISO-8859-1</xsl:when>
+                    </xsl:choose>
+                </xsl:variable>
+            [reserved uint 8   '0x0']
+            [simple   string <xsl:value-of select="$datapointSubtype/knx:Format/knx:String/@Width"/> '<xsl:value-of select="$encoding"/>' 'value']
+            </xsl:when>
+            <xsl:when test="$datapointSubtype/knx:Format/knx:UnsignedInteger">
+                <xsl:choose>
+                    <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:UnsignedInteger/@Width) &gt; 6">
+            [reserved uint 8 '0x00']
+                    </xsl:when>
+                    <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:UnsignedInteger/@Width) &lt; 6">
+            [reserved uint <xsl:value-of select="6 - fn:number($datapointSubtype/knx:Format/knx:UnsignedInteger/@Width)"/> '0x00']
+                    </xsl:when>
+                </xsl:choose>
+            [simple   uint <xsl:value-of select="$datapointSubtype/knx:Format/knx:UnsignedInteger/@Width"/> 'value']
+            </xsl:when>
+            <xsl:when test="$datapointSubtype/knx:Format/knx:SignedInteger">
+                <xsl:choose>
+                    <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:SignedInteger/@Width) &gt; 6">
+            [reserved uint 8 '0x00']
+                    </xsl:when>
+                    <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:SignedInteger/@Width) &lt; 6">
+            [reserved uint <xsl:value-of select="6 - fn:number($datapointSubtype/knx:Format/knx:SignedInteger/@Width)"/> '0x00']
+                    </xsl:when>
+                </xsl:choose>
+            [simple   int <xsl:value-of select="$datapointSubtype/knx:Format/knx:SignedInteger/@Width"/> 'value']
+            </xsl:when>
+            <xsl:when test="$datapointSubtype/knx:Format/knx:Float">
+            [reserved uint 8 '0x00']
+                <xsl:choose>
+                    <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:Float/@Width) = 16">
+            [simple   float 4.11 'value']
+                    </xsl:when>
+                    <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:Float/@Width) = 32">
+            [simple   float 8.23 'value']
+                    </xsl:when>
+                    <xsl:when test="fn:number($datapointSubtype/knx:Format/knx:Float/@Width) = 64">
+            [simple   float 11.52 'value']
+                    </xsl:when>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:when test="$datapointSubtype/knx:Format/knx:Enumeration"></xsl:when>
+        </xsl:choose>
+        ]
+    </xsl:template>
+
+    <xsl:template name="resolveTypeReferences">
+        <xsl:param name="fields"/>
+        <xsl:for-each select="$fields">
+            <xsl:choose>
+                <xsl:when test="name(.) = 'RefType'">
+                    <xsl:variable name="curNode" select="."/>
+                    <xsl:copy-of select="//*[@Id = $curNode/@RefId]"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:copy-of select="."/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template name="getMspecType">
+        <xsl:param name="field"/>
+        <xsl:choose>
+            <xsl:when test="name($field) = 'Bit'">bit</xsl:when>
+            <xsl:when test="name($field) = 'String'">
+                <xsl:variable name="encoding">
+                    <xsl:choose>
+                        <xsl:when test="$field/@Encoding = 'us-ascii'">ASCII</xsl:when>
+                        <xsl:when test="$field/@Encoding = 'iso-8859-1'">ISO-8859-1</xsl:when>
+                    </xsl:choose>
+                </xsl:variable>
+                string <xsl:value-of select="$field/@Width"/> '<xsl:value-of select="$encoding"/>'</xsl:when>
+            <xsl:when test="name($field) = 'UnsignedInteger'">uint <xsl:value-of select="$field/@Width"/></xsl:when>
+            <xsl:when test="name($field) = 'SignedInteger'">int <xsl:value-of select="$field/@Width"/></xsl:when>
+            <xsl:when test="name($field) = 'Float'">
+                <xsl:choose>
+                    <xsl:when test="$field/@Width = 16">float 4.11</xsl:when>
+                    <xsl:when test="$field/@Width = 32">float 8.23</xsl:when>
+                    <xsl:when test="$field/@Width = 64">float 11.52</xsl:when>
+                    <xsl:otherwise>hurz</xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:when test="name($field) = 'Enumeration'">uint <xsl:value-of select="$field/@Width"/></xsl:when>
+            <xsl:when test="name($field) = 'Reserved'">uint <xsl:value-of select="$field/@Width"/></xsl:when>
+        </xsl:choose>
+    </xsl:template>
+    
+    <xsl:template name="getFieldName">
+        <xsl:param name="fieldName"/>
+        <xsl:variable name="cleanedName" select="fn:replace(fn:replace($fieldName, '%', 'Percent'), '[^a-zA-Z0-9]', ' ')"/>
+        <xsl:for-each select="fn:tokenize($cleanedName, ' ')">
+            <xsl:choose>
+                <xsl:when test="fn:string-length(.) = 1"><xsl:value-of select="fn:upper-case(.)"/></xsl:when>
+                <xsl:otherwise>
+                    <xsl:variable name="firstLetter" select="fn:upper-case(fn:substring(., 1, 1))"/>
+                    <xsl:variable name="rest" select="fn:lower-case(fn:substring(., 2))"/>
+                    <xsl:value-of select="fn:concat($firstLetter, $rest)"/>                   
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:for-each>
+    </xsl:template>
+    
+    <xsl:template name="fieldsSize">
+        <xsl:param name="fields"/>
+        <xsl:choose>
+            <xsl:when test="count($fields) &gt; 1">
+                <xsl:variable name="restSize">
+                    <xsl:call-template name="fieldsSize">
+                        <xsl:with-param name="fields" select="$fields[position() &gt; 1]"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <xsl:choose>
+                    <xsl:when test="name($fields[1]) = 'Bit'"><xsl:value-of select="1 + $restSize"/></xsl:when>
+                    <xsl:otherwise><xsl:value-of select="number($fields[1]/@Width) + $restSize"/></xsl:otherwise>
+                </xsl:choose>               
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:choose>
+                    <xsl:when test="name($fields[1]) = 'Bit'"><xsl:value-of select="1"/></xsl:when>
+                    <xsl:otherwise><xsl:value-of select="number($fields[1]/@Width)"/></xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
 </xsl:stylesheet>
\ No newline at end of file


[plc4x] 07/07: - Finished migrating the Go KNX client to the new model.

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

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

commit d9b9ddd1dfe98eef126b6f3f7f3d5f9d84877828
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 24 17:38:40 2021 +0100

    - Finished migrating the Go KNX client to the new model.
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |    4 +
 .../language/go/GoLanguageTemplateHelper.java      |  208 +-
 .../resources/templates/go/data-io-template.ftlh   |    8 +-
 .../knxnetip/ParserSerializerTestsuite.xml         |   35 +-
 plc4go/cmd/main/drivers/knxnetip_test.go           |    3 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpField.go   |   33 +-
 .../plc4go/knxnetip/KnxNetIpFieldHandler.go        |   16 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go  |  902 +-
 .../internal/plc4go/knxnetip/KnxNetIpSubscriber.go |    9 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpWriter.go  |    3 +-
 .../plc4go/knxnetip/readwrite/model/ApduData.go    |    2 +-
 .../model/ApduDataDeviceDescriptorRead.go          |   31 +-
 .../model/ApduDataDeviceDescriptorResponse.go      |   79 +-
 .../plc4go/knxnetip/readwrite/model/ApduDataExt.go |    6 +-
 .../knxnetip/readwrite/model/KnxDatapoint.go       | 9604 +++++++++++---------
 .../readwrite/model/KnxDatapointMainType.go        |  988 ++
 .../readwrite/model/KnxDatapointSubtype.go         | 5260 -----------
 .../knxnetip/readwrite/model/KnxDatapointType.go   | 1298 +--
 .../plc4go/knxnetip/readwrite/model/LBusmonInd.go  |   39 +-
 .../plc4x/java/knxnetip/ets5/Ets5Parser.java       |   10 +-
 .../java/knxnetip/ets5/model/GroupAddress.java     |    8 +-
 .../knxnetip/protocol/KnxNetIpProtocolLogic.java   |   92 +-
 .../resources/protocols/knxnetip/knxnetip.mspec    |    9 +-
 protocols/knxnetip/src/main/xslt/knx-types.xsl     |   52 +-
 .../knxnetip/ParserSerializerTestsuite.xml         |   35 +-
 25 files changed, 8002 insertions(+), 10732 deletions(-)

diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 2d35bf5..bd767b2 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -150,6 +150,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         return typeReference instanceof ComplexTypeReference;
     }
 
+    public boolean isEnumTypeReference(TypeReference typeReference) {
+        return getTypeDefinitionForTypeReference(typeReference) instanceof EnumTypeDefinition;
+    }
+
     public boolean isStringTypeReference(TypeReference typeReference) {
         return typeReference instanceof StringTypeReference;
     }
diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index 40d0bbc..324adc9 100644
--- a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -51,12 +51,12 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     public String getLanguageTypeNameForField(Field field) {
         boolean optional = field instanceof OptionalField;
         // If the referenced type is a DataIo type, the value is of type PlcValue.
-        if(field instanceof PropertyField) {
+        if (field instanceof PropertyField) {
             PropertyField propertyField = (PropertyField) field;
-            if(propertyField.getType() instanceof ComplexTypeReference) {
+            if (propertyField.getType() instanceof ComplexTypeReference) {
                 ComplexTypeReference complexTypeReference = (ComplexTypeReference) propertyField.getType();
                 final TypeDefinition typeDefinition = getTypeDefinitions().get(complexTypeReference.getName());
-                if(typeDefinition instanceof DataIoTypeDefinition) {
+                if (typeDefinition instanceof DataIoTypeDefinition) {
                     return "PlcValue";
                 }
             }
@@ -66,7 +66,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
 
     @Override
     public String getLanguageTypeNameForTypeReference(TypeReference typeReference) {
-        if(typeReference instanceof SimpleTypeReference) {
+        if (typeReference instanceof SimpleTypeReference) {
             SimpleTypeReference simpleTypeReference = (SimpleTypeReference) typeReference;
             switch (simpleTypeReference.getBaseType()) {
                 case BIT: {
@@ -137,7 +137,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public String getPlcValueTypeForTypeReference(TypeReference typeReference) {
-        if(typeReference instanceof SimpleTypeReference) {
+        if (typeReference instanceof SimpleTypeReference) {
             SimpleTypeReference simpleTypeReference = (SimpleTypeReference) typeReference;
             switch (simpleTypeReference.getBaseType()) {
                 case BIT: {
@@ -209,7 +209,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
 
     @Override
     public String getNullValueForTypeReference(TypeReference typeReference) {
-        if(typeReference instanceof SimpleTypeReference) {
+        if (typeReference instanceof SimpleTypeReference) {
             SimpleTypeReference simpleTypeReference = (SimpleTypeReference) typeReference;
             switch (simpleTypeReference.getBaseType()) {
                 case BIT: {
@@ -226,7 +226,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                     return "\"\"";
                 }
             }
-        } else if(typeReference instanceof ComplexTypeReference) {
+        } else if (typeReference instanceof ComplexTypeReference) {
             return "0";
         }
         return "nil";
@@ -407,9 +407,9 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     String getCastExpressionForTypeReference(TypeReference typeReference) {
-        if(typeReference instanceof SimpleTypeReference) {
+        if (typeReference instanceof SimpleTypeReference) {
             return getLanguageTypeNameForTypeReference(typeReference);
-        } else if(typeReference != null) {
+        } else if (typeReference != null) {
             return "Cast" + getLanguageTypeNameForTypeReference(typeReference);
         } else {
             return "";
@@ -417,19 +417,19 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     private String toExpression(TypeReference fieldType, Term term, Argument[] parserArguments, Argument[] serializerArguments, boolean serialize, boolean suppressPointerAccess) {
-        if(term == null) {
+        if (term == null) {
             return "";
         }
-        if(term instanceof Literal) {
-            if(term instanceof NullLiteral) {
+        if (term instanceof Literal) {
+            if (term instanceof NullLiteral) {
                 return "nil";
-            } else if(term instanceof BooleanLiteral) {
+            } else if (term instanceof BooleanLiteral) {
                 return getCastExpressionForTypeReference(fieldType) + "(" + ((BooleanLiteral) term).getValue() + ")";
-            } else if(term instanceof NumericLiteral) {
+            } else if (term instanceof NumericLiteral) {
                 return getCastExpressionForTypeReference(fieldType) + "(" + ((NumericLiteral) term).getNumber().toString() + ")";
-            } else if(term instanceof StringLiteral) {
+            } else if (term instanceof StringLiteral) {
                 return "\"" + ((StringLiteral) term).getValue() + "\"";
-            } else if(term instanceof VariableLiteral) {
+            } else if (term instanceof VariableLiteral) {
                 return toVariableExpression(fieldType, (VariableLiteral) term, parserArguments, serializerArguments, serialize, suppressPointerAccess);
             } else {
                 throw new RuntimeException("Unsupported Literal type " + term.getClass().getName());
@@ -437,7 +437,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         } else if (term instanceof UnaryTerm) {
             UnaryTerm ut = (UnaryTerm) term;
             Term a = ut.getA();
-            switch(ut.getOperation()) {
+            switch (ut.getOperation()) {
                 case "!":
                     return "!(" + toExpression(fieldType, a, parserArguments, serializerArguments, serialize, false) + ")";
                 case "-":
@@ -474,7 +474,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 default:
                     return getCastExpressionForTypeReference(fieldType) + "(" + toExpression(fieldType, a, parserArguments, serializerArguments, serialize, false) + ") " +
                         operation + " " +
-                        getCastExpressionForTypeReference(fieldType) +"(" + toExpression(fieldType, b, parserArguments, serializerArguments, serialize, false) + ")";
+                        getCastExpressionForTypeReference(fieldType) + "(" + toExpression(fieldType, b, parserArguments, serializerArguments, serialize, false) + ")";
             }
         } else if (term instanceof TernaryTerm) {
             TernaryTerm tt = (TernaryTerm) term;
@@ -543,7 +543,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             // Cut off the double-quotes
             staticCall = staticCall.substring(1, staticCall.length() - 1);
             // Remove all the previous parts prior to the Class name (Which starts with an uppercase letter)
-            while(staticCall.contains(".") && !StringUtils.isAllUpperCase(staticCall.substring(0,1))) {
+            while (staticCall.contains(".") && !StringUtils.isAllUpperCase(staticCall.substring(0, 1))) {
                 staticCall = staticCall.substring(staticCall.indexOf(".") + 1);
             }
             String className = staticCall.substring(0, staticCall.indexOf("."));
@@ -568,7 +568,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                         }
                     }
                     if (isParserArg) {
-                        if(va.getName().equals("_value")) {
+                        if (va.getName().equals("_value")) {
                             sb.append(va.getName().substring(1) + ((va.getChild() != null) ?
                                 "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : ""));
                         } else {
@@ -625,8 +625,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 sb.append(toVariableExpression(typeReference, va, parserArguments, serializerArguments, true, suppressPointerAccess));
             }
             return getCastExpressionForTypeReference(typeReference) + "(" + ((VariableLiteral) vl.getArgs().get(0)).getName() + "ArraySizeInBytes(" + sb.toString() + "))";
-        }
-        else if("CEIL".equals(vl.getName())) {
+        } else if ("CEIL".equals(vl.getName())) {
             Term va = vl.getArgs().get(0);
             // The Ceil function expects 64 bit floating point values.
             TypeReference tr = new DefaultFloatTypeReference(SimpleTypeReference.SimpleBaseType.FLOAT, 11, 52);
@@ -661,21 +660,21 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         // If the current property references a parserArguments property and that is a discriminator property, we also have to serialize it differently..
         else if ((vl.getChild() != null) && (getTypeReferenceForProperty(((ComplexTypeDefinition) getThisTypeDefinition()), vl.getName()) != null)) {
             final Optional<TypeReference> typeReferenceForProperty = getTypeReferenceForProperty(((ComplexTypeDefinition) getThisTypeDefinition()), vl.getName());
-            if(typeReferenceForProperty.isPresent() && typeReferenceForProperty.get() instanceof ComplexTypeReference) {
+            if (typeReferenceForProperty.isPresent() && typeReferenceForProperty.get() instanceof ComplexTypeReference) {
                 final TypeReference complexTypeReference = typeReferenceForProperty.get();
                 TypeDefinition typeDefinition = getTypeDefinitionForTypeReference(complexTypeReference);
-                if(typeDefinition instanceof ComplexTypeDefinition) {
+                if (typeDefinition instanceof ComplexTypeDefinition) {
                     ComplexTypeDefinition complexTypeDefinition = (ComplexTypeDefinition) typeDefinition;
                     String childProperty = vl.getChild().getName();
                     final Optional<Field> matchingDiscriminatorField = complexTypeDefinition.getFields().stream().filter(field -> (field instanceof DiscriminatorField) && ((DiscriminatorField) field).getName().equals(childProperty)).findFirst();
-                    if(matchingDiscriminatorField.isPresent()) {
+                    if (matchingDiscriminatorField.isPresent()) {
                         return "Cast" + getLanguageTypeNameForTypeReference(complexTypeReference) + "(" + vl.getName() + ")." + StringUtils.capitalize(childProperty) + "()";
                     }
                 }
             }
         }
         // If the current term references a serialization argument, handle it differently (don't prefix it with "m.")
-        else if((serializerArguments != null) && Arrays.stream(serializerArguments).anyMatch(argument -> argument.getName().equals(vl.getName()))) {
+        else if ((serializerArguments != null) && Arrays.stream(serializerArguments).anyMatch(argument -> argument.getName().equals(vl.getName()))) {
             return vl.getName() + ((vl.getChild() != null) ?
                 "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
         }
@@ -687,7 +686,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         int sizeInBits = 0;
         StringBuilder sb = new StringBuilder("");
         for (Field field : complexTypeDefinition.getFields()) {
-            if(field instanceof ArrayField) {
+            if (field instanceof ArrayField) {
                 ArrayField arrayField = (ArrayField) field;
                 final SimpleTypeReference type = (SimpleTypeReference) arrayField.getType();
                 switch (arrayField.getLoopType()) {
@@ -701,14 +700,13 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                         // No terminated.
                         break;
                 }
-            } else if(field instanceof TypedField) {
+            } else if (field instanceof TypedField) {
                 TypedField typedField = (TypedField) field;
                 final TypeReference type = typedField.getType();
-                if(field instanceof ManualField) {
+                if (field instanceof ManualField) {
                     ManualField manualField = (ManualField) field;
                     sb.append("(").append(toSerializationExpression(manualField, manualField.getLengthExpression(), parserArguments)).append(") + ");
-                }
-                else if(type instanceof SimpleTypeReference) {
+                } else if (type instanceof SimpleTypeReference) {
                     SimpleTypeReference simpleTypeReference = (SimpleTypeReference) type;
                     sizeInBits += simpleTypeReference.getSizeInBits();
                 } else {
@@ -720,16 +718,16 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public String escapeValue(TypeReference typeReference, String valueString) {
-        if(valueString == null) {
+        if (valueString == null) {
             return null;
         }
-        if(typeReference instanceof SimpleTypeReference) {
+        if (typeReference instanceof SimpleTypeReference) {
             SimpleTypeReference simpleTypeReference = (SimpleTypeReference) typeReference;
             switch (simpleTypeReference.getBaseType()) {
                 case UINT:
                 case INT:
                     // If it's a one character string and is numeric, output it as char.
-                    if(!NumberUtils.isParsable(valueString) && (valueString.length() == 1)) {
+                    if (!NumberUtils.isParsable(valueString) && (valueString.length() == 1)) {
                         return "'" + valueString + "'";
                     }
                     break;
@@ -747,7 +745,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             if ("null".equals(valueString)) {
                 return "0";
             }
-            if(valueString.contains(".")) {
+            if (valueString.contains(".")) {
                 String typeName = valueString.substring(0, valueString.indexOf('.'));
                 String constantName = valueString.substring(valueString.indexOf('.') + 1);
                 return typeName + "_" + constantName;
@@ -771,7 +769,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     public List<DiscriminatedComplexTypeDefinition> getUniqueSwitchCases(List<DiscriminatedComplexTypeDefinition> allSwitchCases) {
         Map<String, DiscriminatedComplexTypeDefinition> switchCases = new LinkedHashMap<>();
         for (DiscriminatedComplexTypeDefinition switchCase : allSwitchCases) {
-            if(!switchCases.containsKey(switchCase.getName())) {
+            if (!switchCases.containsKey(switchCase.getName())) {
                 switchCases.put(switchCase.getName(), switchCase);
             }
         }
@@ -782,21 +780,21 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         ComplexTypeDefinition complexTypeDefinition = (ComplexTypeDefinition) getThisTypeDefinition();
         List<String> imports = new ArrayList<>();
 
-        if(complexTypeDefinition.getAllPropertyFields().stream().anyMatch(field -> isArrayField(field) && getLanguageTypeNameForField(field).equals("int8"))) {
+        if (complexTypeDefinition.getAllPropertyFields().stream().anyMatch(field -> isArrayField(field) && getLanguageTypeNameForField(field).equals("int8"))) {
             imports.add("\"encoding/base64\"");
         }
 
         imports.add("\"encoding/xml\"");
 
         // For "Fields with complex type", constant, typeSwitch,  fields: "errors"
-        if(!complexTypeDefinition.getFields().isEmpty()) {
+        if (!complexTypeDefinition.getFields().isEmpty()) {
             imports.add("\"errors\"");
         }
 
         imports.add("\"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils\"");
 
         // At least one reserved field or simple field with complex type
-        if(complexTypeDefinition.getFields().stream().anyMatch(field ->
+        if (complexTypeDefinition.getFields().stream().anyMatch(field ->
             (field instanceof ReservedField))) {
             imports.add("log \"github.com/sirupsen/logrus\"");
         }
@@ -804,19 +802,19 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         imports.add("\"io\"");
 
         // For CEIL functions: "math"
-        if(complexTypeDefinition.getFields().stream().anyMatch(field ->
+        if (complexTypeDefinition.getFields().stream().anyMatch(field ->
             FieldUtils.contains(field, "CEIL"))) {
             imports.add("\"math\"");
         }
 
         // For Constant field: "strconv"
-        if(complexTypeDefinition.getFields().stream().anyMatch(field ->
+        if (complexTypeDefinition.getFields().stream().anyMatch(field ->
             (field instanceof ConstField))/* || complexTypeDefinition.getAllPropertyFields().stream().anyMatch(
                 propertyField -> isSimpleField(propertyField))*/) {
             imports.add("\"strconv\"");
         }
 
-        if(isDiscriminatedParentTypeDefinition()) {
+        if (isDiscriminatedParentTypeDefinition()) {
             imports.add("\"reflect\"");
             imports.add("\"strings\"");
         }
@@ -834,7 +832,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         imports.add("\"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils\"");
         imports.add("api \"github.com/apache/plc4x/plc4go/pkg/plc4go/values\"");
 
-        if(dataIo.getSwitchField().getCases().stream().anyMatch(typeCase ->
+        if (dataIo.getSwitchField().getCases().stream().anyMatch(typeCase ->
             (typeCase.getName().equals("TIME_OF_DAY") && hasFieldsWithNames(typeCase.getFields(), "hour", "minutes", "seconds")) ||
                 (typeCase.getName().equals("DATE") && hasFieldsWithNames(typeCase.getFields(), "year", "month", "day")) ||
                 (typeCase.getName().equals("DATE_AND_TIME") && hasFieldsWithNames(typeCase.getFields(), "year", "month", "day", "hour", "minutes", "seconds")))) {
@@ -844,84 +842,84 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public String getVariableName(Field field) {
-        if(!(field instanceof NamedField)) {
+        if (!(field instanceof NamedField)) {
             return "_";
         }
         NamedField namedField = (NamedField) field;
 
         String name = null;
         for (Field curField : ((ComplexTypeDefinition) getThisTypeDefinition()).getFields()) {
-            if(curField == field) {
+            if (curField == field) {
                 name = namedField.getName();
-            } else if(name != null) {
-                if(curField instanceof ArrayField) {
+            } else if (name != null) {
+                if (curField instanceof ArrayField) {
                     ArrayField arrayField = (ArrayField) curField;
-                    if(arrayField.getLoopExpression().contains(name)) {
+                    if (arrayField.getLoopExpression().contains(name)) {
                         return name;
                     }
-                } else if(curField instanceof ChecksumField) {
+                } else if (curField instanceof ChecksumField) {
                     ChecksumField checksumField = (ChecksumField) curField;
-                    if(checksumField.getChecksumExpression().contains(name)) {
+                    if (checksumField.getChecksumExpression().contains(name)) {
                         return name;
                     }
-                } else if(curField instanceof ImplicitField) {
+                } else if (curField instanceof ImplicitField) {
                     ImplicitField implicitField = (ImplicitField) curField;
-                    if(implicitField.getSerializeExpression().contains(name)) {
+                    if (implicitField.getSerializeExpression().contains(name)) {
                         return name;
                     }
-                } else if(curField instanceof ManualArrayField) {
+                } else if (curField instanceof ManualArrayField) {
                     ManualArrayField manualArrayField = (ManualArrayField) curField;
-                    if(manualArrayField.getLengthExpression().contains(name)) {
+                    if (manualArrayField.getLengthExpression().contains(name)) {
                         return name;
                     }
-                    if(manualArrayField.getLoopExpression().contains(name)) {
+                    if (manualArrayField.getLoopExpression().contains(name)) {
                         return name;
                     }
-                    if(manualArrayField.getParseExpression().contains(name)) {
+                    if (manualArrayField.getParseExpression().contains(name)) {
                         return name;
                     }
-                    if(manualArrayField.getSerializeExpression().contains(name)) {
+                    if (manualArrayField.getSerializeExpression().contains(name)) {
                         return name;
                     }
-                } else if(curField instanceof ManualField) {
+                } else if (curField instanceof ManualField) {
                     ManualField manualField = (ManualField) curField;
-                    if(manualField.getLengthExpression().contains(name)) {
+                    if (manualField.getLengthExpression().contains(name)) {
                         return name;
                     }
-                    if(manualField.getParseExpression().contains(name)) {
+                    if (manualField.getParseExpression().contains(name)) {
                         return name;
                     }
-                    if(manualField.getSerializeExpression().contains(name)) {
+                    if (manualField.getSerializeExpression().contains(name)) {
                         return name;
                     }
-                } else if(curField instanceof OptionalField) {
+                } else if (curField instanceof OptionalField) {
                     OptionalField optionalField = (OptionalField) curField;
-                    if(optionalField.getConditionExpression().contains(name)) {
+                    if (optionalField.getConditionExpression().contains(name)) {
                         return name;
                     }
-                } else if(curField instanceof SwitchField) {
+                } else if (curField instanceof SwitchField) {
                     SwitchField switchField = (SwitchField) curField;
                     for (Term discriminatorExpression : switchField.getDiscriminatorExpressions()) {
-                        if(discriminatorExpression.contains(name)) {
+                        if (discriminatorExpression.contains(name)) {
                             return name;
                         }
                     }
                     for (DiscriminatedComplexTypeDefinition curCase : switchField.getCases()) {
                         for (Argument parserArgument : curCase.getParserArguments()) {
-                            if(parserArgument.getName().equals(name)) {
+                            if (parserArgument.getName().equals(name)) {
                                 return name;
                             }
                         }
                     }
-                } else if(curField instanceof VirtualField) {
+                } else if (curField instanceof VirtualField) {
                     VirtualField virtualField = (VirtualField) curField;
-                    if(virtualField.getValueExpression().contains(name)) {
+                    if (virtualField.getValueExpression().contains(name)) {
                         return name;
                     }
                 }
-                if(curField.getParams() != null) {
+                if (curField.getParams() != null) {
                     for (Term param : curField.getParams()) {
-                        if(param.contains(name)) {
+                        if (param.contains(name)) {
                             return name;
                         }
                     }
@@ -933,14 +931,14 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public boolean needsVariable(ArrayField field, String variableName, boolean serialization) {
-        if(!serialization) {
+        if (!serialization) {
             if (field.getLoopExpression().contains(variableName)) {
                 return true;
             }
         }
-        if((field.getParams() != null) && (field.getParams().length > 0)){
+        if ((field.getParams() != null) && (field.getParams().length > 0)) {
             for (Term param : field.getParams()) {
-                if(param.contains(variableName)) {
+                if (param.contains(variableName)) {
                     return true;
                 }
             }
@@ -962,20 +960,20 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         boolean usesFunction = false;
         // As the ARRAY_SIZE_IN_BYTES only applies to ArrayFields, search for these
         for (Field curField : ((ComplexTypeDefinition) getThisTypeDefinition()).getFields()) {
-            if(curField instanceof ArrayField) {
+            if (curField instanceof ArrayField) {
                 ArrayField arrayField = (ArrayField) curField;
-                if(arrayField.getLoopExpression().contains(functionName)) {
+                if (arrayField.getLoopExpression().contains(functionName)) {
                     usesFunction = true;
                 }
                 result.put(arrayField.getName(), getLanguageTypeNameForField(arrayField));
-            } else if(curField instanceof ImplicitField) {
+            } else if (curField instanceof ImplicitField) {
                 ImplicitField implicitField = (ImplicitField) curField;
-                if(implicitField.getSerializeExpression().contains(functionName)) {
+                if (implicitField.getSerializeExpression().contains(functionName)) {
                     usesFunction = true;
                 }
             }
         }
-        if(usesFunction) {
+        if (usesFunction) {
             return result;
         } else {
             return Collections.emptyMap();
@@ -983,7 +981,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public boolean requiresStartPosAndCurPos() {
-        if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+        if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
             for (Field curField : ((ComplexTypeDefinition) getThisTypeDefinition()).getFields()) {
                 if (requiresVariable(curField, "curPos")) {
                     return true;
@@ -994,18 +992,18 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public boolean requiresVariable(Field curField, String variable) {
-        if(curField instanceof ArrayField) {
+        if (curField instanceof ArrayField) {
             ArrayField arrayField = (ArrayField) curField;
-            if(arrayField.getLoopExpression().contains(variable)) {
+            if (arrayField.getLoopExpression().contains(variable)) {
                 return true;
             }
-        } else if(curField instanceof OptionalField) {
+        } else if (curField instanceof OptionalField) {
             OptionalField optionalField = (OptionalField) curField;
-            if(optionalField.getConditionExpression().contains(variable)) {
+            if (optionalField.getConditionExpression().contains(variable)) {
                 return true;
             }
         }
-        if(curField.getParams() != null) {
+        if (curField.getParams() != null) {
             for (Term paramTerm : curField.getParams()) {
                 if (paramTerm.contains(variable)) {
                     return true;
@@ -1016,55 +1014,69 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public Term findTerm(Term baseTerm, String name) {
-        if(baseTerm instanceof VariableLiteral) {
+        if (baseTerm instanceof VariableLiteral) {
             VariableLiteral variableLiteral = (VariableLiteral) baseTerm;
-            if(variableLiteral.getName().equals(name)) {
+            if (variableLiteral.getName().equals(name)) {
                 return variableLiteral;
             }
-            if(variableLiteral.getChild() != null) {
+            if (variableLiteral.getChild() != null) {
                 Term found = findTerm(variableLiteral.getChild(), name);
-                if(found != null) {
+                if (found != null) {
                     return found;
                 }
             }
             for (Term arg : variableLiteral.getArgs()) {
                 Term found = findTerm(arg, name);
-                if(found != null) {
+                if (found != null) {
                     return found;
                 }
             }
-        } else if(baseTerm instanceof UnaryTerm) {
+        } else if (baseTerm instanceof UnaryTerm) {
             UnaryTerm unaryTerm = (UnaryTerm) baseTerm;
             Term found = findTerm(unaryTerm.getA(), name);
-            if(found != null) {
+            if (found != null) {
                 return found;
             }
-        } else if(baseTerm instanceof BinaryTerm) {
+        } else if (baseTerm instanceof BinaryTerm) {
             BinaryTerm binaryTerm = (BinaryTerm) baseTerm;
             Term found = findTerm(binaryTerm.getA(), name);
-            if(found != null) {
+            if (found != null) {
                 return found;
             }
             found = findTerm(binaryTerm.getB(), name);
-            if(found != null) {
+            if (found != null) {
                 return found;
             }
-        } else if(baseTerm instanceof TernaryTerm) {
+        } else if (baseTerm instanceof TernaryTerm) {
             TernaryTerm ternaryTerm = (TernaryTerm) baseTerm;
             Term found = findTerm(ternaryTerm.getA(), name);
-            if(found != null) {
+            if (found != null) {
                 return found;
             }
             found = findTerm(ternaryTerm.getB(), name);
-            if(found != null) {
+            if (found != null) {
                 return found;
             }
             found = findTerm(ternaryTerm.getC(), name);
-            if(found != null) {
+            if (found != null) {
                 return found;
             }
         }
         return null;
     }
 
+    public boolean isEnumExpression(String expression) {
+        if (!expression.contains(".")) {
+            return false;
+        }
+        String enumName = expression.substring(0, expression.indexOf('.'));
+        TypeDefinition typeDefinition = this.getTypeDefinitions().get(enumName);
+        return (typeDefinition instanceof EnumTypeDefinition);
+    }
+
+    public String getEnumExpression(String expression) {
+        String enumName = expression.substring(0, expression.indexOf('.'));
+        String enumConstant = expression.substring(expression.indexOf('.') + 1);
+        return enumName + "_" + enumConstant;
+    }
 }
diff --git a/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh
index 6750649..ff1d417 100644
--- a/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh
@@ -70,10 +70,10 @@ import (
     </#if>
 )
 
-func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (api.PlcValue, error) {
+func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type) && !helper.isEnumTypeReference(parserArgument.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (api.PlcValue, error) {
     switch {
     <#list type.switchField.cases as case>
-        case <#if case.discriminatorValues?has_content><#list case.discriminatorValues as discriminatorValue>${helper.toParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == <#if helper.discriminatorValueNeedsStringEqualityCheck(type.switchField.discriminatorExpressions[discriminatorValue?index])>"${discriminatorValue}"<#else>${discriminatorValue}</#if><#sep> && </#sep></#list></#if>: // ${case.name}
+        case <#if case.discriminatorValues?has_content><#list case.discriminatorValues as discriminatorValue>${helper.toParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == <#if helper.discriminatorValueNeedsStringEqualityCheck(type.switchField.discriminatorExpressions[discriminatorValue?index])>"${discriminatorValue}"<#elseif helper.isEnumExpression(discriminatorValue)>${helper.getEnumExpression(discriminatorValue)}<#else>$ [...]
         <#assign valueDefined=false>
         <#if case.name == "Struct">
             _map := map[string]api.PlcValue{}
@@ -167,10 +167,10 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
     return nil, errors.New("unsupported type")
 }
 
-func ${type.name}Serialize(io *utils.WriteBuffer, value api.PlcValue<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) error {
+func ${type.name}Serialize(io *utils.WriteBuffer, value api.PlcValue<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type) && !helper.isEnumTypeReference(parserArgument.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) error {
     switch {
     <#list type.switchField.cases as case>
-        case <#if case.discriminatorValues?has_content><#list case.discriminatorValues as discriminatorValue>${helper.toParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == <#if helper.discriminatorValueNeedsStringEqualityCheck(type.switchField.discriminatorExpressions[discriminatorValue?index])>"${discriminatorValue}"<#else>${discriminatorValue}</#if><#sep> && </#sep></#list></#if>: // ${case.name}
+        case <#if case.discriminatorValues?has_content><#list case.discriminatorValues as discriminatorValue>${helper.toParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == <#if helper.discriminatorValueNeedsStringEqualityCheck(type.switchField.discriminatorExpressions[discriminatorValue?index])>"${discriminatorValue}"<#elseif helper.isEnumExpression(discriminatorValue)>${helper.getEnumExpression(discriminatorValue)}<#else>$ [...]
         <#list case.fields as field>
             <#switch field.typeName>
                 <#case "array">
diff --git a/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml b/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml
index e79846d..6ad045f 100644
--- a/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml
+++ b/plc4go/assets/testing/protocols/knxnetip/ParserSerializerTestsuite.xml
@@ -416,6 +416,7 @@
           <additionalInformation/>
           <dataFrame className="org.apache.plc4x.java.knxnetip.readwrite.LDataFrameDataExt">
             <repeated>true</repeated>
+            <notAckFrame>true</notAckFrame>
             <priority>LOW</priority>
             <acknowledgeRequested>false</acknowledgeRequested>
             <errorFlag>false</errorFlag>
@@ -428,15 +429,15 @@
               <subGroup>10</subGroup>
             </sourceAddress>
             <destinationAddress>Egw=</destinationAddress>
-            <dataLength>1</dataLength>
-            <control>false</control>
-            <numbered>false</numbered>
-            <counter>0</counter>
-            <controlType/>
-            <apci>GROUP_VALUE_WRITE_PDU</apci>
-            <extendedApci/>
-            <dataFirstByte>1</dataFirstByte>
-            <data></data>
+            <apdu className="org.apache.plc4x.java.knxnetip.readwrite.ApduDataContainer">
+              <dataLength>1</dataLength>
+              <numbered>false</numbered>
+              <counter>0</counter>
+              <dataApdu className="org.apache.plc4x.java.knxnetip.readwrite.ApduDataGroupValueWrite">
+                <dataFirstByte>1</dataFirstByte>
+                <data></data>
+              </dataApdu>
+            </apdu>
           </dataFrame>
         </cemi>
       </TunnelingRequest>
@@ -476,6 +477,7 @@
           </additionalInformation>
           <dataFrame className="org.apache.plc4x.java.knxnetip.readwrite.LDataFrameDataExt">
             <repeated>true</repeated>
+            <notAckFrame>true</notAckFrame>
             <priority>LOW</priority>
             <acknowledgeRequested>false</acknowledgeRequested>
             <errorFlag>false</errorFlag>
@@ -488,15 +490,12 @@
               <subGroup>30</subGroup>
             </sourceAddress>
             <destinationAddress>DOE=</destinationAddress>
-            <dataLength>0</dataLength>
-            <control>true</control>
-            <numbered>false</numbered>
-            <counter>0</counter>
-            <controlType>DISCONNECT</controlType>
-            <apci/>
-            <extendedApci/>
-            <dataFirstByte/>
-            <data></data>
+            <apdu className="org.apache.plc4x.java.knxnetip.readwrite.ApduControlContainer">
+              <dataLength>0</dataLength>
+              <numbered>false</numbered>
+              <counter>0</counter>
+              <controlApdu className="org.apache.plc4x.java.knxnetip.readwrite.ApduControlDisconnect"/>
+            </apdu>
           </dataFrame>
           <crc>13</crc>
         </cemi>
diff --git a/plc4go/cmd/main/drivers/knxnetip_test.go b/plc4go/cmd/main/drivers/knxnetip_test.go
index 1ac5f96..5e42309 100644
--- a/plc4go/cmd/main/drivers/knxnetip_test.go
+++ b/plc4go/cmd/main/drivers/knxnetip_test.go
@@ -279,9 +279,8 @@ func TestKnxNetIpPlc4goPropertyRead(t *testing.T) {
 	defer connection.Close()
 
 	readRequestBuilder := connection.ReadRequestBuilder()
-	readRequestBuilder.AddItem("manufacturerId", "1.1.10/0/12")
+    readRequestBuilder.AddItem("manufacturerId", "1.1.10/0/12")
 	readRequestBuilder.AddItem("programVersion", "1.1.10/3/13")
-	//readRequestBuilder.AddItem("hardwareType", "1.1.10/0/78")
 	readRequest, _ := readRequestBuilder.Build()
 
 	rrr := readRequest.Execute()
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go
index 1d255c6..49f7eba 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go
@@ -28,13 +28,14 @@ import (
 
 type KnxNetIpField interface {
 	IsPatternField() bool
+    GetFieldType() *driverModel.KnxDatapointType
 	matches(knxGroupAddress *driverModel.KnxGroupAddress) bool
 	toGroupAddress() *driverModel.KnxGroupAddress
 	apiModel.PlcField
 }
 
 type KnxNetIpGroupAddress3LevelPlcField struct {
-	FieldType *driverModel.KnxDatapointSubtype
+	FieldType *driverModel.KnxDatapointType
 	// 5 Bits: Values 0-31
 	MainGroup string
 	// 3 Bits: values 0-7
@@ -44,7 +45,7 @@ type KnxNetIpGroupAddress3LevelPlcField struct {
 	KnxNetIpField
 }
 
-func NewKnxNetIpGroupAddress3LevelPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string, middleGroup string, subGroup string) KnxNetIpGroupAddress3LevelPlcField {
+func NewKnxNetIpGroupAddress3LevelPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string, middleGroup string, subGroup string) KnxNetIpGroupAddress3LevelPlcField {
 	return KnxNetIpGroupAddress3LevelPlcField{
 		FieldType:   fieldType,
 		MainGroup:   mainGroup,
@@ -57,6 +58,10 @@ func (k KnxNetIpGroupAddress3LevelPlcField) GetTypeName() string {
 	return k.FieldType.Name()
 }
 
+func (k KnxNetIpGroupAddress3LevelPlcField) GetFieldType() *driverModel.KnxDatapointType {
+    return k.FieldType
+}
+
 func (k KnxNetIpGroupAddress3LevelPlcField) GetQuantity() uint16 {
 	return 1
 }
@@ -110,7 +115,7 @@ func (k KnxNetIpGroupAddress3LevelPlcField) toGroupAddress() *driverModel.KnxGro
 }
 
 type KnxNetIpGroupAddress2LevelPlcField struct {
-	FieldType *driverModel.KnxDatapointSubtype
+	FieldType *driverModel.KnxDatapointType
 	// 5 Bits: Values 0-31
 	MainGroup string
 	// 11 Bits
@@ -118,7 +123,7 @@ type KnxNetIpGroupAddress2LevelPlcField struct {
 	KnxNetIpField
 }
 
-func NewKnxNetIpGroupAddress2LevelPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string, subGroup string) KnxNetIpGroupAddress2LevelPlcField {
+func NewKnxNetIpGroupAddress2LevelPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string, subGroup string) KnxNetIpGroupAddress2LevelPlcField {
 	return KnxNetIpGroupAddress2LevelPlcField{
 		FieldType: fieldType,
 		MainGroup: mainGroup,
@@ -130,6 +135,10 @@ func (k KnxNetIpGroupAddress2LevelPlcField) GetTypeName() string {
 	return k.FieldType.Name()
 }
 
+func (k KnxNetIpGroupAddress2LevelPlcField) GetFieldType() *driverModel.KnxDatapointType {
+    return k.FieldType
+}
+
 func (k KnxNetIpGroupAddress2LevelPlcField) GetQuantity() uint16 {
 	return 1
 }
@@ -174,13 +183,13 @@ func (k KnxNetIpGroupAddress2LevelPlcField) toGroupAddress() *driverModel.KnxGro
 }
 
 type KnxNetIpGroupAddress1LevelPlcField struct {
-	FieldType *driverModel.KnxDatapointSubtype
+	FieldType *driverModel.KnxDatapointType
 	// 16 Bits
 	MainGroup string
 	KnxNetIpField
 }
 
-func NewKnxNetIpGroupAddress1LevelPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string) KnxNetIpGroupAddress1LevelPlcField {
+func NewKnxNetIpGroupAddress1LevelPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string) KnxNetIpGroupAddress1LevelPlcField {
 	return KnxNetIpGroupAddress1LevelPlcField{
 		FieldType: fieldType,
 		MainGroup: mainGroup,
@@ -191,6 +200,10 @@ func (k KnxNetIpGroupAddress1LevelPlcField) GetTypeName() string {
 	return k.FieldType.Name()
 }
 
+func (k KnxNetIpGroupAddress1LevelPlcField) GetFieldType() *driverModel.KnxDatapointType {
+    return k.FieldType
+}
+
 func (k KnxNetIpGroupAddress1LevelPlcField) GetQuantity() uint16 {
 	return 1
 }
@@ -226,7 +239,7 @@ func (k KnxNetIpGroupAddress1LevelPlcField) toGroupAddress() *driverModel.KnxGro
 }
 
 type KnxNetIpDevicePropertyAddressPlcField struct {
-	FieldType *driverModel.KnxDatapointSubtype
+	FieldType *driverModel.KnxDatapointType
 	// 5 Bits: Values 0-31
 	MainGroup string
 	// 3 Bits: values 0-7
@@ -238,7 +251,7 @@ type KnxNetIpDevicePropertyAddressPlcField struct {
 	KnxNetIpField
 }
 
-func NewKnxNetIpDevicePropertyAddressPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string, middleGroup string, subGroup string, objectId string, propertyId string) KnxNetIpDevicePropertyAddressPlcField {
+func NewKnxNetIpDevicePropertyAddressPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string, middleGroup string, subGroup string, objectId string, propertyId string) KnxNetIpDevicePropertyAddressPlcField {
 	return KnxNetIpDevicePropertyAddressPlcField{
 		FieldType:   fieldType,
 		MainGroup:   mainGroup,
@@ -253,6 +266,10 @@ func (k KnxNetIpDevicePropertyAddressPlcField) GetTypeName() string {
 	return k.FieldType.Name()
 }
 
+func (k KnxNetIpDevicePropertyAddressPlcField) GetFieldType() *driverModel.KnxDatapointType {
+    return k.FieldType
+}
+
 func (k KnxNetIpDevicePropertyAddressPlcField) GetQuantity() uint16 {
 	return 1
 }
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go
index 8490018..2971763 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go
@@ -63,30 +63,30 @@ func NewFieldHandler() FieldHandler {
 func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
 	if match := utils.GetSubgroupMatches(m.knxNetIpDeviceQuery, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointSubtype
+		var fieldType driverModel.KnxDatapointType
 		if ok {
-			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpDevicePropertyAddressPlcField(&fieldType, match["mainGroup"], match["middleGroup"], match["subGroup"], match["objectId"], match["propertyId"]), nil
 	} else if match := utils.GetSubgroupMatches(m.knxNetIpGroupAddress3Level, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointSubtype
+		var fieldType driverModel.KnxDatapointType
 		if ok {
-			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpGroupAddress3LevelPlcField(&fieldType, match["mainGroup"], match["middleGroup"], match["subGroup"]), nil
 	} else if match := utils.GetSubgroupMatches(m.knxNetIpGroupAddress2Level, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointSubtype
+		var fieldType driverModel.KnxDatapointType
 		if ok {
-			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpGroupAddress2LevelPlcField(&fieldType, match["mainGroup"], match["subGroup"]), nil
 	} else if match := utils.GetSubgroupMatches(m.knxNetIpGroupAddress1Level, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointSubtype
+		var fieldType driverModel.KnxDatapointType
 		if ok {
-			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpGroupAddress1LevelPlcField(&fieldType, match["mainGroup"]), nil
 	}
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go
index d658b5f..7eb29bc 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go
@@ -19,380 +19,384 @@
 package knxnetip
 
 import (
-	"errors"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite"
-	driverModel "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite/model"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
-	internalModel "github.com/apache/plc4x/plc4go/internal/plc4go/spi/model"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
-	internalValues "github.com/apache/plc4x/plc4go/internal/plc4go/spi/values"
-	apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
-	apiValues "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
-	"strconv"
-	"time"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite"
+    driverModel "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite/model"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+    internalModel "github.com/apache/plc4x/plc4go/internal/plc4go/spi/model"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    internalValues "github.com/apache/plc4x/plc4go/internal/plc4go/spi/values"
+    apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+    apiValues "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
+    "strconv"
+    "time"
 )
 
 type KnxNetIpReader struct {
-	connection *KnxNetIpConnection
-	spi.PlcReader
+    connection *KnxNetIpConnection
+    spi.PlcReader
 }
 
 func NewKnxNetIpReader(connection *KnxNetIpConnection) *KnxNetIpReader {
-	return &KnxNetIpReader{
-		connection: connection,
-	}
+    return &KnxNetIpReader{
+        connection: connection,
+    }
 }
 
 func (m KnxNetIpReader) Read(readRequest apiModel.PlcReadRequest) <-chan apiModel.PlcReadRequestResult {
-	resultChan := make(chan apiModel.PlcReadRequestResult)
-	go func() {
-		responseCodes := map[string]apiModel.PlcResponseCode{}
-		plcValues := map[string]apiValues.PlcValue{}
-
-		// Sort the fields in direct properties, which will have to be actively read from the devices
-		// and group-addresses which will be locally processed from the local cache.
-		directProperties := map[driverModel.KnxAddress]map[string]KnxNetIpDevicePropertyAddressPlcField{}
-		groupAddresses := map[string]KnxNetIpField{}
-		for _, fieldName := range readRequest.GetFieldNames() {
-			// Get the knx field
-			field, err := CastToKnxNetIpFieldFromPlcField(readRequest.GetField(fieldName))
-			if err != nil {
-				responseCodes[fieldName] = apiModel.PlcResponseCode_INVALID_ADDRESS
-				plcValues[fieldName] = nil
-				continue
-			}
-
-			switch field.(type) {
-			case KnxNetIpDevicePropertyAddressPlcField:
-				propertyField := field.(KnxNetIpDevicePropertyAddressPlcField)
-				knxAddress := FieldToKnxAddress(propertyField)
-				if knxAddress == nil {
-					continue
-				}
-				if _, ok := directProperties[*knxAddress]; !ok {
-					directProperties[*knxAddress] = map[string]KnxNetIpDevicePropertyAddressPlcField{}
-				}
-				directProperties[*knxAddress][fieldName] = propertyField
-			default:
-				groupAddresses[fieldName] = field
-			}
-		}
-
-		// Process the direct properties.
-		// Connect to each knx device and read all of the properties on that particular device.
-		// Finish up by explicitly disconnecting after all properties on the device have been read.
-		for deviceAddress, fields := range directProperties {
-			// Connect to the device
-			err := m.connectToDevice(deviceAddress)
-			// If something went wrong all field for this device are equally failed
-			if err != nil {
-				for fieldName := range fields {
-					responseCodes[fieldName] = apiModel.PlcResponseCode_INVALID_ADDRESS
-					plcValues[fieldName] = nil
-				}
-				continue
-			}
-
-			// Collect all the properties on this device
-			counter := uint8(1)
-			for fieldName, field := range fields {
-				responseCode, plcValue := m.readDeviceProperty(field, counter)
-				responseCodes[fieldName] = responseCode
-				plcValues[fieldName] = plcValue
-				counter++
-			}
-
-			// Disconnect from the device
-			_ = m.disconnectFromDevice(*m.connection.ClientKnxAddress, deviceAddress)
-			// In this case we ignore if something goes wrong
-		}
-
-		// Get the group address values from the cache
-		for fieldName, field := range groupAddresses {
-			responseCode, plcValue := m.readGroupAddress(field)
-			responseCodes[fieldName] = responseCode
-			plcValues[fieldName] = plcValue
-		}
-
-		// Assemble the results
-		result := internalModel.NewDefaultPlcReadResponse(readRequest, responseCodes, plcValues)
-		resultChan <- apiModel.PlcReadRequestResult{
-			Request:  readRequest,
-			Response: result,
-			Err:      nil,
-		}
-	}()
-	return resultChan
+    resultChan := make(chan apiModel.PlcReadRequestResult)
+    go func() {
+        responseCodes := map[string]apiModel.PlcResponseCode{}
+        plcValues := map[string]apiValues.PlcValue{}
+
+        // Sort the fields in direct properties, which will have to be actively read from the devices
+        // and group-addresses which will be locally processed from the local cache.
+        directProperties := map[driverModel.KnxAddress]map[string]KnxNetIpDevicePropertyAddressPlcField{}
+        groupAddresses := map[string]KnxNetIpField{}
+        for _, fieldName := range readRequest.GetFieldNames() {
+            // Get the knx field
+            field, err := CastToKnxNetIpFieldFromPlcField(readRequest.GetField(fieldName))
+            if err != nil {
+                responseCodes[fieldName] = apiModel.PlcResponseCode_INVALID_ADDRESS
+                plcValues[fieldName] = nil
+                continue
+            }
+
+            switch field.(type) {
+            case KnxNetIpDevicePropertyAddressPlcField:
+                propertyField := field.(KnxNetIpDevicePropertyAddressPlcField)
+                knxAddress := FieldToKnxAddress(propertyField)
+                if knxAddress == nil {
+                    continue
+                }
+                if _, ok := directProperties[*knxAddress]; !ok {
+                    directProperties[*knxAddress] = map[string]KnxNetIpDevicePropertyAddressPlcField{}
+                }
+                directProperties[*knxAddress][fieldName] = propertyField
+            default:
+                groupAddresses[fieldName] = field
+            }
+        }
+
+        // Process the direct properties.
+        // Connect to each knx device and read all of the properties on that particular device.
+        // Finish up by explicitly disconnecting after all properties on the device have been read.
+        for deviceAddress, fields := range directProperties {
+            // Connect to the device
+            err := m.connectToDevice(deviceAddress)
+            // If something went wrong all field for this device are equally failed
+            if err != nil {
+                for fieldName := range fields {
+                    responseCodes[fieldName] = apiModel.PlcResponseCode_INVALID_ADDRESS
+                    plcValues[fieldName] = nil
+                }
+                continue
+            }
+
+            // Collect all the properties on this device
+            counter := uint8(1)
+            for fieldName, field := range fields {
+                responseCode, plcValue := m.readDeviceProperty(field, counter)
+                responseCodes[fieldName] = responseCode
+                plcValues[fieldName] = plcValue
+                counter++
+            }
+
+            // Disconnect from the device
+            _ = m.disconnectFromDevice(*m.connection.ClientKnxAddress, deviceAddress)
+            // In this case we ignore if something goes wrong
+        }
+
+        // Get the group address values from the cache
+        for fieldName, field := range groupAddresses {
+            responseCode, plcValue := m.readGroupAddress(field)
+            responseCodes[fieldName] = responseCode
+            plcValues[fieldName] = plcValue
+        }
+
+        // Assemble the results
+        result := internalModel.NewDefaultPlcReadResponse(readRequest, responseCodes, plcValues)
+        resultChan <- apiModel.PlcReadRequestResult{
+            Request:  readRequest,
+            Response: result,
+            Err:      nil,
+        }
+    }()
+    return resultChan
 }
 
 func (m KnxNetIpReader) connectToDevice(targetAddress driverModel.KnxAddress) error {
-	connectionSuccess := make(chan bool)
-	deviceConnectionRequest := driverModel.NewTunnelingRequest(
-		driverModel.NewTunnelingRequestDataBlock(0, 0),
-		driverModel.NewLDataReq(0, nil,
-			driverModel.NewLDataFrameDataExt(false, 6, 0,
-				driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
-				driverModel.NewApduControlContainer(driverModel.NewApduControlConnect(), 0, false, 0),
-				true, true, driverModel.CEMIPriority_SYSTEM,  false, false)))
-
-	// Send the request
-	err := m.connection.SendRequest(
-		deviceConnectionRequest,
-		// The Gateway is now supposed to send an Ack to this request.
-		func(message interface{}) bool {
-			tunnelingRequest := driverModel.CastTunnelingRequest(message)
-			if tunnelingRequest == nil ||
-				tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.connection.CommunicationChannelId {
-				return false
-			}
-			lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
-			return lDataCon != nil
-		},
-		func(message interface{}) error {
-			tunnelingRequest := driverModel.CastTunnelingRequest(message)
-			lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
-			// If the error flag is set, there was an error connecting
-			if lDataCon.DataFrame.ErrorFlag {
-				connectionSuccess <- false
-			}
-
-			// Now for some reason it seems as if we need to implement a Device Descriptor read.
-			deviceDescriptorReadRequest := driverModel.NewTunnelingRequest(
-				driverModel.NewTunnelingRequestDataBlock(0, 0),
-				driverModel.NewLDataReq(0, nil,
-					driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
-						driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
-                        driverModel.NewApduDataContainer(driverModel.NewApduDataDeviceDescriptorRead(), 0, false, 0),
-						true, true, driverModel.CEMIPriority_LOW, false, false)))
-			_ = m.connection.SendRequest(
-				deviceDescriptorReadRequest,
-				func(message interface{}) bool {
-					tunnelingRequest := driverModel.CastTunnelingRequest(message)
-					if tunnelingRequest == nil ||
-						tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.connection.CommunicationChannelId {
-						return false
-					}
-					lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
-					if lDataInd == nil {
-						return false
-					}
-					dataFrame := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
-					if dataFrame == nil {
-						return false
-					}
-					if dataFrame.Apdu == nil {
-						return false
-					}
-					return true
-					//return *dataFrame.Apdu.Apci == driverModel.APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU
-					// TODO: Do something with the request ...
-				},
-				func(message interface{}) error {
-					// Send back an ACK
-					_ = m.connection.Send(
-						driverModel.NewTunnelingRequest(
-							driverModel.NewTunnelingRequestDataBlock(0, 0),
-							driverModel.NewLDataReq(0, nil,
-								driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
-									driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
-									driverModel.NewApduControlContainer(driverModel.NewApduControlAck(), 0, false, 0),
-									true, true, driverModel.CEMIPriority_SYSTEM, false, false))))
-					// Now we can finally read properties.
-					connectionSuccess <- true
-					return nil
-				},
-				time.Second*5)
-			return nil
-		},
-		time.Second*1)
-
-	if err != nil {
-		return errors.New("could not connect to device (Error sending connection request)")
-	}
-	select {
-	case result := <-connectionSuccess:
-		if !result {
-			return errors.New("could not connect to device (NACK)")
-		}
-	case <-time.After(time.Second * 5):
-		return errors.New("could not connect to device (Timeout)")
-	}
-	return nil
+    connectionSuccess := make(chan bool)
+    deviceConnectionRequest := driverModel.NewTunnelingRequest(
+        driverModel.NewTunnelingRequestDataBlock(0, 0),
+        driverModel.NewLDataReq(0, nil,
+            driverModel.NewLDataFrameDataExt(false, 6, 0,
+                driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
+                driverModel.NewApduControlContainer(driverModel.NewApduControlConnect(), 0, false, 0),
+                true, true, driverModel.CEMIPriority_SYSTEM, false, false)))
+
+    // Send the request
+    err := m.connection.SendRequest(
+        deviceConnectionRequest,
+        // The Gateway is now supposed to send an Ack to this request.
+        func(message interface{}) bool {
+            tunnelingRequest := driverModel.CastTunnelingRequest(message)
+            if tunnelingRequest == nil ||
+                tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.connection.CommunicationChannelId {
+                return false
+            }
+            lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
+            return lDataCon != nil
+        },
+        func(message interface{}) error {
+            tunnelingRequest := driverModel.CastTunnelingRequest(message)
+            lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
+            // If the error flag is set, there was an error connecting
+            if lDataCon.DataFrame.ErrorFlag {
+                connectionSuccess <- false
+            }
+
+            // Now for some reason it seems as if we need to implement a Device Descriptor read.
+            deviceDescriptorReadRequest := driverModel.NewTunnelingRequest(
+                driverModel.NewTunnelingRequestDataBlock(0, 0),
+                driverModel.NewLDataReq(0, nil,
+                    driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
+                        driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
+                        driverModel.NewApduDataContainer(driverModel.NewApduDataDeviceDescriptorRead(0), 1, true, 0),
+                        true, true, driverModel.CEMIPriority_LOW, false, false)))
+            _ = m.connection.SendRequest(
+                deviceDescriptorReadRequest,
+                func(message interface{}) bool {
+                    tunnelingRequest := driverModel.CastTunnelingRequest(message)
+                    if tunnelingRequest == nil ||
+                        tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.connection.CommunicationChannelId {
+                        return false
+                    }
+                    lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
+                    if lDataInd == nil {
+                        return false
+                    }
+                    dataFrame := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
+                    if dataFrame == nil {
+                        return false
+                    }
+                    dataContainer := driverModel.CastApduDataContainer(dataFrame.Apdu)
+                    if dataContainer == nil {
+                        return false
+                    }
+                    deviceDescriptorResponse := driverModel.CastApduDataDeviceDescriptorResponse(dataContainer.DataApdu)
+                    if deviceDescriptorResponse == nil {
+                        return false
+                    }
+                    return true
+                    //return *dataFrame.Apdu.Apci == driverModel.APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU
+                    // TODO: Do something with the request ...
+                },
+                func(message interface{}) error {
+                    // Send back an ACK
+                    _ = m.connection.Send(
+                        driverModel.NewTunnelingRequest(
+                            driverModel.NewTunnelingRequestDataBlock(0, 0),
+                            driverModel.NewLDataReq(0, nil,
+                                driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
+                                    driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
+                                    driverModel.NewApduControlContainer(driverModel.NewApduControlAck(), 0, true, 0),
+                                    true, true, driverModel.CEMIPriority_SYSTEM, false, false))))
+                    // Now we can finally read properties.
+                    connectionSuccess <- true
+                    return nil
+                },
+                time.Second*5)
+            return nil
+        },
+        time.Second*1)
+
+    if err != nil {
+        return errors.New("could not connect to device (Error sending connection request)")
+    }
+    select {
+    case result := <-connectionSuccess:
+        if !result {
+            return errors.New("could not connect to device (NACK)")
+        }
+    case <-time.After(time.Second * 5):
+        return errors.New("could not connect to device (Timeout)")
+    }
+    return nil
 }
 
 func (m KnxNetIpReader) disconnectFromDevice(sourceAddress driverModel.KnxAddress, targetAddress driverModel.KnxAddress) error {
-	deviceConnectionRequest := driverModel.NewTunnelingRequest(
-		driverModel.NewTunnelingRequestDataBlock(0, 0),
-		driverModel.NewLDataReq(0, nil,
-			driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
-				&sourceAddress, KnxAddressToInt8Array(targetAddress),
-                driverModel.NewApduControlContainer(driverModel.NewApduControlDisconnect(), 0, false,0),
+    deviceConnectionRequest := driverModel.NewTunnelingRequest(
+        driverModel.NewTunnelingRequestDataBlock(0, 0),
+        driverModel.NewLDataReq(0, nil,
+            driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
+                &sourceAddress, KnxAddressToInt8Array(targetAddress),
+                driverModel.NewApduControlContainer(driverModel.NewApduControlDisconnect(), 0, false, 0),
                 true, true, driverModel.CEMIPriority_SYSTEM, false, false)))
 
-	// Send the request
-	connectionSuccess := make(chan bool)
-	err := m.connection.SendRequest(
-		deviceConnectionRequest,
-		// The Gateway is now supposed to send an Ack to this request.
-		func(message interface{}) bool {
-			tunnelingRequest := driverModel.CastTunnelingRequest(message)
-			if tunnelingRequest == nil ||
-				tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.connection.CommunicationChannelId {
-				return false
-			}
-			lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
-			if lDataCon == nil {
-				return false
-			}
-			frameDataExt := driverModel.CastLDataFrameDataExt(lDataCon.DataFrame)
-			if frameDataExt == nil {
-				return false
-			}
-			return true
-			//return frameDataExt.Control == true && frameDataExt.ControlType == nil
-		},
-		func(message interface{}) error {
-			tunnelingRequest := driverModel.CastTunnelingRequest(message)
-			lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
-			_ = driverModel.CastLDataFrameDataExt(lDataCon.DataFrame)
-			//if *frameDataExt.ControlType == driverModel.ControlType_DISCONNECT {
-				connectionSuccess <- false
-			//}
-			return nil
-		},
-		time.Second*1)
-
-	if err != nil {
-		return errors.New("could not connect to device (Error sending connection request)")
-	}
-	select {
-	case result := <-connectionSuccess:
-		if !result {
-			return errors.New("could not connect to device (NACK)")
-		}
-	case <-time.After(time.Second * 5):
-		return errors.New("could not connect to device (Timeout)")
-	}
-	return nil
+    // Send the request
+    connectionSuccess := make(chan bool)
+    err := m.connection.SendRequest(
+        deviceConnectionRequest,
+        // The Gateway is now supposed to send an Ack to this request.
+        func(message interface{}) bool {
+            tunnelingRequest := driverModel.CastTunnelingRequest(message)
+            if tunnelingRequest == nil ||
+                tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.connection.CommunicationChannelId {
+                return false
+            }
+            lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
+            if lDataCon == nil {
+                return false
+            }
+            frameDataExt := driverModel.CastLDataFrameDataExt(lDataCon.DataFrame)
+            if frameDataExt == nil {
+                return false
+            }
+            return true
+            //return frameDataExt.Control == true && frameDataExt.ControlType == nil
+        },
+        func(message interface{}) error {
+            tunnelingRequest := driverModel.CastTunnelingRequest(message)
+            lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
+            _ = driverModel.CastLDataFrameDataExt(lDataCon.DataFrame)
+            //if *frameDataExt.ControlType == driverModel.ControlType_DISCONNECT {
+            connectionSuccess <- false
+            //}
+            return nil
+        },
+        time.Second*1)
+
+    if err != nil {
+        return errors.New("could not connect to device (Error sending connection request)")
+    }
+    select {
+    case result := <-connectionSuccess:
+        if !result {
+            return errors.New("could not connect to device (NACK)")
+        }
+    case <-time.After(time.Second * 5):
+        return errors.New("could not connect to device (Timeout)")
+    }
+    return nil
 }
 
 type readPropertyResult struct {
-	plcValue     apiValues.PlcValue
-	responseCode apiModel.PlcResponseCode
+    plcValue     apiValues.PlcValue
+    responseCode apiModel.PlcResponseCode
 }
 
 func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPlcField, counter uint8) (apiModel.PlcResponseCode, apiValues.PlcValue) {
-	// TODO: We'll add this as time progresses, for now we only support fully qualified addresses
-	if field.IsPatternField() {
-		return apiModel.PlcResponseCode_UNSUPPORTED, nil
-	}
-
-	destinationAddress := FieldToKnxAddress(field)
-	destinationAddressBuffer := utils.NewWriteBuffer()
-	err := destinationAddress.Serialize(*destinationAddressBuffer)
-	if err != nil {
-		return apiModel.PlcResponseCode_INTERNAL_ERROR, nil
-	}
-	destinationAddressData := utils.Uint8ArrayToInt8Array(destinationAddressBuffer.GetBytes())
-	objectId, _ := strconv.Atoi(field.ObjectId)
-	propertyId, _ := strconv.Atoi(field.PropertyId)
-
-	request := driverModel.NewTunnelingRequest(
-		driverModel.NewTunnelingRequestDataBlock(0, 0),
-		driverModel.NewLDataReq(0, nil,
-			driverModel.NewLDataFrameDataExt(false, 6, 0,
-				driverModel.NewKnxAddress(0, 0, 0),
+    // TODO: We'll add this as time progresses, for now we only support fully qualified addresses
+    if field.IsPatternField() {
+        return apiModel.PlcResponseCode_UNSUPPORTED, nil
+    }
+
+    destinationAddress := FieldToKnxAddress(field)
+    destinationAddressBuffer := utils.NewWriteBuffer()
+    err := destinationAddress.Serialize(*destinationAddressBuffer)
+    if err != nil {
+        return apiModel.PlcResponseCode_INTERNAL_ERROR, nil
+    }
+    destinationAddressData := utils.Uint8ArrayToInt8Array(destinationAddressBuffer.GetBytes())
+    objectId, _ := strconv.Atoi(field.ObjectId)
+    propertyId, _ := strconv.Atoi(field.PropertyId)
+
+    request := driverModel.NewTunnelingRequest(
+        driverModel.NewTunnelingRequestDataBlock(0, 0),
+        driverModel.NewLDataReq(0, nil,
+            driverModel.NewLDataFrameDataExt(false, 6, 0,
+                driverModel.NewKnxAddress(0, 0, 0),
                 destinationAddressData,
-				driverModel.NewApduDataContainer(driverModel.NewApduDataOther(
-				    // TODO: The counter should be incremented per KNX individual address
-				    driverModel.NewApduDataExtPropertyValueRead(uint8(objectId), uint8(propertyId), 1, 1)), 0, true, 1),
-				 true, true,  driverModel.CEMIPriority_SYSTEM, false, false)))
-
-	result := make(chan readPropertyResult)
-	err = m.connection.SendRequest(
-		request,
-		// Even if there are multiple messages being exchanged because of the request
-		// We are not interested in most of them. The one containing the response is
-		// an LData.ind from the destination address to our client address with the given
-		// object-id and property-id.
-		func(message interface{}) bool {
-			tunnelingRequest := driverModel.CastTunnelingRequest(message)
-			if tunnelingRequest == nil {
-				return false
-			}
-			lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
-			if lDataInd == nil {
-				return false
-			}
-			dataFrameExt := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
-			if dataFrameExt != nil && dataFrameExt.Apdu != nil {
-                otherPdu := driverModel.CastApduDataOther(*dataFrameExt.Apdu)
+                driverModel.NewApduDataContainer(
+                    driverModel.NewApduDataOther(
+                        // TODO: The counter should be incremented per KNX individual address
+                        driverModel.NewApduDataExtPropertyValueRead(uint8(objectId), uint8(propertyId), 1, 1)), 5, true, counter),
+                true, true, driverModel.CEMIPriority_LOW, false, false)))
+
+    result := make(chan readPropertyResult)
+    err = m.connection.SendRequest(
+        request,
+        // Even if there are multiple messages being exchanged because of the request
+        // We are not interested in most of them. The one containing the response is
+        // an LData.ind from the destination address to our client address with the given
+        // object-id and property-id.
+        func(message interface{}) bool {
+            tunnelingRequest := driverModel.CastTunnelingRequest(message)
+            if tunnelingRequest == nil {
+                return false
+            }
+            lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
+            if lDataInd == nil {
+                return false
+            }
+            dataFrameExt := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
+            if dataFrameExt != nil && dataFrameExt.Apdu != nil {
+                apduDataContainer := driverModel.CastApduDataContainer(dataFrameExt.Apdu)
+                if apduDataContainer == nil {
+                    return false
+                }
+                otherPdu := driverModel.CastApduDataOther(apduDataContainer.DataApdu)
                 if otherPdu == nil {
-					return false
-				}
-
+                    return false
+                }
                 propertyValueResponse := driverModel.CastApduDataExtPropertyValueResponse(otherPdu.ExtendedApdu)
                 if propertyValueResponse == nil {
-					return false
-				}
-				if *dataFrameExt.SourceAddress != *destinationAddress {
-					return false
-				}
-				if *Int8ArrayToKnxAddress(dataFrameExt.DestinationAddress) != *m.connection.ClientKnxAddress {
-					return false
-				}
-                readBuffer := utils.NewReadBuffer(propertyValueResponse.Data)
-                curObjectId, _ := readBuffer.ReadUint8(8)
-                curPropertyId, _ := readBuffer.ReadUint8(8)
+                    return false
+                }
+                if *dataFrameExt.SourceAddress != *destinationAddress {
+                    return false
+                }
+                if *Int8ArrayToKnxAddress(dataFrameExt.DestinationAddress) != *m.connection.ClientKnxAddress {
+                    return false
+                }
+                curObjectId := propertyValueResponse.ObjectIndex
+                curPropertyId := propertyValueResponse.PropertyId
                 if curObjectId == uint8(objectId) && curPropertyId == uint8(propertyId) {
                     return true
                 }
-			}
-			return false
-		},
-		func(message interface{}) error {
-			tunnelingRequest := driverModel.CastTunnelingRequest(message)
-			lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
-			dataFrameExt := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
-            otherPdu := driverModel.CastApduDataOther(*dataFrameExt.Apdu)
+            }
+            return false
+        },
+        func(message interface{}) error {
+            tunnelingRequest := driverModel.CastTunnelingRequest(message)
+            lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
+            dataFrameExt := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
+            apduDataContainer := driverModel.CastApduDataContainer(dataFrameExt.Apdu)
+            otherPdu := driverModel.CastApduDataOther(apduDataContainer.DataApdu)
             propertyValueResponse := driverModel.CastApduDataExtPropertyValueResponse(otherPdu.ExtendedApdu)
 
-			readBuffer := utils.NewReadBuffer(propertyValueResponse.Data)
-			// Skip the object id and property id as we already checked them
-			_, _ = readBuffer.ReadUint8(8)
-			_, _ = readBuffer.ReadUint8(8)
-
-			propertyCount, _ := readBuffer.ReadUint8(4)
-			_ /*index*/, _ = readBuffer.ReadUint16(12)
-
-			// If the return is a count of 0, then we can't access this property (Doesn't exist or not allowed to)
-			// As we don't have a return code for "doesn't exist or doesn't have access to" we'll stick to "not found"
-			// as this can be understood as "found no property we have access to"
-			// ("03_03_07 Application Layer v01.06.02 AS" Page 52)
-			var propResult readPropertyResult
-			if propertyCount == 0 {
-				propResult = readPropertyResult{
-					responseCode: apiModel.PlcResponseCode_NOT_FOUND,
-				}
-			} else {
-				// Depending on the object id and property id, parse the remaining data accordingly.
-				property := driverModel.KnxInterfaceObjectProperty_PID_UNKNOWN
-				for i := driverModel.KnxInterfaceObjectProperty_PID_UNKNOWN; i < driverModel.KnxInterfaceObjectProperty_PID_SUNBLIND_SENSOR_BASIC_ENABLE_TOGGLE_MODE; i++ {
-					// If the propertyId matches and this is either a general object or the object id matches, add it to the result
-					if i.PropertyId() == uint8(propertyId) && (i.ObjectType().Code() == "G" || i.ObjectType().Code() == strconv.Itoa(objectId)) {
-						property = i
-						break
-					}
-				}
-
-				// Parse the payload according to the specified datatype
-				dataType := property.PropertyDataType()
-				plcValue := readwrite.ParsePropertyDataType(*readBuffer, dataType, dataType.SizeInBytes())
-				propResult = readPropertyResult{
-					plcValue:     plcValue,
-					responseCode: apiModel.PlcResponseCode_OK,
-				}
-			}
+            readBuffer := utils.NewReadBuffer(propertyValueResponse.Data)
+            propertyCount := propertyValueResponse.Count
+
+            // If the return is a count of 0, then we can't access this property (Doesn't exist or not allowed to)
+            // As we don't have a return code for "doesn't exist or doesn't have access to" we'll stick to "not found"
+            // as this can be understood as "found no property we have access to"
+            // ("03_03_07 Application Layer v01.06.02 AS" Page 52)
+            var propResult readPropertyResult
+            if propertyCount == 0 {
+                propResult = readPropertyResult{
+                    responseCode: apiModel.PlcResponseCode_NOT_FOUND,
+                }
+            } else {
+                // Depending on the object id and property id, parse the remaining data accordingly.
+                property := driverModel.KnxInterfaceObjectProperty_PID_UNKNOWN
+                for i := driverModel.KnxInterfaceObjectProperty_PID_UNKNOWN; i < driverModel.KnxInterfaceObjectProperty_PID_SUNBLIND_SENSOR_BASIC_ENABLE_TOGGLE_MODE; i++ {
+                    // If the propertyId matches and this is either a general object or the object id matches, add it to the result
+                    if i.PropertyId() == uint8(propertyId) && (i.ObjectType().Code() == "G" || i.ObjectType().Code() == strconv.Itoa(objectId)) {
+                        property = i
+                        break
+                    }
+                }
+
+                // Parse the payload according to the specified datatype
+                dataType := property.PropertyDataType()
+                plcValue := readwrite.ParsePropertyDataType(*readBuffer, dataType, dataType.SizeInBytes())
+                propResult = readPropertyResult{
+                    plcValue:     plcValue,
+                    responseCode: apiModel.PlcResponseCode_OK,
+                }
+            }
 
             // Send back an ACK
             _ = m.connection.Send(
@@ -401,113 +405,119 @@ func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPl
                     driverModel.NewLDataReq(0, nil,
                         driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
                             driverModel.NewKnxAddress(0, 0, 0), destinationAddressData,
-                            driverModel.NewApduControlContainer(driverModel.NewApduControlAck(), 0, false, 0),
+                            driverModel.NewApduControlContainer(driverModel.NewApduControlAck(), 0, true, dataFrameExt.Apdu.Counter),
                             true, true, driverModel.CEMIPriority_SYSTEM, false, false))))
 
-			result <- propResult
-			return nil
-		},
-		time.Second*5)
-
-	select {
-	case value := <-result:
-		responseCode := value.responseCode
-		plcValue := value.plcValue
-		return responseCode, plcValue
-		/*case <-time.After(time.Second * 5):
-		  return apiModel.PlcResponseCode_REMOTE_ERROR, nil*/
-	}
+            result <- propResult
+            return nil
+        },
+        time.Second*5)
+
+    select {
+    case value := <-result:
+        responseCode := value.responseCode
+        plcValue := value.plcValue
+        return responseCode, plcValue
+        /*case <-time.After(time.Second * 5):
+          return apiModel.PlcResponseCode_REMOTE_ERROR, nil*/
+    }
 }
 
 func (m KnxNetIpReader) readGroupAddress(field KnxNetIpField) (apiModel.PlcResponseCode, apiValues.PlcValue) {
-	// Pattern fields can match more than one value, therefore we have to handle things differently
-	if field.IsPatternField() {
-		// Depending on the type of field, get the uint16 ids of all values that match the current field
-		matchedAddresses := map[uint16]*driverModel.KnxGroupAddress{}
-		switch field.(type) {
-		case KnxNetIpGroupAddress3LevelPlcField:
-			for key, value := range m.connection.leve3AddressCache {
-				if field.matches(value.Parent) {
-					matchedAddresses[key] = value.Parent
-				}
-			}
-		case KnxNetIpGroupAddress2LevelPlcField:
-			for key, value := range m.connection.leve2AddressCache {
-				if field.matches(value.Parent) {
-					matchedAddresses[key] = value.Parent
-				}
-			}
-		case KnxNetIpGroupAddress1LevelPlcField:
-			for key, value := range m.connection.leve1AddressCache {
-				if field.matches(value.Parent) {
-					matchedAddresses[key] = value.Parent
-				}
-			}
-		}
-
-		// If not a single match was found, we'll return a "not found" message
-		if len(matchedAddresses) == 0 {
-			return apiModel.PlcResponseCode_NOT_FOUND, nil
-		}
-
-		// Go through all of the values and create a plc-struct from them
-		// where the string version of the address becomes the property name
-		// and the property value is the corresponding value (Other wise it
-		// would be impossible to know which of the fields the pattern matched
-		// a given value belongs to)
-		values := map[string]apiValues.PlcValue{}
-		for numericAddress, address := range matchedAddresses {
-			// Get the raw data from the cache
-			m.connection.valueCacheMutex.RLock()
-			int8s, _ := m.connection.valueCache[numericAddress]
-			m.connection.valueCacheMutex.RUnlock()
-
-			// If we don't have any field-type information, add the raw data
-			if field.GetTypeName() == "" {
-				values[GroupAddressToString(address)] =
-					internalValues.NewPlcByteArray(utils.Int8ArrayToByteArray(int8s))
-			} else {
-				// Decode the data according to the fields type
-				rb := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(int8s))
-				plcValue, err := driverModel.KnxDatapointParse(rb, field.GetTypeName())
-				// If any of the values doesn't decode correctly, we can't return any
-				if err != nil {
-					return apiModel.PlcResponseCode_INVALID_DATA, nil
-				}
-				values[GroupAddressToString(address)] = plcValue
-			}
-		}
-
-		// Add it to the result
-		return apiModel.PlcResponseCode_OK, internalValues.NewPlcStruct(values)
-	} else {
-		// If it's not a pattern field, we can access the cached value a lot simpler
-
-		// Serialize the field to an uint16
-		wb := utils.NewWriteBuffer()
-		err := field.toGroupAddress().Serialize(*wb)
-		if err != nil {
-			return apiModel.PlcResponseCode_INVALID_ADDRESS, nil
-		}
-		rawAddress := wb.GetBytes()
-		address := (uint16(rawAddress[0]) << 8) | uint16(rawAddress[1]&0xFF)
-
-		// Get the value form the cache
-		m.connection.valueCacheMutex.RLock()
-		int8s, ok := m.connection.valueCache[address]
-		m.connection.valueCacheMutex.RUnlock()
-		if !ok {
-			return apiModel.PlcResponseCode_NOT_FOUND, nil
-		}
-
-		// Decode the data according to the fields type
-		rb := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(int8s))
-		plcValue, err := driverModel.KnxDatapointParse(rb, field.GetTypeName())
-		if err != nil {
-			return apiModel.PlcResponseCode_INVALID_DATA, nil
-		}
-
-		// Add it to the result
-		return apiModel.PlcResponseCode_OK, plcValue
-	}
+    // Pattern fields can match more than one value, therefore we have to handle things differently
+    if field.IsPatternField() {
+        // Depending on the type of field, get the uint16 ids of all values that match the current field
+        matchedAddresses := map[uint16]*driverModel.KnxGroupAddress{}
+        switch field.(type) {
+        case KnxNetIpGroupAddress3LevelPlcField:
+            for key, value := range m.connection.leve3AddressCache {
+                if field.matches(value.Parent) {
+                    matchedAddresses[key] = value.Parent
+                }
+            }
+        case KnxNetIpGroupAddress2LevelPlcField:
+            for key, value := range m.connection.leve2AddressCache {
+                if field.matches(value.Parent) {
+                    matchedAddresses[key] = value.Parent
+                }
+            }
+        case KnxNetIpGroupAddress1LevelPlcField:
+            for key, value := range m.connection.leve1AddressCache {
+                if field.matches(value.Parent) {
+                    matchedAddresses[key] = value.Parent
+                }
+            }
+        }
+
+        // If not a single match was found, we'll return a "not found" message
+        if len(matchedAddresses) == 0 {
+            return apiModel.PlcResponseCode_NOT_FOUND, nil
+        }
+
+        // Go through all of the values and create a plc-struct from them
+        // where the string version of the address becomes the property name
+        // and the property value is the corresponding value (Other wise it
+        // would be impossible to know which of the fields the pattern matched
+        // a given value belongs to)
+        values := map[string]apiValues.PlcValue{}
+        for numericAddress, address := range matchedAddresses {
+            // Get the raw data from the cache
+            m.connection.valueCacheMutex.RLock()
+            int8s, _ := m.connection.valueCache[numericAddress]
+            m.connection.valueCacheMutex.RUnlock()
+
+            // If we don't have any field-type information, add the raw data
+            if field.GetTypeName() == "" {
+                values[GroupAddressToString(address)] =
+                    internalValues.NewPlcByteArray(utils.Int8ArrayToByteArray(int8s))
+            } else {
+                // Decode the data according to the fields type
+                rb := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(int8s))
+                if field.GetFieldType() == nil {
+                    return apiModel.PlcResponseCode_INVALID_DATATYPE, nil
+                }
+                plcValue, err := driverModel.KnxDatapointParse(rb, *field.GetFieldType())
+                // If any of the values doesn't decode correctly, we can't return any
+                if err != nil {
+                    return apiModel.PlcResponseCode_INVALID_DATA, nil
+                }
+                values[GroupAddressToString(address)] = plcValue
+            }
+        }
+
+        // Add it to the result
+        return apiModel.PlcResponseCode_OK, internalValues.NewPlcStruct(values)
+    } else {
+        // If it's not a pattern field, we can access the cached value a lot simpler
+
+        // Serialize the field to an uint16
+        wb := utils.NewWriteBuffer()
+        err := field.toGroupAddress().Serialize(*wb)
+        if err != nil {
+            return apiModel.PlcResponseCode_INVALID_ADDRESS, nil
+        }
+        rawAddress := wb.GetBytes()
+        address := (uint16(rawAddress[0]) << 8) | uint16(rawAddress[1]&0xFF)
+
+        // Get the value form the cache
+        m.connection.valueCacheMutex.RLock()
+        int8s, ok := m.connection.valueCache[address]
+        m.connection.valueCacheMutex.RUnlock()
+        if !ok {
+            return apiModel.PlcResponseCode_NOT_FOUND, nil
+        }
+
+        // Decode the data according to the fields type
+        rb := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(int8s))
+        if field.GetFieldType() == nil {
+            return apiModel.PlcResponseCode_INVALID_DATATYPE, nil
+        }
+        plcValue, err := driverModel.KnxDatapointParse(rb, *field.GetFieldType())
+        if err != nil {
+            return apiModel.PlcResponseCode_INVALID_DATA, nil
+        }
+
+        // Add it to the result
+        return apiModel.PlcResponseCode_OK, plcValue
+    }
 }
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go
index 0a630f9..acd7892 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go
@@ -133,12 +133,17 @@ func (m *KnxNetIpSubscriber) handleValueChange(lDataFrame *driverModel.LDataFram
                         payload = append(payload, groupValueWrite.DataFirstByte)
                         payload = append(payload, groupValueWrite.Data...)
                         rb := utils.NewReadBuffer(utils.Int8ArrayToByteArray(payload))
-                        plcValue, err := driverModel.KnxDatapointParse(rb, field.GetTypeName())
+                        if field.GetFieldType() == nil {
+                            responseCodes[fieldName] = apiModel.PlcResponseCode_INVALID_DATATYPE
+                            plcValues[fieldName] = nil
+                            continue
+                        }
+                        plcValue, err2 := driverModel.KnxDatapointParse(rb, *field.GetFieldType())
                         fields[fieldName] = field
                         types[fieldName] = subscriptionRequest.GetType(fieldName)
                         intervals[fieldName] = subscriptionRequest.GetInterval(fieldName)
                         addresses[fieldName] = destinationAddress
-                        if err == nil {
+                        if err2 == nil {
                             responseCodes[fieldName] = apiModel.PlcResponseCode_OK
                             plcValues[fieldName] = plcValue
                         } else {
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpWriter.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpWriter.go
index 7fa3399..6e1e137 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpWriter.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpWriter.go
@@ -58,7 +58,8 @@ func (m KnxNetIpWriter) Write(writeRequest model.PlcWriteRequest) <-chan model.P
 		// Get the value from the request and serialize it to a byte array
 		value := writeRequest.GetValue(fieldName)
 		io := utils.NewWriteBuffer()
-		if err := knxnetipModel.KnxDatapointSerialize(io, value, knxNetIpField.GetTypeName()); err != nil {
+        fieldType := knxnetipModel.KnxDatapointTypeByName(knxNetIpField.GetTypeName())
+        if err := knxnetipModel.KnxDatapointSerialize(io, value, fieldType); err != nil {
 			result <- model.PlcWriteRequestResult{
 				Request:  writeRequest,
 				Response: nil,
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go
index c0df68f..56ab5aa 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go
@@ -131,7 +131,7 @@ func ApduDataParse(io *utils.ReadBuffer, dataLength uint8) (*ApduData, error) {
     case apciType == 0xC:
         _parent, typeSwitchError = ApduDataDeviceDescriptorReadParse(io)
     case apciType == 0xD:
-        _parent, typeSwitchError = ApduDataDeviceDescriptorResponseParse(io)
+        _parent, typeSwitchError = ApduDataDeviceDescriptorResponseParse(io, dataLength)
     case apciType == 0xE:
         _parent, typeSwitchError = ApduDataRestartParse(io)
     case apciType == 0xF:
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go
index 8fc976e..bfcc2a6 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go
@@ -20,12 +20,14 @@ package model
 
 import (
     "encoding/xml"
+    "errors"
     "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
     "io"
 )
 
 // The data-structure of this message
 type ApduDataDeviceDescriptorRead struct {
+    DescriptorType uint8
     Parent *ApduData
     IApduDataDeviceDescriptorRead
 }
@@ -49,8 +51,9 @@ func (m *ApduDataDeviceDescriptorRead) ApciType() uint8 {
 func (m *ApduDataDeviceDescriptorRead) InitializeParent(parent *ApduData) {
 }
 
-func NewApduDataDeviceDescriptorRead() *ApduData {
+func NewApduDataDeviceDescriptorRead(descriptorType uint8, ) *ApduData {
     child := &ApduDataDeviceDescriptorRead{
+        DescriptorType: descriptorType,
         Parent: NewApduData(),
     }
     child.Parent.Child = child
@@ -83,6 +86,9 @@ func (m *ApduDataDeviceDescriptorRead) GetTypeName() string {
 func (m *ApduDataDeviceDescriptorRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
+    // Simple field (descriptorType)
+    lengthInBits += 6
+
     return lengthInBits
 }
 
@@ -92,8 +98,15 @@ func (m *ApduDataDeviceDescriptorRead) LengthInBytes() uint16 {
 
 func ApduDataDeviceDescriptorReadParse(io *utils.ReadBuffer) (*ApduData, error) {
 
+    // Simple Field (descriptorType)
+    descriptorType, _descriptorTypeErr := io.ReadUint8(6)
+    if _descriptorTypeErr != nil {
+        return nil, errors.New("Error parsing 'descriptorType' field " + _descriptorTypeErr.Error())
+    }
+
     // Create a partially initialized instance
     _child := &ApduDataDeviceDescriptorRead{
+        DescriptorType: descriptorType,
         Parent: &ApduData{},
     }
     _child.Parent.Child = _child
@@ -103,6 +116,13 @@ func ApduDataDeviceDescriptorReadParse(io *utils.ReadBuffer) (*ApduData, error)
 func (m *ApduDataDeviceDescriptorRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
+    // Simple Field (descriptorType)
+    descriptorType := uint8(m.DescriptorType)
+    _descriptorTypeErr := io.WriteUint8(6, (descriptorType))
+    if _descriptorTypeErr != nil {
+        return errors.New("Error serializing 'descriptorType' field " + _descriptorTypeErr.Error())
+    }
+
         return nil
     }
     return m.Parent.SerializeParent(io, m, ser)
@@ -117,6 +137,12 @@ func (m *ApduDataDeviceDescriptorRead) UnmarshalXML(d *xml.Decoder, start xml.St
         case xml.StartElement:
             tok := token.(xml.StartElement)
             switch tok.Name.Local {
+            case "descriptorType":
+                var data uint8
+                if err := d.DecodeElement(&data, &tok); err != nil {
+                    return err
+                }
+                m.DescriptorType = data
             }
         }
         token, err = d.Token()
@@ -130,6 +156,9 @@ func (m *ApduDataDeviceDescriptorRead) UnmarshalXML(d *xml.Decoder, start xml.St
 }
 
 func (m *ApduDataDeviceDescriptorRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    if err := e.EncodeElement(m.DescriptorType, xml.StartElement{Name: xml.Name{Local: "descriptorType"}}); err != nil {
+        return err
+    }
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
index f694429..bad1554 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
@@ -19,13 +19,17 @@
 package model
 
 import (
+    "encoding/base64"
     "encoding/xml"
+    "errors"
     "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
     "io"
 )
 
 // The data-structure of this message
 type ApduDataDeviceDescriptorResponse struct {
+    DescriptorType uint8
+    Data []int8
     Parent *ApduData
     IApduDataDeviceDescriptorResponse
 }
@@ -49,8 +53,10 @@ func (m *ApduDataDeviceDescriptorResponse) ApciType() uint8 {
 func (m *ApduDataDeviceDescriptorResponse) InitializeParent(parent *ApduData) {
 }
 
-func NewApduDataDeviceDescriptorResponse() *ApduData {
+func NewApduDataDeviceDescriptorResponse(descriptorType uint8, data []int8, ) *ApduData {
     child := &ApduDataDeviceDescriptorResponse{
+        DescriptorType: descriptorType,
+        Data: data,
         Parent: NewApduData(),
     }
     child.Parent.Child = child
@@ -83,6 +89,14 @@ func (m *ApduDataDeviceDescriptorResponse) GetTypeName() string {
 func (m *ApduDataDeviceDescriptorResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
+    // Simple field (descriptorType)
+    lengthInBits += 6
+
+    // Array field
+    if len(m.Data) > 0 {
+        lengthInBits += 8 * uint16(len(m.Data))
+    }
+
     return lengthInBits
 }
 
@@ -90,10 +104,29 @@ func (m *ApduDataDeviceDescriptorResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func ApduDataDeviceDescriptorResponseParse(io *utils.ReadBuffer) (*ApduData, error) {
+func ApduDataDeviceDescriptorResponseParse(io *utils.ReadBuffer, dataLength uint8) (*ApduData, error) {
+
+    // Simple Field (descriptorType)
+    descriptorType, _descriptorTypeErr := io.ReadUint8(6)
+    if _descriptorTypeErr != nil {
+        return nil, errors.New("Error parsing 'descriptorType' field " + _descriptorTypeErr.Error())
+    }
+
+    // Array field (data)
+    // Count array
+    data := make([]int8, utils.InlineIf(bool(bool((dataLength) < ((1)))), uint16(uint16(0)), uint16(uint16(dataLength) - uint16(uint16(1)))))
+    for curItem := uint16(0); curItem < uint16(utils.InlineIf(bool(bool((dataLength) < ((1)))), uint16(uint16(0)), uint16(uint16(dataLength) - uint16(uint16(1))))); curItem++ {
+        _item, _err := io.ReadInt8(8)
+        if _err != nil {
+            return nil, errors.New("Error parsing 'data' field " + _err.Error())
+        }
+        data[curItem] = _item
+    }
 
     // Create a partially initialized instance
     _child := &ApduDataDeviceDescriptorResponse{
+        DescriptorType: descriptorType,
+        Data: data,
         Parent: &ApduData{},
     }
     _child.Parent.Child = _child
@@ -103,6 +136,23 @@ func ApduDataDeviceDescriptorResponseParse(io *utils.ReadBuffer) (*ApduData, err
 func (m *ApduDataDeviceDescriptorResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
+    // Simple Field (descriptorType)
+    descriptorType := uint8(m.DescriptorType)
+    _descriptorTypeErr := io.WriteUint8(6, (descriptorType))
+    if _descriptorTypeErr != nil {
+        return errors.New("Error serializing 'descriptorType' field " + _descriptorTypeErr.Error())
+    }
+
+    // Array Field (data)
+    if m.Data != nil {
+        for _, _element := range m.Data {
+            _elementErr := io.WriteInt8(8, _element)
+            if _elementErr != nil {
+                return errors.New("Error serializing 'data' field " + _elementErr.Error())
+            }
+        }
+    }
+
         return nil
     }
     return m.Parent.SerializeParent(io, m, ser)
@@ -117,6 +167,23 @@ func (m *ApduDataDeviceDescriptorResponse) UnmarshalXML(d *xml.Decoder, start xm
         case xml.StartElement:
             tok := token.(xml.StartElement)
             switch tok.Name.Local {
+            case "descriptorType":
+                var data uint8
+                if err := d.DecodeElement(&data, &tok); err != nil {
+                    return err
+                }
+                m.DescriptorType = data
+            case "data":
+                var _encoded string
+                if err := d.DecodeElement(&_encoded, &tok); err != nil {
+                    return err
+                }
+                _decoded := make([]byte, base64.StdEncoding.DecodedLen(len(_encoded)))
+                _len, err := base64.StdEncoding.Decode(_decoded, []byte(_encoded))
+                if err != nil {
+                    return err
+                }
+                m.Data = utils.ByteArrayToInt8Array(_decoded[0:_len])
             }
         }
         token, err = d.Token()
@@ -130,6 +197,14 @@ func (m *ApduDataDeviceDescriptorResponse) UnmarshalXML(d *xml.Decoder, start xm
 }
 
 func (m *ApduDataDeviceDescriptorResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    if err := e.EncodeElement(m.DescriptorType, xml.StartElement{Name: xml.Name{Local: "descriptorType"}}); err != nil {
+        return err
+    }
+    _encodedData := make([]byte, base64.StdEncoding.EncodedLen(len(m.Data)))
+    base64.StdEncoding.Encode(_encodedData, utils.Int8ArrayToByteArray(m.Data))
+    if err := e.EncodeElement(_encodedData, xml.StartElement{Name: xml.Name{Local: "data"}}); err != nil {
+        return err
+    }
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go
index bd3821e..dfb0c8b 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go
@@ -80,7 +80,7 @@ func (m *ApduDataExt) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     // Discriminator Field (extApciType)
-    lengthInBits += 8
+    lengthInBits += 6
 
     // Length of sub-type elements will be added by sub-type...
     lengthInBits += m.Child.LengthInBits()
@@ -95,7 +95,7 @@ func (m *ApduDataExt) LengthInBytes() uint16 {
 func ApduDataExtParse(io *utils.ReadBuffer, length uint8) (*ApduDataExt, error) {
 
     // Discriminator Field (extApciType) (Used as input to a switch field)
-    extApciType, _extApciTypeErr := io.ReadUint8(8)
+    extApciType, _extApciTypeErr := io.ReadUint8(6)
     if _extApciTypeErr != nil {
         return nil, errors.New("Error parsing 'extApciType' field " + _extApciTypeErr.Error())
     }
@@ -204,7 +204,7 @@ func (m *ApduDataExt) SerializeParent(io utils.WriteBuffer, child IApduDataExt,
 
     // Discriminator Field (extApciType) (Used as input to a switch field)
     extApciType := uint8(child.ExtApciType())
-    _extApciTypeErr := io.WriteUint8(8, (extApciType))
+    _extApciTypeErr := io.WriteUint8(6, (extApciType))
     if _extApciTypeErr != nil {
         return errors.New("Error serializing 'extApciType' field " + _extApciTypeErr.Error())
     }
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
index 8df878f..04e41e4 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxDatapoint.go
@@ -25,9 +25,9 @@ import (
             api "github.com/apache/plc4x/plc4go/pkg/plc4go/values"
 )
 
-func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (api.PlcValue, error) {
+func KnxDatapointParse(io *utils.ReadBuffer, datapointType KnxDatapointType) (api.PlcValue, error) {
     switch {
-        case datapointType == KnxDatapointType.DPT_Switch: // BOOL
+        case datapointType == KnxDatapointType_DPT_Switch: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -40,7 +40,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Bool: // BOOL
+        case datapointType == KnxDatapointType_DPT_Bool: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -53,7 +53,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Enable: // BOOL
+        case datapointType == KnxDatapointType_DPT_Enable: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -66,7 +66,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Ramp: // BOOL
+        case datapointType == KnxDatapointType_DPT_Ramp: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -79,7 +79,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Alarm: // BOOL
+        case datapointType == KnxDatapointType_DPT_Alarm: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -92,7 +92,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_BinaryValue: // BOOL
+        case datapointType == KnxDatapointType_DPT_BinaryValue: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -105,7 +105,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Step: // BOOL
+        case datapointType == KnxDatapointType_DPT_Step: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -118,7 +118,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_UpDown: // BOOL
+        case datapointType == KnxDatapointType_DPT_UpDown: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -131,7 +131,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_OpenClose: // BOOL
+        case datapointType == KnxDatapointType_DPT_OpenClose: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -144,7 +144,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Start: // BOOL
+        case datapointType == KnxDatapointType_DPT_Start: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -157,7 +157,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_State: // BOOL
+        case datapointType == KnxDatapointType_DPT_State: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -170,7 +170,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Invert: // BOOL
+        case datapointType == KnxDatapointType_DPT_Invert: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -183,7 +183,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_DimSendStyle: // BOOL
+        case datapointType == KnxDatapointType_DPT_DimSendStyle: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -196,7 +196,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_InputSource: // BOOL
+        case datapointType == KnxDatapointType_DPT_InputSource: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -209,7 +209,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Reset: // BOOL
+        case datapointType == KnxDatapointType_DPT_Reset: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -222,7 +222,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Ack: // BOOL
+        case datapointType == KnxDatapointType_DPT_Ack: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -235,7 +235,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Trigger: // BOOL
+        case datapointType == KnxDatapointType_DPT_Trigger: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -248,7 +248,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Occupancy: // BOOL
+        case datapointType == KnxDatapointType_DPT_Occupancy: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -261,7 +261,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Window_Door: // BOOL
+        case datapointType == KnxDatapointType_DPT_Window_Door: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -274,7 +274,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_LogicalFunction: // BOOL
+        case datapointType == KnxDatapointType_DPT_LogicalFunction: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -287,7 +287,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Scene_AB: // BOOL
+        case datapointType == KnxDatapointType_DPT_Scene_AB: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -300,7 +300,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_ShutterBlinds_Mode: // BOOL
+        case datapointType == KnxDatapointType_DPT_ShutterBlinds_Mode: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -313,7 +313,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_DayNight: // BOOL
+        case datapointType == KnxDatapointType_DPT_DayNight: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -326,7 +326,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Heat_Cool: // BOOL
+        case datapointType == KnxDatapointType_DPT_Heat_Cool: // BOOL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
@@ -339,7 +339,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_Switch_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Switch_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -347,21 +347,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (On)
-            On, _OnErr := io.ReadBit()
-            if _OnErr != nil {
-                return nil, errors.New("Error parsing 'On' field " + _OnErr.Error())
+            // Simple Field (on)
+            on, _onErr := io.ReadBit()
+            if _onErr != nil {
+                return nil, errors.New("Error parsing 'on' field " + _onErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(On)
+            _map["Struct"] = values.NewPlcBOOL(on)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Bool_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Bool_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -369,21 +369,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (True)
-            True, _TrueErr := io.ReadBit()
-            if _TrueErr != nil {
-                return nil, errors.New("Error parsing 'True' field " + _TrueErr.Error())
+            // Simple Field (valueTrue)
+            valueTrue, _valueTrueErr := io.ReadBit()
+            if _valueTrueErr != nil {
+                return nil, errors.New("Error parsing 'valueTrue' field " + _valueTrueErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(True)
+            _map["Struct"] = values.NewPlcBOOL(valueTrue)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Enable_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Enable_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -391,21 +391,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Enable)
-            Enable, _EnableErr := io.ReadBit()
-            if _EnableErr != nil {
-                return nil, errors.New("Error parsing 'Enable' field " + _EnableErr.Error())
+            // Simple Field (enable)
+            enable, _enableErr := io.ReadBit()
+            if _enableErr != nil {
+                return nil, errors.New("Error parsing 'enable' field " + _enableErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Enable)
+            _map["Struct"] = values.NewPlcBOOL(enable)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Ramp_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Ramp_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -413,21 +413,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Ramp)
-            Ramp, _RampErr := io.ReadBit()
-            if _RampErr != nil {
-                return nil, errors.New("Error parsing 'Ramp' field " + _RampErr.Error())
+            // Simple Field (ramp)
+            ramp, _rampErr := io.ReadBit()
+            if _rampErr != nil {
+                return nil, errors.New("Error parsing 'ramp' field " + _rampErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Ramp)
+            _map["Struct"] = values.NewPlcBOOL(ramp)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Alarm_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Alarm_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -435,21 +435,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Alarm)
-            Alarm, _AlarmErr := io.ReadBit()
-            if _AlarmErr != nil {
-                return nil, errors.New("Error parsing 'Alarm' field " + _AlarmErr.Error())
+            // Simple Field (alarm)
+            alarm, _alarmErr := io.ReadBit()
+            if _alarmErr != nil {
+                return nil, errors.New("Error parsing 'alarm' field " + _alarmErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Alarm)
+            _map["Struct"] = values.NewPlcBOOL(alarm)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_BinaryValue_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_BinaryValue_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -457,21 +457,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (High)
-            High, _HighErr := io.ReadBit()
-            if _HighErr != nil {
-                return nil, errors.New("Error parsing 'High' field " + _HighErr.Error())
+            // Simple Field (high)
+            high, _highErr := io.ReadBit()
+            if _highErr != nil {
+                return nil, errors.New("Error parsing 'high' field " + _highErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(High)
+            _map["Struct"] = values.NewPlcBOOL(high)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Step_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Step_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -479,21 +479,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Increase)
-            Increase, _IncreaseErr := io.ReadBit()
-            if _IncreaseErr != nil {
-                return nil, errors.New("Error parsing 'Increase' field " + _IncreaseErr.Error())
+            // Simple Field (increase)
+            increase, _increaseErr := io.ReadBit()
+            if _increaseErr != nil {
+                return nil, errors.New("Error parsing 'increase' field " + _increaseErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Increase)
+            _map["Struct"] = values.NewPlcBOOL(increase)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Direction1_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Direction1_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -501,21 +501,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Down)
-            Down, _DownErr := io.ReadBit()
-            if _DownErr != nil {
-                return nil, errors.New("Error parsing 'Down' field " + _DownErr.Error())
+            // Simple Field (down)
+            down, _downErr := io.ReadBit()
+            if _downErr != nil {
+                return nil, errors.New("Error parsing 'down' field " + _downErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Down)
+            _map["Struct"] = values.NewPlcBOOL(down)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Direction2_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Direction2_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -523,21 +523,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Close)
-            Close, _CloseErr := io.ReadBit()
-            if _CloseErr != nil {
-                return nil, errors.New("Error parsing 'Close' field " + _CloseErr.Error())
+            // Simple Field (close)
+            close, _closeErr := io.ReadBit()
+            if _closeErr != nil {
+                return nil, errors.New("Error parsing 'close' field " + _closeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Close)
+            _map["Struct"] = values.NewPlcBOOL(close)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Start_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Start_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -545,21 +545,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Start)
-            Start, _StartErr := io.ReadBit()
-            if _StartErr != nil {
-                return nil, errors.New("Error parsing 'Start' field " + _StartErr.Error())
+            // Simple Field (start)
+            start, _startErr := io.ReadBit()
+            if _startErr != nil {
+                return nil, errors.New("Error parsing 'start' field " + _startErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Start)
+            _map["Struct"] = values.NewPlcBOOL(start)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_State_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_State_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -567,21 +567,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Active)
-            Active, _ActiveErr := io.ReadBit()
-            if _ActiveErr != nil {
-                return nil, errors.New("Error parsing 'Active' field " + _ActiveErr.Error())
+            // Simple Field (active)
+            active, _activeErr := io.ReadBit()
+            if _activeErr != nil {
+                return nil, errors.New("Error parsing 'active' field " + _activeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Active)
+            _map["Struct"] = values.NewPlcBOOL(active)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Invert_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_Invert_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -589,21 +589,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Control)
-            Control, _ControlErr := io.ReadBit()
-            if _ControlErr != nil {
-                return nil, errors.New("Error parsing 'Control' field " + _ControlErr.Error())
+            // Simple Field (control)
+            control, _controlErr := io.ReadBit()
+            if _controlErr != nil {
+                return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Control)
+            _map["Struct"] = values.NewPlcBOOL(control)
 
-            // Simple Field (Inverted)
-            Inverted, _InvertedErr := io.ReadBit()
-            if _InvertedErr != nil {
-                return nil, errors.New("Error parsing 'Inverted' field " + _InvertedErr.Error())
+            // Simple Field (inverted)
+            inverted, _invertedErr := io.ReadBit()
+            if _invertedErr != nil {
+                return nil, errors.New("Error parsing 'inverted' field " + _invertedErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Inverted)
+            _map["Struct"] = values.NewPlcBOOL(inverted)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Control_Dimming: // Struct
+        case datapointType == KnxDatapointType_DPT_Control_Dimming: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -611,21 +611,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Increase)
-            Increase, _IncreaseErr := io.ReadBit()
-            if _IncreaseErr != nil {
-                return nil, errors.New("Error parsing 'Increase' field " + _IncreaseErr.Error())
+            // Simple Field (increase)
+            increase, _increaseErr := io.ReadBit()
+            if _increaseErr != nil {
+                return nil, errors.New("Error parsing 'increase' field " + _increaseErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Increase)
+            _map["Struct"] = values.NewPlcBOOL(increase)
 
-            // Simple Field (Stepcode)
-            Stepcode, _StepcodeErr := io.ReadUint8(3)
-            if _StepcodeErr != nil {
-                return nil, errors.New("Error parsing 'Stepcode' field " + _StepcodeErr.Error())
+            // Simple Field (stepcode)
+            stepcode, _stepcodeErr := io.ReadUint8(3)
+            if _stepcodeErr != nil {
+                return nil, errors.New("Error parsing 'stepcode' field " + _stepcodeErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Stepcode)
+            _map["Struct"] = values.NewPlcUSINT(stepcode)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Control_Blinds: // Struct
+        case datapointType == KnxDatapointType_DPT_Control_Blinds: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -633,21 +633,21 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Down)
-            Down, _DownErr := io.ReadBit()
-            if _DownErr != nil {
-                return nil, errors.New("Error parsing 'Down' field " + _DownErr.Error())
+            // Simple Field (down)
+            down, _downErr := io.ReadBit()
+            if _downErr != nil {
+                return nil, errors.New("Error parsing 'down' field " + _downErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Down)
+            _map["Struct"] = values.NewPlcBOOL(down)
 
-            // Simple Field (Stepcode)
-            Stepcode, _StepcodeErr := io.ReadUint8(3)
-            if _StepcodeErr != nil {
-                return nil, errors.New("Error parsing 'Stepcode' field " + _StepcodeErr.Error())
+            // Simple Field (stepcode)
+            stepcode, _stepcodeErr := io.ReadUint8(3)
+            if _stepcodeErr != nil {
+                return nil, errors.New("Error parsing 'stepcode' field " + _stepcodeErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Stepcode)
+            _map["Struct"] = values.NewPlcUSINT(stepcode)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Char_ASCII: // STRING
+        case datapointType == KnxDatapointType_DPT_Char_ASCII: // STRING
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -660,7 +660,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcSTRING(value), nil
-        case datapointType == KnxDatapointType.DPT_Char_8859_1: // STRING
+        case datapointType == KnxDatapointType_DPT_Char_8859_1: // STRING
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -673,7 +673,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcSTRING(value), nil
-        case datapointType == KnxDatapointType.DPT_Scaling: // USINT
+        case datapointType == KnxDatapointType_DPT_Scaling: // USINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -686,7 +686,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Angle: // USINT
+        case datapointType == KnxDatapointType_DPT_Angle: // USINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -699,7 +699,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Percent_U8: // USINT
+        case datapointType == KnxDatapointType_DPT_Percent_U8: // USINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -712,7 +712,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DecimalFactor: // USINT
+        case datapointType == KnxDatapointType_DPT_DecimalFactor: // USINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -725,7 +725,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Tariff: // USINT
+        case datapointType == KnxDatapointType_DPT_Tariff: // USINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -738,7 +738,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_1_Ucount: // USINT
+        case datapointType == KnxDatapointType_DPT_Value_1_Ucount: // USINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -751,7 +751,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_FanStage: // USINT
+        case datapointType == KnxDatapointType_DPT_FanStage: // USINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -764,7 +764,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Percent_V8: // SINT
+        case datapointType == KnxDatapointType_DPT_Percent_V8: // SINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -777,7 +777,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_1_Count: // SINT
+        case datapointType == KnxDatapointType_DPT_Value_1_Count: // SINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -790,7 +790,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Status_Mode3: // Struct
+        case datapointType == KnxDatapointType_DPT_Status_Mode3: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -798,49 +798,49 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (StatusA)
-            StatusA, _StatusAErr := io.ReadBit()
-            if _StatusAErr != nil {
-                return nil, errors.New("Error parsing 'StatusA' field " + _StatusAErr.Error())
+            // Simple Field (statusA)
+            statusA, _statusAErr := io.ReadBit()
+            if _statusAErr != nil {
+                return nil, errors.New("Error parsing 'statusA' field " + _statusAErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StatusA)
+            _map["Struct"] = values.NewPlcBOOL(statusA)
 
-            // Simple Field (StatusB)
-            StatusB, _StatusBErr := io.ReadBit()
-            if _StatusBErr != nil {
-                return nil, errors.New("Error parsing 'StatusB' field " + _StatusBErr.Error())
+            // Simple Field (statusB)
+            statusB, _statusBErr := io.ReadBit()
+            if _statusBErr != nil {
+                return nil, errors.New("Error parsing 'statusB' field " + _statusBErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StatusB)
+            _map["Struct"] = values.NewPlcBOOL(statusB)
 
-            // Simple Field (StatusC)
-            StatusC, _StatusCErr := io.ReadBit()
-            if _StatusCErr != nil {
-                return nil, errors.New("Error parsing 'StatusC' field " + _StatusCErr.Error())
+            // Simple Field (statusC)
+            statusC, _statusCErr := io.ReadBit()
+            if _statusCErr != nil {
+                return nil, errors.New("Error parsing 'statusC' field " + _statusCErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StatusC)
+            _map["Struct"] = values.NewPlcBOOL(statusC)
 
-            // Simple Field (StatusD)
-            StatusD, _StatusDErr := io.ReadBit()
-            if _StatusDErr != nil {
-                return nil, errors.New("Error parsing 'StatusD' field " + _StatusDErr.Error())
+            // Simple Field (statusD)
+            statusD, _statusDErr := io.ReadBit()
+            if _statusDErr != nil {
+                return nil, errors.New("Error parsing 'statusD' field " + _statusDErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StatusD)
+            _map["Struct"] = values.NewPlcBOOL(statusD)
 
-            // Simple Field (StatusE)
-            StatusE, _StatusEErr := io.ReadBit()
-            if _StatusEErr != nil {
-                return nil, errors.New("Error parsing 'StatusE' field " + _StatusEErr.Error())
+            // Simple Field (statusE)
+            statusE, _statusEErr := io.ReadBit()
+            if _statusEErr != nil {
+                return nil, errors.New("Error parsing 'statusE' field " + _statusEErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StatusE)
+            _map["Struct"] = values.NewPlcBOOL(statusE)
 
-            // Simple Field (Mode)
-            Mode, _ModeErr := io.ReadUint8(3)
-            if _ModeErr != nil {
-                return nil, errors.New("Error parsing 'Mode' field " + _ModeErr.Error())
+            // Simple Field (mode)
+            mode, _modeErr := io.ReadUint8(3)
+            if _modeErr != nil {
+                return nil, errors.New("Error parsing 'mode' field " + _modeErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Mode)
+            _map["Struct"] = values.NewPlcUSINT(mode)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Value_2_Ucount: // UINT
+        case datapointType == KnxDatapointType_DPT_Value_2_Ucount: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -853,7 +853,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_TimePeriodMsec: // UINT
+        case datapointType == KnxDatapointType_DPT_TimePeriodMsec: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -866,7 +866,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_TimePeriod10Msec: // UINT
+        case datapointType == KnxDatapointType_DPT_TimePeriod10Msec: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -879,7 +879,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_TimePeriod100Msec: // UINT
+        case datapointType == KnxDatapointType_DPT_TimePeriod100Msec: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -892,7 +892,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_TimePeriodSec: // UINT
+        case datapointType == KnxDatapointType_DPT_TimePeriodSec: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -905,7 +905,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_TimePeriodMin: // UINT
+        case datapointType == KnxDatapointType_DPT_TimePeriodMin: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -918,7 +918,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_TimePeriodHrs: // UINT
+        case datapointType == KnxDatapointType_DPT_TimePeriodHrs: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -931,7 +931,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_PropDataType: // UINT
+        case datapointType == KnxDatapointType_DPT_PropDataType: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -944,7 +944,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Length_mm: // UINT
+        case datapointType == KnxDatapointType_DPT_Length_mm: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -957,7 +957,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_UElCurrentmA: // UINT
+        case datapointType == KnxDatapointType_DPT_UElCurrentmA: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -970,7 +970,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Brightness: // UINT
+        case datapointType == KnxDatapointType_DPT_Brightness: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -983,7 +983,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Absolute_Colour_Temperature: // UINT
+        case datapointType == KnxDatapointType_DPT_Absolute_Colour_Temperature: // UINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -996,7 +996,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_2_Count: // INT
+        case datapointType == KnxDatapointType_DPT_Value_2_Count: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1009,7 +1009,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaTimeMsec: // INT
+        case datapointType == KnxDatapointType_DPT_DeltaTimeMsec: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1022,7 +1022,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaTime10Msec: // INT
+        case datapointType == KnxDatapointType_DPT_DeltaTime10Msec: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1035,7 +1035,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaTime100Msec: // INT
+        case datapointType == KnxDatapointType_DPT_DeltaTime100Msec: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1048,7 +1048,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaTimeSec: // INT
+        case datapointType == KnxDatapointType_DPT_DeltaTimeSec: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1061,7 +1061,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaTimeMin: // INT
+        case datapointType == KnxDatapointType_DPT_DeltaTimeMin: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1074,7 +1074,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaTimeHrs: // INT
+        case datapointType == KnxDatapointType_DPT_DeltaTimeHrs: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1087,7 +1087,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Percent_V16: // INT
+        case datapointType == KnxDatapointType_DPT_Percent_V16: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1100,7 +1100,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Rotation_Angle: // INT
+        case datapointType == KnxDatapointType_DPT_Rotation_Angle: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1113,7 +1113,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Length_m: // INT
+        case datapointType == KnxDatapointType_DPT_Length_m: // INT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1126,7 +1126,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Temp: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Temp: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1139,7 +1139,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Tempd: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Tempd: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1152,7 +1152,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Tempa: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Tempa: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1165,7 +1165,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Lux: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Lux: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1178,7 +1178,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Wsp: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Wsp: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1191,7 +1191,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Pres: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Pres: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1204,7 +1204,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Humidity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Humidity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1217,7 +1217,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_AirQuality: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_AirQuality: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1230,7 +1230,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_AirFlow: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_AirFlow: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1243,7 +1243,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Time1: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Time1: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1256,7 +1256,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Time2: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Time2: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1269,7 +1269,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Volt: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Volt: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1282,7 +1282,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Curr: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Curr: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1295,7 +1295,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_PowerDensity: // REAL
+        case datapointType == KnxDatapointType_DPT_PowerDensity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1308,7 +1308,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_KelvinPerPercent: // REAL
+        case datapointType == KnxDatapointType_DPT_KelvinPerPercent: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1321,7 +1321,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Power: // REAL
+        case datapointType == KnxDatapointType_DPT_Power: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1334,7 +1334,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Volume_Flow: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Volume_Flow: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1347,7 +1347,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Rain_Amount: // REAL
+        case datapointType == KnxDatapointType_DPT_Rain_Amount: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1360,7 +1360,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Temp_F: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Temp_F: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1373,7 +1373,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Wsp_kmh: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Wsp_kmh: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1386,7 +1386,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Absolute_Humidity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Absolute_Humidity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1399,7 +1399,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Concentration_ygm3: // REAL
+        case datapointType == KnxDatapointType_DPT_Concentration_ygm3: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1412,7 +1412,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_TimeOfDay: // Struct
+        case datapointType == KnxDatapointType_DPT_TimeOfDay: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -1420,45 +1420,45 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Day)
-            Day, _DayErr := io.ReadUint8(3)
-            if _DayErr != nil {
-                return nil, errors.New("Error parsing 'Day' field " + _DayErr.Error())
+            // Simple Field (day)
+            day, _dayErr := io.ReadUint8(3)
+            if _dayErr != nil {
+                return nil, errors.New("Error parsing 'day' field " + _dayErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Day)
+            _map["Struct"] = values.NewPlcUSINT(day)
 
-            // Simple Field (Hour)
-            Hour, _HourErr := io.ReadUint8(5)
-            if _HourErr != nil {
-                return nil, errors.New("Error parsing 'Hour' field " + _HourErr.Error())
+            // Simple Field (hour)
+            hour, _hourErr := io.ReadUint8(5)
+            if _hourErr != nil {
+                return nil, errors.New("Error parsing 'hour' field " + _hourErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Hour)
+            _map["Struct"] = values.NewPlcUSINT(hour)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(2); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Minutes)
-            Minutes, _MinutesErr := io.ReadUint8(6)
-            if _MinutesErr != nil {
-                return nil, errors.New("Error parsing 'Minutes' field " + _MinutesErr.Error())
+            // Simple Field (minutes)
+            minutes, _minutesErr := io.ReadUint8(6)
+            if _minutesErr != nil {
+                return nil, errors.New("Error parsing 'minutes' field " + _minutesErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Minutes)
+            _map["Struct"] = values.NewPlcUSINT(minutes)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(2); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Seconds)
-            Seconds, _SecondsErr := io.ReadUint8(6)
-            if _SecondsErr != nil {
-                return nil, errors.New("Error parsing 'Seconds' field " + _SecondsErr.Error())
+            // Simple Field (seconds)
+            seconds, _secondsErr := io.ReadUint8(6)
+            if _secondsErr != nil {
+                return nil, errors.New("Error parsing 'seconds' field " + _secondsErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Seconds)
+            _map["Struct"] = values.NewPlcUSINT(seconds)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Date: // Struct
+        case datapointType == KnxDatapointType_DPT_Date: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -1466,38 +1466,38 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (DayOfMonth)
-            DayOfMonth, _DayOfMonthErr := io.ReadUint8(5)
-            if _DayOfMonthErr != nil {
-                return nil, errors.New("Error parsing 'DayOfMonth' field " + _DayOfMonthErr.Error())
+            // Simple Field (dayOfMonth)
+            dayOfMonth, _dayOfMonthErr := io.ReadUint8(5)
+            if _dayOfMonthErr != nil {
+                return nil, errors.New("Error parsing 'dayOfMonth' field " + _dayOfMonthErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(DayOfMonth)
+            _map["Struct"] = values.NewPlcUSINT(dayOfMonth)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Month)
-            Month, _MonthErr := io.ReadUint8(4)
-            if _MonthErr != nil {
-                return nil, errors.New("Error parsing 'Month' field " + _MonthErr.Error())
+            // Simple Field (month)
+            month, _monthErr := io.ReadUint8(4)
+            if _monthErr != nil {
+                return nil, errors.New("Error parsing 'month' field " + _monthErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Month)
+            _map["Struct"] = values.NewPlcUSINT(month)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(1); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Year)
-            Year, _YearErr := io.ReadUint8(7)
-            if _YearErr != nil {
-                return nil, errors.New("Error parsing 'Year' field " + _YearErr.Error())
+            // Simple Field (year)
+            year, _yearErr := io.ReadUint8(7)
+            if _yearErr != nil {
+                return nil, errors.New("Error parsing 'year' field " + _yearErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Year)
+            _map["Struct"] = values.NewPlcUSINT(year)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Value_4_Ucount: // UDINT
+        case datapointType == KnxDatapointType_DPT_Value_4_Ucount: // UDINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1510,7 +1510,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_LongTimePeriod_Sec: // UDINT
+        case datapointType == KnxDatapointType_DPT_LongTimePeriod_Sec: // UDINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1523,7 +1523,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_LongTimePeriod_Min: // UDINT
+        case datapointType == KnxDatapointType_DPT_LongTimePeriod_Min: // UDINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1536,7 +1536,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_LongTimePeriod_Hrs: // UDINT
+        case datapointType == KnxDatapointType_DPT_LongTimePeriod_Hrs: // UDINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1549,7 +1549,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_VolumeLiquid_Litre: // UDINT
+        case datapointType == KnxDatapointType_DPT_VolumeLiquid_Litre: // UDINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1562,7 +1562,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Volume_m_3: // UDINT
+        case datapointType == KnxDatapointType_DPT_Volume_m_3: // UDINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1575,7 +1575,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_4_Count: // DINT
+        case datapointType == KnxDatapointType_DPT_Value_4_Count: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1588,7 +1588,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_FlowRate_m3h: // DINT
+        case datapointType == KnxDatapointType_DPT_FlowRate_m3h: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1601,7 +1601,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ActiveEnergy: // DINT
+        case datapointType == KnxDatapointType_DPT_ActiveEnergy: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1614,7 +1614,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ApparantEnergy: // DINT
+        case datapointType == KnxDatapointType_DPT_ApparantEnergy: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1627,7 +1627,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ReactiveEnergy: // DINT
+        case datapointType == KnxDatapointType_DPT_ReactiveEnergy: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1640,7 +1640,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ActiveEnergy_kWh: // DINT
+        case datapointType == KnxDatapointType_DPT_ActiveEnergy_kWh: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1653,7 +1653,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ApparantEnergy_kVAh: // DINT
+        case datapointType == KnxDatapointType_DPT_ApparantEnergy_kVAh: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1666,7 +1666,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ReactiveEnergy_kVARh: // DINT
+        case datapointType == KnxDatapointType_DPT_ReactiveEnergy_kVARh: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1679,7 +1679,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ActiveEnergy_MWh: // DINT
+        case datapointType == KnxDatapointType_DPT_ActiveEnergy_MWh: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1692,7 +1692,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_LongDeltaTimeSec: // DINT
+        case datapointType == KnxDatapointType_DPT_LongDeltaTimeSec: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1705,7 +1705,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaVolumeLiquid_Litre: // DINT
+        case datapointType == KnxDatapointType_DPT_DeltaVolumeLiquid_Litre: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1718,7 +1718,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_DeltaVolume_m_3: // DINT
+        case datapointType == KnxDatapointType_DPT_DeltaVolume_m_3: // DINT
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1731,7 +1731,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcDINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Acceleration: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Acceleration: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1744,7 +1744,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Acceleration_Angular: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Acceleration_Angular: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1757,7 +1757,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Activation_Energy: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Activation_Energy: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1770,7 +1770,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Activity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Activity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1783,7 +1783,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Mol: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Mol: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1796,7 +1796,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Amplitude: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Amplitude: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1809,7 +1809,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_AngleRad: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_AngleRad: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1822,7 +1822,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_AngleDeg: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_AngleDeg: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1835,7 +1835,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Angular_Momentum: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Angular_Momentum: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1848,7 +1848,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Angular_Velocity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Angular_Velocity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1861,7 +1861,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Area: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Area: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1874,7 +1874,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Capacitance: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Capacitance: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1887,7 +1887,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Charge_DensitySurface: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Charge_DensitySurface: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1900,7 +1900,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Charge_DensityVolume: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Charge_DensityVolume: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1913,7 +1913,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Compressibility: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Compressibility: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1926,7 +1926,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Conductance: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Conductance: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1939,7 +1939,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electrical_Conductivity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electrical_Conductivity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1952,7 +1952,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Density: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Density: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1965,7 +1965,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_Charge: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_Charge: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1978,7 +1978,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_Current: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_Current: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -1991,7 +1991,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_CurrentDensity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_CurrentDensity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2004,7 +2004,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_DipoleMoment: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_DipoleMoment: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2017,7 +2017,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_Displacement: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_Displacement: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2030,7 +2030,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_FieldStrength: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_FieldStrength: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2043,7 +2043,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_Flux: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_Flux: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2056,7 +2056,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_FluxDensity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_FluxDensity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2069,7 +2069,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_Polarization: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_Polarization: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2082,7 +2082,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_Potential: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_Potential: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2095,7 +2095,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electric_PotentialDifference: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electric_PotentialDifference: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2108,7 +2108,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_ElectromagneticMoment: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_ElectromagneticMoment: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2121,7 +2121,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Electromotive_Force: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Electromotive_Force: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2134,7 +2134,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Energy: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Energy: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2147,7 +2147,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Force: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Force: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2160,7 +2160,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Frequency: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Frequency: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2173,7 +2173,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Angular_Frequency: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Angular_Frequency: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2186,7 +2186,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Heat_Capacity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Heat_Capacity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2199,7 +2199,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Heat_FlowRate: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Heat_FlowRate: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2212,7 +2212,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Heat_Quantity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Heat_Quantity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2225,7 +2225,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Impedance: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Impedance: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2238,7 +2238,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Length: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Length: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2251,7 +2251,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Light_Quantity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Light_Quantity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2264,7 +2264,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Luminance: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Luminance: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2277,7 +2277,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Luminous_Flux: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Luminous_Flux: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2290,7 +2290,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Luminous_Intensity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Luminous_Intensity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2303,7 +2303,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Magnetic_FieldStrength: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Magnetic_FieldStrength: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2316,7 +2316,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Magnetic_Flux: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Magnetic_Flux: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2329,7 +2329,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Magnetic_FluxDensity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Magnetic_FluxDensity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2342,7 +2342,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Magnetic_Moment: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Magnetic_Moment: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2355,7 +2355,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Magnetic_Polarization: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Magnetic_Polarization: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2368,7 +2368,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Magnetization: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Magnetization: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2381,7 +2381,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_MagnetomotiveForce: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_MagnetomotiveForce: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2394,7 +2394,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Mass: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Mass: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2407,7 +2407,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_MassFlux: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_MassFlux: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2420,7 +2420,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Momentum: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Momentum: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2433,7 +2433,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Phase_AngleRad: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Phase_AngleRad: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2446,7 +2446,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Phase_AngleDeg: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Phase_AngleDeg: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2459,7 +2459,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Power: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Power: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2472,7 +2472,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Power_Factor: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Power_Factor: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2485,7 +2485,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Pressure: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Pressure: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2498,7 +2498,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Reactance: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Reactance: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2511,7 +2511,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Resistance: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Resistance: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2524,7 +2524,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Resistivity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Resistivity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2537,7 +2537,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_SelfInductance: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_SelfInductance: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2550,7 +2550,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_SolidAngle: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_SolidAngle: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2563,7 +2563,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Sound_Intensity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Sound_Intensity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2576,7 +2576,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Speed: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Speed: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2589,7 +2589,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Stress: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Stress: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2602,7 +2602,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Surface_Tension: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Surface_Tension: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2615,7 +2615,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Common_Temperature: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Common_Temperature: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2628,7 +2628,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Absolute_Temperature: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Absolute_Temperature: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2641,7 +2641,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_TemperatureDifference: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_TemperatureDifference: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2654,7 +2654,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Thermal_Capacity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Thermal_Capacity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2667,7 +2667,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Thermal_Conductivity: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Thermal_Conductivity: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2680,7 +2680,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_ThermoelectricPower: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_ThermoelectricPower: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2693,7 +2693,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Time: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Time: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2706,7 +2706,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Torque: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Torque: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2719,7 +2719,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Volume: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Volume: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2732,7 +2732,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Volume_Flux: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Volume_Flux: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2745,7 +2745,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Weight: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Weight: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2758,7 +2758,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Value_Work: // REAL
+        case datapointType == KnxDatapointType_DPT_Value_Work: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2771,7 +2771,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Volume_Flux_Meter: // REAL
+        case datapointType == KnxDatapointType_DPT_Volume_Flux_Meter: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2784,7 +2784,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Volume_Flux_ls: // REAL
+        case datapointType == KnxDatapointType_DPT_Volume_Flux_ls: // REAL
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2797,7 +2797,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcREAL(value), nil
-        case datapointType == KnxDatapointType.DPT_Access_Data: // Struct
+        case datapointType == KnxDatapointType_DPT_Access_Data: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -2805,84 +2805,84 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Value1)
-            Value1, _Value1Err := io.ReadUint8(4)
-            if _Value1Err != nil {
-                return nil, errors.New("Error parsing 'Value1' field " + _Value1Err.Error())
+            // Simple Field (hurz)
+            hurz, _hurzErr := io.ReadUint8(4)
+            if _hurzErr != nil {
+                return nil, errors.New("Error parsing 'hurz' field " + _hurzErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Value1)
+            _map["Struct"] = values.NewPlcUSINT(hurz)
 
-            // Simple Field (Value1)
-            Value1, _Value1Err := io.ReadUint8(4)
-            if _Value1Err != nil {
-                return nil, errors.New("Error parsing 'Value1' field " + _Value1Err.Error())
+            // Simple Field (value1)
+            value1, _value1Err := io.ReadUint8(4)
+            if _value1Err != nil {
+                return nil, errors.New("Error parsing 'value1' field " + _value1Err.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Value1)
+            _map["Struct"] = values.NewPlcUSINT(value1)
 
-            // Simple Field (Value1)
-            Value1, _Value1Err := io.ReadUint8(4)
-            if _Value1Err != nil {
-                return nil, errors.New("Error parsing 'Value1' field " + _Value1Err.Error())
+            // Simple Field (value2)
+            value2, _value2Err := io.ReadUint8(4)
+            if _value2Err != nil {
+                return nil, errors.New("Error parsing 'value2' field " + _value2Err.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Value1)
+            _map["Struct"] = values.NewPlcUSINT(value2)
 
-            // Simple Field (Value1)
-            Value1, _Value1Err := io.ReadUint8(4)
-            if _Value1Err != nil {
-                return nil, errors.New("Error parsing 'Value1' field " + _Value1Err.Error())
+            // Simple Field (value3)
+            value3, _value3Err := io.ReadUint8(4)
+            if _value3Err != nil {
+                return nil, errors.New("Error parsing 'value3' field " + _value3Err.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Value1)
+            _map["Struct"] = values.NewPlcUSINT(value3)
 
-            // Simple Field (Value1)
-            Value1, _Value1Err := io.ReadUint8(4)
-            if _Value1Err != nil {
-                return nil, errors.New("Error parsing 'Value1' field " + _Value1Err.Error())
+            // Simple Field (value4)
+            value4, _value4Err := io.ReadUint8(4)
+            if _value4Err != nil {
+                return nil, errors.New("Error parsing 'value4' field " + _value4Err.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Value1)
+            _map["Struct"] = values.NewPlcUSINT(value4)
 
-            // Simple Field (Value1)
-            Value1, _Value1Err := io.ReadUint8(4)
-            if _Value1Err != nil {
-                return nil, errors.New("Error parsing 'Value1' field " + _Value1Err.Error())
+            // Simple Field (value5)
+            value5, _value5Err := io.ReadUint8(4)
+            if _value5Err != nil {
+                return nil, errors.New("Error parsing 'value5' field " + _value5Err.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Value1)
+            _map["Struct"] = values.NewPlcUSINT(value5)
 
-            // Simple Field (DetectionError)
-            DetectionError, _DetectionErrorErr := io.ReadBit()
-            if _DetectionErrorErr != nil {
-                return nil, errors.New("Error parsing 'DetectionError' field " + _DetectionErrorErr.Error())
+            // Simple Field (detectionError)
+            detectionError, _detectionErrorErr := io.ReadBit()
+            if _detectionErrorErr != nil {
+                return nil, errors.New("Error parsing 'detectionError' field " + _detectionErrorErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(DetectionError)
+            _map["Struct"] = values.NewPlcBOOL(detectionError)
 
-            // Simple Field (Permission)
-            Permission, _PermissionErr := io.ReadBit()
-            if _PermissionErr != nil {
-                return nil, errors.New("Error parsing 'Permission' field " + _PermissionErr.Error())
+            // Simple Field (permission)
+            permission, _permissionErr := io.ReadBit()
+            if _permissionErr != nil {
+                return nil, errors.New("Error parsing 'permission' field " + _permissionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Permission)
+            _map["Struct"] = values.NewPlcBOOL(permission)
 
-            // Simple Field (ReadDirection)
-            ReadDirection, _ReadDirectionErr := io.ReadBit()
-            if _ReadDirectionErr != nil {
-                return nil, errors.New("Error parsing 'ReadDirection' field " + _ReadDirectionErr.Error())
+            // Simple Field (readDirection)
+            readDirection, _readDirectionErr := io.ReadBit()
+            if _readDirectionErr != nil {
+                return nil, errors.New("Error parsing 'readDirection' field " + _readDirectionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ReadDirection)
+            _map["Struct"] = values.NewPlcBOOL(readDirection)
 
-            // Simple Field (EncryptionOfAccessInformation)
-            EncryptionOfAccessInformation, _EncryptionOfAccessInformationErr := io.ReadBit()
-            if _EncryptionOfAccessInformationErr != nil {
-                return nil, errors.New("Error parsing 'EncryptionOfAccessInformation' field " + _EncryptionOfAccessInformationErr.Error())
+            // Simple Field (encryptionOfAccessInformation)
+            encryptionOfAccessInformation, _encryptionOfAccessInformationErr := io.ReadBit()
+            if _encryptionOfAccessInformationErr != nil {
+                return nil, errors.New("Error parsing 'encryptionOfAccessInformation' field " + _encryptionOfAccessInformationErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(EncryptionOfAccessInformation)
+            _map["Struct"] = values.NewPlcBOOL(encryptionOfAccessInformation)
 
-            // Simple Field (IndexOfAccessIdentificationCode)
-            IndexOfAccessIdentificationCode, _IndexOfAccessIdentificationCodeErr := io.ReadUint8(4)
-            if _IndexOfAccessIdentificationCodeErr != nil {
-                return nil, errors.New("Error parsing 'IndexOfAccessIdentificationCode' field " + _IndexOfAccessIdentificationCodeErr.Error())
+            // Simple Field (indexOfAccessIdentificationCode)
+            indexOfAccessIdentificationCode, _indexOfAccessIdentificationCodeErr := io.ReadUint8(4)
+            if _indexOfAccessIdentificationCodeErr != nil {
+                return nil, errors.New("Error parsing 'indexOfAccessIdentificationCode' field " + _indexOfAccessIdentificationCodeErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(IndexOfAccessIdentificationCode)
+            _map["Struct"] = values.NewPlcUSINT(indexOfAccessIdentificationCode)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_String_ASCII: // STRING
+        case datapointType == KnxDatapointType_DPT_String_ASCII: // STRING
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2895,7 +2895,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcSTRING(value), nil
-        case datapointType == KnxDatapointType.DPT_String_8859_1: // STRING
+        case datapointType == KnxDatapointType_DPT_String_8859_1: // STRING
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
@@ -2908,7 +2908,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcSTRING(value), nil
-        case datapointType == KnxDatapointType.DPT_SceneNumber: // USINT
+        case datapointType == KnxDatapointType_DPT_SceneNumber: // USINT
 
             // Simple Field (value)
             value, _valueErr := io.ReadUint8(6)
@@ -2916,7 +2916,7 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
             return values.NewPlcUSINT(value), nil
-        case datapointType == KnxDatapointType.DPT_SceneControl: // Struct
+        case datapointType == KnxDatapointType_DPT_SceneControl: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -2924,26 +2924,26 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (LearnTheSceneCorrespondingToTheFieldSceneNumber)
-            LearnTheSceneCorrespondingToTheFieldSceneNumber, _LearnTheSceneCorrespondingToTheFieldSceneNumberErr := io.ReadBit()
-            if _LearnTheSceneCorrespondingToTheFieldSceneNumberErr != nil {
-                return nil, errors.New("Error parsing 'LearnTheSceneCorrespondingToTheFieldSceneNumber' field " + _LearnTheSceneCorrespondingToTheFieldSceneNumberErr.Error())
+            // Simple Field (learnTheSceneCorrespondingToTheFieldSceneNumber)
+            learnTheSceneCorrespondingToTheFieldSceneNumber, _learnTheSceneCorrespondingToTheFieldSceneNumberErr := io.ReadBit()
+            if _learnTheSceneCorrespondingToTheFieldSceneNumberErr != nil {
+                return nil, errors.New("Error parsing 'learnTheSceneCorrespondingToTheFieldSceneNumber' field " + _learnTheSceneCorrespondingToTheFieldSceneNumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(LearnTheSceneCorrespondingToTheFieldSceneNumber)
+            _map["Struct"] = values.NewPlcBOOL(learnTheSceneCorrespondingToTheFieldSceneNumber)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(1); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (SceneNumber)
-            SceneNumber, _SceneNumberErr := io.ReadUint8(6)
-            if _SceneNumberErr != nil {
-                return nil, errors.New("Error parsing 'SceneNumber' field " + _SceneNumberErr.Error())
+            // Simple Field (sceneNumber)
+            sceneNumber, _sceneNumberErr := io.ReadUint8(6)
+            if _sceneNumberErr != nil {
+                return nil, errors.New("Error parsing 'sceneNumber' field " + _sceneNumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(SceneNumber)
+            _map["Struct"] = values.NewPlcUSINT(sceneNumber)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_DateTime: // Struct
+        case datapointType == KnxDatapointType_DPT_DateTime: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -2951,272 +2951,1483 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Year)
-            Year, _YearErr := io.ReadUint8(8)
-            if _YearErr != nil {
-                return nil, errors.New("Error parsing 'Year' field " + _YearErr.Error())
+            // Simple Field (year)
+            year, _yearErr := io.ReadUint8(8)
+            if _yearErr != nil {
+                return nil, errors.New("Error parsing 'year' field " + _yearErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Year)
+            _map["Struct"] = values.NewPlcUSINT(year)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Month)
-            Month, _MonthErr := io.ReadUint8(4)
-            if _MonthErr != nil {
-                return nil, errors.New("Error parsing 'Month' field " + _MonthErr.Error())
+            // Simple Field (month)
+            month, _monthErr := io.ReadUint8(4)
+            if _monthErr != nil {
+                return nil, errors.New("Error parsing 'month' field " + _monthErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Month)
+            _map["Struct"] = values.NewPlcUSINT(month)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(3); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Dayofmonth)
-            Dayofmonth, _DayofmonthErr := io.ReadUint8(5)
-            if _DayofmonthErr != nil {
-                return nil, errors.New("Error parsing 'Dayofmonth' field " + _DayofmonthErr.Error())
+            // Simple Field (dayofmonth)
+            dayofmonth, _dayofmonthErr := io.ReadUint8(5)
+            if _dayofmonthErr != nil {
+                return nil, errors.New("Error parsing 'dayofmonth' field " + _dayofmonthErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Dayofmonth)
+            _map["Struct"] = values.NewPlcUSINT(dayofmonth)
 
-            // Simple Field (Dayofweek)
-            Dayofweek, _DayofweekErr := io.ReadUint8(3)
-            if _DayofweekErr != nil {
-                return nil, errors.New("Error parsing 'Dayofweek' field " + _DayofweekErr.Error())
+            // Simple Field (dayofweek)
+            dayofweek, _dayofweekErr := io.ReadUint8(3)
+            if _dayofweekErr != nil {
+                return nil, errors.New("Error parsing 'dayofweek' field " + _dayofweekErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Dayofweek)
+            _map["Struct"] = values.NewPlcUSINT(dayofweek)
 
-            // Simple Field (Hourofday)
-            Hourofday, _HourofdayErr := io.ReadUint8(5)
-            if _HourofdayErr != nil {
-                return nil, errors.New("Error parsing 'Hourofday' field " + _HourofdayErr.Error())
+            // Simple Field (hourofday)
+            hourofday, _hourofdayErr := io.ReadUint8(5)
+            if _hourofdayErr != nil {
+                return nil, errors.New("Error parsing 'hourofday' field " + _hourofdayErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Hourofday)
+            _map["Struct"] = values.NewPlcUSINT(hourofday)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(2); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Minutes)
-            Minutes, _MinutesErr := io.ReadUint8(6)
-            if _MinutesErr != nil {
-                return nil, errors.New("Error parsing 'Minutes' field " + _MinutesErr.Error())
+            // Simple Field (minutes)
+            minutes, _minutesErr := io.ReadUint8(6)
+            if _minutesErr != nil {
+                return nil, errors.New("Error parsing 'minutes' field " + _minutesErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Minutes)
+            _map["Struct"] = values.NewPlcUSINT(minutes)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(2); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Seconds)
-            Seconds, _SecondsErr := io.ReadUint8(6)
-            if _SecondsErr != nil {
-                return nil, errors.New("Error parsing 'Seconds' field " + _SecondsErr.Error())
+            // Simple Field (seconds)
+            seconds, _secondsErr := io.ReadUint8(6)
+            if _secondsErr != nil {
+                return nil, errors.New("Error parsing 'seconds' field " + _secondsErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Seconds)
+            _map["Struct"] = values.NewPlcUSINT(seconds)
 
-            // Simple Field (Fault)
-            Fault, _FaultErr := io.ReadBit()
-            if _FaultErr != nil {
-                return nil, errors.New("Error parsing 'Fault' field " + _FaultErr.Error())
+            // Simple Field (fault)
+            fault, _faultErr := io.ReadBit()
+            if _faultErr != nil {
+                return nil, errors.New("Error parsing 'fault' field " + _faultErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fault)
+            _map["Struct"] = values.NewPlcBOOL(fault)
 
-            // Simple Field (WorkingDay)
-            WorkingDay, _WorkingDayErr := io.ReadBit()
-            if _WorkingDayErr != nil {
-                return nil, errors.New("Error parsing 'WorkingDay' field " + _WorkingDayErr.Error())
+            // Simple Field (workingDay)
+            workingDay, _workingDayErr := io.ReadBit()
+            if _workingDayErr != nil {
+                return nil, errors.New("Error parsing 'workingDay' field " + _workingDayErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(WorkingDay)
+            _map["Struct"] = values.NewPlcBOOL(workingDay)
 
-            // Simple Field (NoWd)
-            NoWd, _NoWdErr := io.ReadBit()
-            if _NoWdErr != nil {
-                return nil, errors.New("Error parsing 'NoWd' field " + _NoWdErr.Error())
+            // Simple Field (noWd)
+            noWd, _noWdErr := io.ReadBit()
+            if _noWdErr != nil {
+                return nil, errors.New("Error parsing 'noWd' field " + _noWdErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(NoWd)
+            _map["Struct"] = values.NewPlcBOOL(noWd)
 
-            // Simple Field (NoYear)
-            NoYear, _NoYearErr := io.ReadBit()
-            if _NoYearErr != nil {
-                return nil, errors.New("Error parsing 'NoYear' field " + _NoYearErr.Error())
+            // Simple Field (noYear)
+            noYear, _noYearErr := io.ReadBit()
+            if _noYearErr != nil {
+                return nil, errors.New("Error parsing 'noYear' field " + _noYearErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(NoYear)
+            _map["Struct"] = values.NewPlcBOOL(noYear)
 
-            // Simple Field (NoDate)
-            NoDate, _NoDateErr := io.ReadBit()
-            if _NoDateErr != nil {
-                return nil, errors.New("Error parsing 'NoDate' field " + _NoDateErr.Error())
+            // Simple Field (noDate)
+            noDate, _noDateErr := io.ReadBit()
+            if _noDateErr != nil {
+                return nil, errors.New("Error parsing 'noDate' field " + _noDateErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(NoDate)
+            _map["Struct"] = values.NewPlcBOOL(noDate)
 
-            // Simple Field (NoDayOfWeek)
-            NoDayOfWeek, _NoDayOfWeekErr := io.ReadBit()
-            if _NoDayOfWeekErr != nil {
-                return nil, errors.New("Error parsing 'NoDayOfWeek' field " + _NoDayOfWeekErr.Error())
+            // Simple Field (noDayOfWeek)
+            noDayOfWeek, _noDayOfWeekErr := io.ReadBit()
+            if _noDayOfWeekErr != nil {
+                return nil, errors.New("Error parsing 'noDayOfWeek' field " + _noDayOfWeekErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(NoDayOfWeek)
+            _map["Struct"] = values.NewPlcBOOL(noDayOfWeek)
 
-            // Simple Field (NoTime)
-            NoTime, _NoTimeErr := io.ReadBit()
-            if _NoTimeErr != nil {
-                return nil, errors.New("Error parsing 'NoTime' field " + _NoTimeErr.Error())
+            // Simple Field (noTime)
+            noTime, _noTimeErr := io.ReadBit()
+            if _noTimeErr != nil {
+                return nil, errors.New("Error parsing 'noTime' field " + _noTimeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(NoTime)
+            _map["Struct"] = values.NewPlcBOOL(noTime)
 
-            // Simple Field (StandardSummerTime)
-            StandardSummerTime, _StandardSummerTimeErr := io.ReadBit()
-            if _StandardSummerTimeErr != nil {
-                return nil, errors.New("Error parsing 'StandardSummerTime' field " + _StandardSummerTimeErr.Error())
+            // Simple Field (standardSummerTime)
+            standardSummerTime, _standardSummerTimeErr := io.ReadBit()
+            if _standardSummerTimeErr != nil {
+                return nil, errors.New("Error parsing 'standardSummerTime' field " + _standardSummerTimeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StandardSummerTime)
+            _map["Struct"] = values.NewPlcBOOL(standardSummerTime)
 
-            // Simple Field (QualityOfClock)
-            QualityOfClock, _QualityOfClockErr := io.ReadBit()
-            if _QualityOfClockErr != nil {
-                return nil, errors.New("Error parsing 'QualityOfClock' field " + _QualityOfClockErr.Error())
+            // Simple Field (qualityOfClock)
+            qualityOfClock, _qualityOfClockErr := io.ReadBit()
+            if _qualityOfClockErr != nil {
+                return nil, errors.New("Error parsing 'qualityOfClock' field " + _qualityOfClockErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(QualityOfClock)
+            _map["Struct"] = values.NewPlcBOOL(qualityOfClock)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_SCLOMode: // STRING
-        case datapointType == KnxDatapointType.DPT_BuildingMode: // STRING
-        case datapointType == KnxDatapointType.DPT_OccMode: // STRING
-        case datapointType == KnxDatapointType.DPT_Priority: // STRING
-        case datapointType == KnxDatapointType.DPT_LightApplicationMode: // STRING
-        case datapointType == KnxDatapointType.DPT_ApplicationArea: // STRING
-        case datapointType == KnxDatapointType.DPT_AlarmClassType: // STRING
-        case datapointType == KnxDatapointType.DPT_PSUMode: // STRING
-        case datapointType == KnxDatapointType.DPT_ErrorClass_System: // STRING
-        case datapointType == KnxDatapointType.DPT_ErrorClass_HVAC: // STRING
-        case datapointType == KnxDatapointType.DPT_Time_Delay: // STRING
-        case datapointType == KnxDatapointType.DPT_Beaufort_Wind_Force_Scale: // STRING
-        case datapointType == KnxDatapointType.DPT_SensorSelect: // STRING
-        case datapointType == KnxDatapointType.DPT_ActuatorConnectType: // STRING
-        case datapointType == KnxDatapointType.DPT_Cloud_Cover: // STRING
-        case datapointType == KnxDatapointType.DPT_PowerReturnMode: // STRING
-        case datapointType == KnxDatapointType.DPT_FuelType: // STRING
-        case datapointType == KnxDatapointType.DPT_BurnerType: // STRING
-        case datapointType == KnxDatapointType.DPT_HVACMode: // STRING
-        case datapointType == KnxDatapointType.DPT_DHWMode: // STRING
-        case datapointType == KnxDatapointType.DPT_LoadPriority: // STRING
-        case datapointType == KnxDatapointType.DPT_HVACContrMode: // STRING
-        case datapointType == KnxDatapointType.DPT_HVACEmergMode: // STRING
-        case datapointType == KnxDatapointType.DPT_ChangeoverMode: // STRING
-        case datapointType == KnxDatapointType.DPT_ValveMode: // STRING
-        case datapointType == KnxDatapointType.DPT_DamperMode: // STRING
-        case datapointType == KnxDatapointType.DPT_HeaterMode: // STRING
-        case datapointType == KnxDatapointType.DPT_FanMode: // STRING
-        case datapointType == KnxDatapointType.DPT_MasterSlaveMode: // STRING
-        case datapointType == KnxDatapointType.DPT_StatusRoomSetp: // STRING
-        case datapointType == KnxDatapointType.DPT_Metering_DeviceType: // STRING
-        case datapointType == KnxDatapointType.DPT_HumDehumMode: // STRING
-        case datapointType == KnxDatapointType.DPT_EnableHCStage: // STRING
-        case datapointType == KnxDatapointType.DPT_ADAType: // STRING
-        case datapointType == KnxDatapointType.DPT_BackupMode: // STRING
-        case datapointType == KnxDatapointType.DPT_StartSynchronization: // STRING
-        case datapointType == KnxDatapointType.DPT_Behaviour_Lock_Unlock: // STRING
-        case datapointType == KnxDatapointType.DPT_Behaviour_Bus_Power_Up_Down: // STRING
-        case datapointType == KnxDatapointType.DPT_DALI_Fade_Time: // STRING
-        case datapointType == KnxDatapointType.DPT_BlinkingMode: // STRING
-        case datapointType == KnxDatapointType.DPT_LightControlMode: // STRING
-        case datapointType == KnxDatapointType.DPT_SwitchPBModel: // STRING
-        case datapointType == KnxDatapointType.DPT_PBAction: // STRING
-        case datapointType == KnxDatapointType.DPT_DimmPBModel: // STRING
-        case datapointType == KnxDatapointType.DPT_SwitchOnMode: // STRING
-        case datapointType == KnxDatapointType.DPT_LoadTypeSet: // STRING
-        case datapointType == KnxDatapointType.DPT_LoadTypeDetected: // STRING
-        case datapointType == KnxDatapointType.DPT_Converter_Test_Control: // STRING
-        case datapointType == KnxDatapointType.DPT_SABExcept_Behaviour: // STRING
-        case datapointType == KnxDatapointType.DPT_SABBehaviour_Lock_Unlock: // STRING
-        case datapointType == KnxDatapointType.DPT_SSSBMode: // STRING
-        case datapointType == KnxDatapointType.DPT_BlindsControlMode: // STRING
-        case datapointType == KnxDatapointType.DPT_CommMode: // STRING
-        case datapointType == KnxDatapointType.DPT_AddInfoTypes: // STRING
-        case datapointType == KnxDatapointType.DPT_RF_ModeSelect: // STRING
-        case datapointType == KnxDatapointType.DPT_RF_FilterSelect: // STRING
-        case datapointType == KnxDatapointType.DPT_StatusGen: // Struct
+        case datapointType == KnxDatapointType_DPT_SCLOMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_BuildingMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_OccMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Priority: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_LightApplicationMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ApplicationArea: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_AlarmClassType: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_PSUMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ErrorClass_System: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ErrorClass_HVAC: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Time_Delay: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Beaufort_Wind_Force_Scale: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_SensorSelect: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ActuatorConnectType: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Cloud_Cover: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_PowerReturnMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_FuelType: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_BurnerType: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_HVACMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_DHWMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_LoadPriority: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_HVACContrMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_HVACEmergMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ChangeoverMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ValveMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_DamperMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_HeaterMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_FanMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_MasterSlaveMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_StatusRoomSetp: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Metering_DeviceType: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_HumDehumMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_EnableHCStage: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ADAType: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_BackupMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_StartSynchronization: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Behaviour_Lock_Unlock: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Behaviour_Bus_Power_Up_Down: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_DALI_Fade_Time: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_BlinkingMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_LightControlMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_SwitchPBModel: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_PBAction: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_DimmPBModel: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_SwitchOnMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_LoadTypeSet: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_LoadTypeDetected: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Converter_Test_Control: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_SABExcept_Behaviour: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_SABBehaviour_Lock_Unlock: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_SSSBMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_BlindsControlMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_CommMode: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_AddInfoTypes: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_RF_ModeSelect: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_RF_FilterSelect: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(8)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_StatusGen: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(3); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (alarmStatusOfCorrespondingDatapointIsNotAcknowledged)
+            alarmStatusOfCorrespondingDatapointIsNotAcknowledged, _alarmStatusOfCorrespondingDatapointIsNotAcknowledgedErr := io.ReadBit()
+            if _alarmStatusOfCorrespondingDatapointIsNotAcknowledgedErr != nil {
+                return nil, errors.New("Error parsing 'alarmStatusOfCorrespondingDatapointIsNotAcknowledged' field " + _alarmStatusOfCorrespondingDatapointIsNotAcknowledgedErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(alarmStatusOfCorrespondingDatapointIsNotAcknowledged)
+
+            // Simple Field (correspondingDatapointIsInAlarm)
+            correspondingDatapointIsInAlarm, _correspondingDatapointIsInAlarmErr := io.ReadBit()
+            if _correspondingDatapointIsInAlarmErr != nil {
+                return nil, errors.New("Error parsing 'correspondingDatapointIsInAlarm' field " + _correspondingDatapointIsInAlarmErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(correspondingDatapointIsInAlarm)
+
+            // Simple Field (correspondingDatapointMainValueIsOverridden)
+            correspondingDatapointMainValueIsOverridden, _correspondingDatapointMainValueIsOverriddenErr := io.ReadBit()
+            if _correspondingDatapointMainValueIsOverriddenErr != nil {
+                return nil, errors.New("Error parsing 'correspondingDatapointMainValueIsOverridden' field " + _correspondingDatapointMainValueIsOverriddenErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(correspondingDatapointMainValueIsOverridden)
+
+            // Simple Field (correspondingDatapointMainValueIsCorruptedDueToFailure)
+            correspondingDatapointMainValueIsCorruptedDueToFailure, _correspondingDatapointMainValueIsCorruptedDueToFailureErr := io.ReadBit()
+            if _correspondingDatapointMainValueIsCorruptedDueToFailureErr != nil {
+                return nil, errors.New("Error parsing 'correspondingDatapointMainValueIsCorruptedDueToFailure' field " + _correspondingDatapointMainValueIsCorruptedDueToFailureErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(correspondingDatapointMainValueIsCorruptedDueToFailure)
+
+            // Simple Field (correspondingDatapointValueIsOutOfService)
+            correspondingDatapointValueIsOutOfService, _correspondingDatapointValueIsOutOfServiceErr := io.ReadBit()
+            if _correspondingDatapointValueIsOutOfServiceErr != nil {
+                return nil, errors.New("Error parsing 'correspondingDatapointValueIsOutOfService' field " + _correspondingDatapointValueIsOutOfServiceErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(correspondingDatapointValueIsOutOfService)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_Device_Control: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(5); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (verifyModeIsOn)
+            verifyModeIsOn, _verifyModeIsOnErr := io.ReadBit()
+            if _verifyModeIsOnErr != nil {
+                return nil, errors.New("Error parsing 'verifyModeIsOn' field " + _verifyModeIsOnErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(verifyModeIsOn)
+
+            // Simple Field (aDatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived)
+            aDatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived, _aDatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceivedErr := io.ReadBit()
+            if _aDatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceivedErr != nil {
+                return nil, errors.New("Error parsing 'aDatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived' field " + _aDatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceivedErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(aDatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived)
+
+            // Simple Field (theUserApplicationIsStopped)
+            theUserApplicationIsStopped, _theUserApplicationIsStoppedErr := io.ReadBit()
+            if _theUserApplicationIsStoppedErr != nil {
+                return nil, errors.New("Error parsing 'theUserApplicationIsStopped' field " + _theUserApplicationIsStoppedErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(theUserApplicationIsStopped)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_ForceSign: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (roomhmax)
+            roomhmax, _roomhmaxErr := io.ReadBit()
+            if _roomhmaxErr != nil {
+                return nil, errors.New("Error parsing 'roomhmax' field " + _roomhmaxErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(roomhmax)
+
+            // Simple Field (roomhconf)
+            roomhconf, _roomhconfErr := io.ReadBit()
+            if _roomhconfErr != nil {
+                return nil, errors.New("Error parsing 'roomhconf' field " + _roomhconfErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(roomhconf)
+
+            // Simple Field (dhwlegio)
+            dhwlegio, _dhwlegioErr := io.ReadBit()
+            if _dhwlegioErr != nil {
+                return nil, errors.New("Error parsing 'dhwlegio' field " + _dhwlegioErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(dhwlegio)
+
+            // Simple Field (dhwnorm)
+            dhwnorm, _dhwnormErr := io.ReadBit()
+            if _dhwnormErr != nil {
+                return nil, errors.New("Error parsing 'dhwnorm' field " + _dhwnormErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(dhwnorm)
+
+            // Simple Field (overrun)
+            overrun, _overrunErr := io.ReadBit()
+            if _overrunErr != nil {
+                return nil, errors.New("Error parsing 'overrun' field " + _overrunErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(overrun)
+
+            // Simple Field (oversupply)
+            oversupply, _oversupplyErr := io.ReadBit()
+            if _oversupplyErr != nil {
+                return nil, errors.New("Error parsing 'oversupply' field " + _oversupplyErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(oversupply)
+
+            // Simple Field (protection)
+            protection, _protectionErr := io.ReadBit()
+            if _protectionErr != nil {
+                return nil, errors.New("Error parsing 'protection' field " + _protectionErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(protection)
+
+            // Simple Field (forcerequest)
+            forcerequest, _forcerequestErr := io.ReadBit()
+            if _forcerequestErr != nil {
+                return nil, errors.New("Error parsing 'forcerequest' field " + _forcerequestErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(forcerequest)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_ForceSignCool: // BOOL
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(7); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadBit()
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcBOOL(value), nil
+        case datapointType == KnxDatapointType_DPT_StatusRHC: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (summermode)
+            summermode, _summermodeErr := io.ReadBit()
+            if _summermodeErr != nil {
+                return nil, errors.New("Error parsing 'summermode' field " + _summermodeErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(summermode)
+
+            // Simple Field (statusstopoptim)
+            statusstopoptim, _statusstopoptimErr := io.ReadBit()
+            if _statusstopoptimErr != nil {
+                return nil, errors.New("Error parsing 'statusstopoptim' field " + _statusstopoptimErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(statusstopoptim)
+
+            // Simple Field (statusstartoptim)
+            statusstartoptim, _statusstartoptimErr := io.ReadBit()
+            if _statusstartoptimErr != nil {
+                return nil, errors.New("Error parsing 'statusstartoptim' field " + _statusstartoptimErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(statusstartoptim)
+
+            // Simple Field (statusmorningboost)
+            statusmorningboost, _statusmorningboostErr := io.ReadBit()
+            if _statusmorningboostErr != nil {
+                return nil, errors.New("Error parsing 'statusmorningboost' field " + _statusmorningboostErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(statusmorningboost)
+
+            // Simple Field (tempreturnlimit)
+            tempreturnlimit, _tempreturnlimitErr := io.ReadBit()
+            if _tempreturnlimitErr != nil {
+                return nil, errors.New("Error parsing 'tempreturnlimit' field " + _tempreturnlimitErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(tempreturnlimit)
+
+            // Simple Field (tempflowlimit)
+            tempflowlimit, _tempflowlimitErr := io.ReadBit()
+            if _tempflowlimitErr != nil {
+                return nil, errors.New("Error parsing 'tempflowlimit' field " + _tempflowlimitErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(tempflowlimit)
+
+            // Simple Field (satuseco)
+            satuseco, _satusecoErr := io.ReadBit()
+            if _satusecoErr != nil {
+                return nil, errors.New("Error parsing 'satuseco' field " + _satusecoErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(satuseco)
+
+            // Simple Field (fault)
+            fault, _faultErr := io.ReadBit()
+            if _faultErr != nil {
+                return nil, errors.New("Error parsing 'fault' field " + _faultErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(fault)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_StatusSDHWC: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(5); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (solarloadsufficient)
+            solarloadsufficient, _solarloadsufficientErr := io.ReadBit()
+            if _solarloadsufficientErr != nil {
+                return nil, errors.New("Error parsing 'solarloadsufficient' field " + _solarloadsufficientErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(solarloadsufficient)
+
+            // Simple Field (sdhwloadactive)
+            sdhwloadactive, _sdhwloadactiveErr := io.ReadBit()
+            if _sdhwloadactiveErr != nil {
+                return nil, errors.New("Error parsing 'sdhwloadactive' field " + _sdhwloadactiveErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(sdhwloadactive)
+
+            // Simple Field (fault)
+            fault, _faultErr := io.ReadBit()
+            if _faultErr != nil {
+                return nil, errors.New("Error parsing 'fault' field " + _faultErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(fault)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_FuelTypeSet: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(5); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (solidstate)
+            solidstate, _solidstateErr := io.ReadBit()
+            if _solidstateErr != nil {
+                return nil, errors.New("Error parsing 'solidstate' field " + _solidstateErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(solidstate)
+
+            // Simple Field (gas)
+            gas, _gasErr := io.ReadBit()
+            if _gasErr != nil {
+                return nil, errors.New("Error parsing 'gas' field " + _gasErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(gas)
+
+            // Simple Field (oil)
+            oil, _oilErr := io.ReadBit()
+            if _oilErr != nil {
+                return nil, errors.New("Error parsing 'oil' field " + _oilErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(oil)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_StatusRCC: // BOOL
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(7); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadBit()
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcBOOL(value), nil
+        case datapointType == KnxDatapointType_DPT_StatusAHU: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (cool)
+            cool, _coolErr := io.ReadBit()
+            if _coolErr != nil {
+                return nil, errors.New("Error parsing 'cool' field " + _coolErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(cool)
+
+            // Simple Field (heat)
+            heat, _heatErr := io.ReadBit()
+            if _heatErr != nil {
+                return nil, errors.New("Error parsing 'heat' field " + _heatErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(heat)
+
+            // Simple Field (fanactive)
+            fanactive, _fanactiveErr := io.ReadBit()
+            if _fanactiveErr != nil {
+                return nil, errors.New("Error parsing 'fanactive' field " + _fanactiveErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(fanactive)
+
+            // Simple Field (fault)
+            fault, _faultErr := io.ReadBit()
+            if _faultErr != nil {
+                return nil, errors.New("Error parsing 'fault' field " + _faultErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(fault)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_CombinedStatus_RTSM: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(3); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (statusOfHvacModeUser)
+            statusOfHvacModeUser, _statusOfHvacModeUserErr := io.ReadBit()
+            if _statusOfHvacModeUserErr != nil {
+                return nil, errors.New("Error parsing 'statusOfHvacModeUser' field " + _statusOfHvacModeUserErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(statusOfHvacModeUser)
+
+            // Simple Field (statusOfComfortProlongationUser)
+            statusOfComfortProlongationUser, _statusOfComfortProlongationUserErr := io.ReadBit()
+            if _statusOfComfortProlongationUserErr != nil {
+                return nil, errors.New("Error parsing 'statusOfComfortProlongationUser' field " + _statusOfComfortProlongationUserErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(statusOfComfortProlongationUser)
+
+            // Simple Field (effectiveValueOfTheComfortPushButton)
+            effectiveValueOfTheComfortPushButton, _effectiveValueOfTheComfortPushButtonErr := io.ReadBit()
+            if _effectiveValueOfTheComfortPushButtonErr != nil {
+                return nil, errors.New("Error parsing 'effectiveValueOfTheComfortPushButton' field " + _effectiveValueOfTheComfortPushButtonErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(effectiveValueOfTheComfortPushButton)
+
+            // Simple Field (effectiveValueOfThePresenceStatus)
+            effectiveValueOfThePresenceStatus, _effectiveValueOfThePresenceStatusErr := io.ReadBit()
+            if _effectiveValueOfThePresenceStatusErr != nil {
+                return nil, errors.New("Error parsing 'effectiveValueOfThePresenceStatus' field " + _effectiveValueOfThePresenceStatusErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(effectiveValueOfThePresenceStatus)
+
+            // Simple Field (effectiveValueOfTheWindowStatus)
+            effectiveValueOfTheWindowStatus, _effectiveValueOfTheWindowStatusErr := io.ReadBit()
+            if _effectiveValueOfTheWindowStatusErr != nil {
+                return nil, errors.New("Error parsing 'effectiveValueOfTheWindowStatus' field " + _effectiveValueOfTheWindowStatusErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(effectiveValueOfTheWindowStatus)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_LightActuatorErrorInfo: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(1); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (overheat)
+            overheat, _overheatErr := io.ReadBit()
+            if _overheatErr != nil {
+                return nil, errors.New("Error parsing 'overheat' field " + _overheatErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(overheat)
+
+            // Simple Field (lampfailure)
+            lampfailure, _lampfailureErr := io.ReadBit()
+            if _lampfailureErr != nil {
+                return nil, errors.New("Error parsing 'lampfailure' field " + _lampfailureErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(lampfailure)
+
+            // Simple Field (defectiveload)
+            defectiveload, _defectiveloadErr := io.ReadBit()
+            if _defectiveloadErr != nil {
+                return nil, errors.New("Error parsing 'defectiveload' field " + _defectiveloadErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(defectiveload)
+
+            // Simple Field (underload)
+            underload, _underloadErr := io.ReadBit()
+            if _underloadErr != nil {
+                return nil, errors.New("Error parsing 'underload' field " + _underloadErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(underload)
+
+            // Simple Field (overcurrent)
+            overcurrent, _overcurrentErr := io.ReadBit()
+            if _overcurrentErr != nil {
+                return nil, errors.New("Error parsing 'overcurrent' field " + _overcurrentErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(overcurrent)
+
+            // Simple Field (undervoltage)
+            undervoltage, _undervoltageErr := io.ReadBit()
+            if _undervoltageErr != nil {
+                return nil, errors.New("Error parsing 'undervoltage' field " + _undervoltageErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(undervoltage)
+
+            // Simple Field (loaddetectionerror)
+            loaddetectionerror, _loaddetectionerrorErr := io.ReadBit()
+            if _loaddetectionerrorErr != nil {
+                return nil, errors.New("Error parsing 'loaddetectionerror' field " + _loaddetectionerrorErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(loaddetectionerror)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_RF_ModeInfo: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(5); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (bibatSlave)
+            bibatSlave, _bibatSlaveErr := io.ReadBit()
+            if _bibatSlaveErr != nil {
+                return nil, errors.New("Error parsing 'bibatSlave' field " + _bibatSlaveErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(bibatSlave)
+
+            // Simple Field (bibatMaster)
+            bibatMaster, _bibatMasterErr := io.ReadBit()
+            if _bibatMasterErr != nil {
+                return nil, errors.New("Error parsing 'bibatMaster' field " + _bibatMasterErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(bibatMaster)
+
+            // Simple Field (asynchronous)
+            asynchronous, _asynchronousErr := io.ReadBit()
+            if _asynchronousErr != nil {
+                return nil, errors.New("Error parsing 'asynchronous' field " + _asynchronousErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(asynchronous)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_RF_FilterInfo: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(3); _err != nil {
+            if _, _err := io.ReadUint8(5); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (doa)
+            doa, _doaErr := io.ReadBit()
+            if _doaErr != nil {
+                return nil, errors.New("Error parsing 'doa' field " + _doaErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(doa)
+
+            // Simple Field (knxSn)
+            knxSn, _knxSnErr := io.ReadBit()
+            if _knxSnErr != nil {
+                return nil, errors.New("Error parsing 'knxSn' field " + _knxSnErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(knxSn)
+
+            // Simple Field (doaAndKnxSn)
+            doaAndKnxSn, _doaAndKnxSnErr := io.ReadBit()
+            if _doaAndKnxSnErr != nil {
+                return nil, errors.New("Error parsing 'doaAndKnxSn' field " + _doaAndKnxSnErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(doaAndKnxSn)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_Channel_Activation_8: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (AlarmStatusOfCorrespondingDatapointIsNotAcknowledged)
-            AlarmStatusOfCorrespondingDatapointIsNotAcknowledged, _AlarmStatusOfCorrespondingDatapointIsNotAcknowledgedErr := io.ReadBit()
-            if _AlarmStatusOfCorrespondingDatapointIsNotAcknowledgedErr != nil {
-                return nil, errors.New("Error parsing 'AlarmStatusOfCorrespondingDatapointIsNotAcknowledged' field " + _AlarmStatusOfCorrespondingDatapointIsNotAcknowledgedErr.Error())
+            // Simple Field (activationStateOfChannel1)
+            activationStateOfChannel1, _activationStateOfChannel1Err := io.ReadBit()
+            if _activationStateOfChannel1Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel1' field " + _activationStateOfChannel1Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel1)
+
+            // Simple Field (activationStateOfChannel2)
+            activationStateOfChannel2, _activationStateOfChannel2Err := io.ReadBit()
+            if _activationStateOfChannel2Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel2' field " + _activationStateOfChannel2Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel2)
+
+            // Simple Field (activationStateOfChannel3)
+            activationStateOfChannel3, _activationStateOfChannel3Err := io.ReadBit()
+            if _activationStateOfChannel3Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel3' field " + _activationStateOfChannel3Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(AlarmStatusOfCorrespondingDatapointIsNotAcknowledged)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel3)
 
-            // Simple Field (CorrespondingDatapointIsInAlarm)
-            CorrespondingDatapointIsInAlarm, _CorrespondingDatapointIsInAlarmErr := io.ReadBit()
-            if _CorrespondingDatapointIsInAlarmErr != nil {
-                return nil, errors.New("Error parsing 'CorrespondingDatapointIsInAlarm' field " + _CorrespondingDatapointIsInAlarmErr.Error())
+            // Simple Field (activationStateOfChannel4)
+            activationStateOfChannel4, _activationStateOfChannel4Err := io.ReadBit()
+            if _activationStateOfChannel4Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel4' field " + _activationStateOfChannel4Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(CorrespondingDatapointIsInAlarm)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel4)
 
-            // Simple Field (CorrespondingDatapointMainValueIsOverridden)
-            CorrespondingDatapointMainValueIsOverridden, _CorrespondingDatapointMainValueIsOverriddenErr := io.ReadBit()
-            if _CorrespondingDatapointMainValueIsOverriddenErr != nil {
-                return nil, errors.New("Error parsing 'CorrespondingDatapointMainValueIsOverridden' field " + _CorrespondingDatapointMainValueIsOverriddenErr.Error())
+            // Simple Field (activationStateOfChannel5)
+            activationStateOfChannel5, _activationStateOfChannel5Err := io.ReadBit()
+            if _activationStateOfChannel5Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel5' field " + _activationStateOfChannel5Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(CorrespondingDatapointMainValueIsOverridden)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel5)
 
-            // Simple Field (CorrespondingDatapointMainValueIsCorruptedDueToFailure)
-            CorrespondingDatapointMainValueIsCorruptedDueToFailure, _CorrespondingDatapointMainValueIsCorruptedDueToFailureErr := io.ReadBit()
-            if _CorrespondingDatapointMainValueIsCorruptedDueToFailureErr != nil {
-                return nil, errors.New("Error parsing 'CorrespondingDatapointMainValueIsCorruptedDueToFailure' field " + _CorrespondingDatapointMainValueIsCorruptedDueToFailureErr.Error())
+            // Simple Field (activationStateOfChannel6)
+            activationStateOfChannel6, _activationStateOfChannel6Err := io.ReadBit()
+            if _activationStateOfChannel6Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel6' field " + _activationStateOfChannel6Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(CorrespondingDatapointMainValueIsCorruptedDueToFailure)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel6)
 
-            // Simple Field (CorrespondingDatapointValueIsOutOfService)
-            CorrespondingDatapointValueIsOutOfService, _CorrespondingDatapointValueIsOutOfServiceErr := io.ReadBit()
-            if _CorrespondingDatapointValueIsOutOfServiceErr != nil {
-                return nil, errors.New("Error parsing 'CorrespondingDatapointValueIsOutOfService' field " + _CorrespondingDatapointValueIsOutOfServiceErr.Error())
+            // Simple Field (activationStateOfChannel7)
+            activationStateOfChannel7, _activationStateOfChannel7Err := io.ReadBit()
+            if _activationStateOfChannel7Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel7' field " + _activationStateOfChannel7Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(CorrespondingDatapointValueIsOutOfService)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel7)
+
+            // Simple Field (activationStateOfChannel8)
+            activationStateOfChannel8, _activationStateOfChannel8Err := io.ReadBit()
+            if _activationStateOfChannel8Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel8' field " + _activationStateOfChannel8Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel8)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Device_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_StatusDHWC: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(5); _err != nil {
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (VerifyModeIsOn)
-            VerifyModeIsOn, _VerifyModeIsOnErr := io.ReadBit()
-            if _VerifyModeIsOnErr != nil {
-                return nil, errors.New("Error parsing 'VerifyModeIsOn' field " + _VerifyModeIsOnErr.Error())
+            // Simple Field (tempoptimshiftactive)
+            tempoptimshiftactive, _tempoptimshiftactiveErr := io.ReadBit()
+            if _tempoptimshiftactiveErr != nil {
+                return nil, errors.New("Error parsing 'tempoptimshiftactive' field " + _tempoptimshiftactiveErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(tempoptimshiftactive)
+
+            // Simple Field (solarenergysupport)
+            solarenergysupport, _solarenergysupportErr := io.ReadBit()
+            if _solarenergysupportErr != nil {
+                return nil, errors.New("Error parsing 'solarenergysupport' field " + _solarenergysupportErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(solarenergysupport)
+
+            // Simple Field (solarenergyonly)
+            solarenergyonly, _solarenergyonlyErr := io.ReadBit()
+            if _solarenergyonlyErr != nil {
+                return nil, errors.New("Error parsing 'solarenergyonly' field " + _solarenergyonlyErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(VerifyModeIsOn)
+            _map["Struct"] = values.NewPlcBOOL(solarenergyonly)
 
-            // Simple Field (ADatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived)
-            ADatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived, _ADatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceivedErr := io.ReadBit()
-            if _ADatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceivedErr != nil {
-                return nil, errors.New("Error parsing 'ADatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived' field " + _ADatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceivedErr.Error())
+            // Simple Field (otherenergysourceactive)
+            otherenergysourceactive, _otherenergysourceactiveErr := io.ReadBit()
+            if _otherenergysourceactiveErr != nil {
+                return nil, errors.New("Error parsing 'otherenergysourceactive' field " + _otherenergysourceactiveErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ADatagramWithTheOwnIndividualAddressAsSourceAddressHasBeenReceived)
+            _map["Struct"] = values.NewPlcBOOL(otherenergysourceactive)
 
-            // Simple Field (TheUserApplicationIsStopped)
-            TheUserApplicationIsStopped, _TheUserApplicationIsStoppedErr := io.ReadBit()
-            if _TheUserApplicationIsStoppedErr != nil {
-                return nil, errors.New("Error parsing 'TheUserApplicationIsStopped' field " + _TheUserApplicationIsStoppedErr.Error())
+            // Simple Field (dhwpushactive)
+            dhwpushactive, _dhwpushactiveErr := io.ReadBit()
+            if _dhwpushactiveErr != nil {
+                return nil, errors.New("Error parsing 'dhwpushactive' field " + _dhwpushactiveErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(TheUserApplicationIsStopped)
+            _map["Struct"] = values.NewPlcBOOL(dhwpushactive)
+
+            // Simple Field (legioprotactive)
+            legioprotactive, _legioprotactiveErr := io.ReadBit()
+            if _legioprotactiveErr != nil {
+                return nil, errors.New("Error parsing 'legioprotactive' field " + _legioprotactiveErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(legioprotactive)
+
+            // Simple Field (dhwloadactive)
+            dhwloadactive, _dhwloadactiveErr := io.ReadBit()
+            if _dhwloadactiveErr != nil {
+                return nil, errors.New("Error parsing 'dhwloadactive' field " + _dhwloadactiveErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(dhwloadactive)
+
+            // Simple Field (fault)
+            fault, _faultErr := io.ReadBit()
+            if _faultErr != nil {
+                return nil, errors.New("Error parsing 'fault' field " + _faultErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(fault)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_ForceSign: // Struct
+        case datapointType == KnxDatapointType_DPT_StatusRHCC: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -3224,290 +4435,526 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Roomhmax)
-            Roomhmax, _RoomhmaxErr := io.ReadBit()
-            if _RoomhmaxErr != nil {
-                return nil, errors.New("Error parsing 'Roomhmax' field " + _RoomhmaxErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(1); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (overheatalarm)
+            overheatalarm, _overheatalarmErr := io.ReadBit()
+            if _overheatalarmErr != nil {
+                return nil, errors.New("Error parsing 'overheatalarm' field " + _overheatalarmErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(overheatalarm)
+
+            // Simple Field (frostalarm)
+            frostalarm, _frostalarmErr := io.ReadBit()
+            if _frostalarmErr != nil {
+                return nil, errors.New("Error parsing 'frostalarm' field " + _frostalarmErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(frostalarm)
+
+            // Simple Field (dewpointstatus)
+            dewpointstatus, _dewpointstatusErr := io.ReadBit()
+            if _dewpointstatusErr != nil {
+                return nil, errors.New("Error parsing 'dewpointstatus' field " + _dewpointstatusErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(dewpointstatus)
+
+            // Simple Field (coolingdisabled)
+            coolingdisabled, _coolingdisabledErr := io.ReadBit()
+            if _coolingdisabledErr != nil {
+                return nil, errors.New("Error parsing 'coolingdisabled' field " + _coolingdisabledErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(coolingdisabled)
+
+            // Simple Field (statusprecool)
+            statusprecool, _statusprecoolErr := io.ReadBit()
+            if _statusprecoolErr != nil {
+                return nil, errors.New("Error parsing 'statusprecool' field " + _statusprecoolErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(statusprecool)
+
+            // Simple Field (statusecoc)
+            statusecoc, _statusecocErr := io.ReadBit()
+            if _statusecocErr != nil {
+                return nil, errors.New("Error parsing 'statusecoc' field " + _statusecocErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(statusecoc)
+
+            // Simple Field (heatcoolmode)
+            heatcoolmode, _heatcoolmodeErr := io.ReadBit()
+            if _heatcoolmodeErr != nil {
+                return nil, errors.New("Error parsing 'heatcoolmode' field " + _heatcoolmodeErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(heatcoolmode)
+
+            // Simple Field (heatingdiabled)
+            heatingdiabled, _heatingdiabledErr := io.ReadBit()
+            if _heatingdiabledErr != nil {
+                return nil, errors.New("Error parsing 'heatingdiabled' field " + _heatingdiabledErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Roomhmax)
+            _map["Struct"] = values.NewPlcBOOL(heatingdiabled)
 
-            // Simple Field (Roomhconf)
-            Roomhconf, _RoomhconfErr := io.ReadBit()
-            if _RoomhconfErr != nil {
-                return nil, errors.New("Error parsing 'Roomhconf' field " + _RoomhconfErr.Error())
+            // Simple Field (statusstopoptim)
+            statusstopoptim, _statusstopoptimErr := io.ReadBit()
+            if _statusstopoptimErr != nil {
+                return nil, errors.New("Error parsing 'statusstopoptim' field " + _statusstopoptimErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Roomhconf)
+            _map["Struct"] = values.NewPlcBOOL(statusstopoptim)
 
-            // Simple Field (Dhwlegio)
-            Dhwlegio, _DhwlegioErr := io.ReadBit()
-            if _DhwlegioErr != nil {
-                return nil, errors.New("Error parsing 'Dhwlegio' field " + _DhwlegioErr.Error())
+            // Simple Field (statusstartoptim)
+            statusstartoptim, _statusstartoptimErr := io.ReadBit()
+            if _statusstartoptimErr != nil {
+                return nil, errors.New("Error parsing 'statusstartoptim' field " + _statusstartoptimErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Dhwlegio)
+            _map["Struct"] = values.NewPlcBOOL(statusstartoptim)
 
-            // Simple Field (Dhwnorm)
-            Dhwnorm, _DhwnormErr := io.ReadBit()
-            if _DhwnormErr != nil {
-                return nil, errors.New("Error parsing 'Dhwnorm' field " + _DhwnormErr.Error())
+            // Simple Field (statusmorningboosth)
+            statusmorningboosth, _statusmorningboosthErr := io.ReadBit()
+            if _statusmorningboosthErr != nil {
+                return nil, errors.New("Error parsing 'statusmorningboosth' field " + _statusmorningboosthErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Dhwnorm)
+            _map["Struct"] = values.NewPlcBOOL(statusmorningboosth)
 
-            // Simple Field (Overrun)
-            Overrun, _OverrunErr := io.ReadBit()
-            if _OverrunErr != nil {
-                return nil, errors.New("Error parsing 'Overrun' field " + _OverrunErr.Error())
+            // Simple Field (tempflowreturnlimit)
+            tempflowreturnlimit, _tempflowreturnlimitErr := io.ReadBit()
+            if _tempflowreturnlimitErr != nil {
+                return nil, errors.New("Error parsing 'tempflowreturnlimit' field " + _tempflowreturnlimitErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Overrun)
+            _map["Struct"] = values.NewPlcBOOL(tempflowreturnlimit)
 
-            // Simple Field (Oversupply)
-            Oversupply, _OversupplyErr := io.ReadBit()
-            if _OversupplyErr != nil {
-                return nil, errors.New("Error parsing 'Oversupply' field " + _OversupplyErr.Error())
+            // Simple Field (tempflowlimit)
+            tempflowlimit, _tempflowlimitErr := io.ReadBit()
+            if _tempflowlimitErr != nil {
+                return nil, errors.New("Error parsing 'tempflowlimit' field " + _tempflowlimitErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Oversupply)
+            _map["Struct"] = values.NewPlcBOOL(tempflowlimit)
 
-            // Simple Field (Protection)
-            Protection, _ProtectionErr := io.ReadBit()
-            if _ProtectionErr != nil {
-                return nil, errors.New("Error parsing 'Protection' field " + _ProtectionErr.Error())
+            // Simple Field (statusecoh)
+            statusecoh, _statusecohErr := io.ReadBit()
+            if _statusecohErr != nil {
+                return nil, errors.New("Error parsing 'statusecoh' field " + _statusecohErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Protection)
+            _map["Struct"] = values.NewPlcBOOL(statusecoh)
 
-            // Simple Field (Forcerequest)
-            Forcerequest, _ForcerequestErr := io.ReadBit()
-            if _ForcerequestErr != nil {
-                return nil, errors.New("Error parsing 'Forcerequest' field " + _ForcerequestErr.Error())
+            // Simple Field (fault)
+            fault, _faultErr := io.ReadBit()
+            if _faultErr != nil {
+                return nil, errors.New("Error parsing 'fault' field " + _faultErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Forcerequest)
+            _map["Struct"] = values.NewPlcBOOL(fault)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_ForceSignCool: // BOOL
+        case datapointType == KnxDatapointType_DPT_CombinedStatus_HVA: // Struct
+            _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(7); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (value)
-            value, _valueErr := io.ReadBit()
-            if _valueErr != nil {
-                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            // Simple Field (calibrationMode)
+            calibrationMode, _calibrationModeErr := io.ReadBit()
+            if _calibrationModeErr != nil {
+                return nil, errors.New("Error parsing 'calibrationMode' field " + _calibrationModeErr.Error())
             }
-            return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_StatusRHC: // Struct
+            _map["Struct"] = values.NewPlcBOOL(calibrationMode)
+
+            // Simple Field (lockedPosition)
+            lockedPosition, _lockedPositionErr := io.ReadBit()
+            if _lockedPositionErr != nil {
+                return nil, errors.New("Error parsing 'lockedPosition' field " + _lockedPositionErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(lockedPosition)
+
+            // Simple Field (forcedPosition)
+            forcedPosition, _forcedPositionErr := io.ReadBit()
+            if _forcedPositionErr != nil {
+                return nil, errors.New("Error parsing 'forcedPosition' field " + _forcedPositionErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(forcedPosition)
+
+            // Simple Field (manuaOperationOverridden)
+            manuaOperationOverridden, _manuaOperationOverriddenErr := io.ReadBit()
+            if _manuaOperationOverriddenErr != nil {
+                return nil, errors.New("Error parsing 'manuaOperationOverridden' field " + _manuaOperationOverriddenErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(manuaOperationOverridden)
+
+            // Simple Field (serviceMode)
+            serviceMode, _serviceModeErr := io.ReadBit()
+            if _serviceModeErr != nil {
+                return nil, errors.New("Error parsing 'serviceMode' field " + _serviceModeErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(serviceMode)
+
+            // Simple Field (valveKick)
+            valveKick, _valveKickErr := io.ReadBit()
+            if _valveKickErr != nil {
+                return nil, errors.New("Error parsing 'valveKick' field " + _valveKickErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(valveKick)
+
+            // Simple Field (overload)
+            overload, _overloadErr := io.ReadBit()
+            if _overloadErr != nil {
+                return nil, errors.New("Error parsing 'overload' field " + _overloadErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(overload)
+
+            // Simple Field (shortCircuit)
+            shortCircuit, _shortCircuitErr := io.ReadBit()
+            if _shortCircuitErr != nil {
+                return nil, errors.New("Error parsing 'shortCircuit' field " + _shortCircuitErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(shortCircuit)
+
+            // Simple Field (currentValvePosition)
+            currentValvePosition, _currentValvePositionErr := io.ReadBit()
+            if _currentValvePositionErr != nil {
+                return nil, errors.New("Error parsing 'currentValvePosition' field " + _currentValvePositionErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(currentValvePosition)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_CombinedStatus_RTC: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(7); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Summermode)
-            Summermode, _SummermodeErr := io.ReadBit()
-            if _SummermodeErr != nil {
-                return nil, errors.New("Error parsing 'Summermode' field " + _SummermodeErr.Error())
+            // Simple Field (coolingModeEnabled)
+            coolingModeEnabled, _coolingModeEnabledErr := io.ReadBit()
+            if _coolingModeEnabledErr != nil {
+                return nil, errors.New("Error parsing 'coolingModeEnabled' field " + _coolingModeEnabledErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(coolingModeEnabled)
+
+            // Simple Field (heatingModeEnabled)
+            heatingModeEnabled, _heatingModeEnabledErr := io.ReadBit()
+            if _heatingModeEnabledErr != nil {
+                return nil, errors.New("Error parsing 'heatingModeEnabled' field " + _heatingModeEnabledErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Summermode)
+            _map["Struct"] = values.NewPlcBOOL(heatingModeEnabled)
 
-            // Simple Field (Statusstopoptim)
-            Statusstopoptim, _StatusstopoptimErr := io.ReadBit()
-            if _StatusstopoptimErr != nil {
-                return nil, errors.New("Error parsing 'Statusstopoptim' field " + _StatusstopoptimErr.Error())
+            // Simple Field (additionalHeatingCoolingStage2Stage)
+            additionalHeatingCoolingStage2Stage, _additionalHeatingCoolingStage2StageErr := io.ReadBit()
+            if _additionalHeatingCoolingStage2StageErr != nil {
+                return nil, errors.New("Error parsing 'additionalHeatingCoolingStage2Stage' field " + _additionalHeatingCoolingStage2StageErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusstopoptim)
+            _map["Struct"] = values.NewPlcBOOL(additionalHeatingCoolingStage2Stage)
 
-            // Simple Field (Statusstartoptim)
-            Statusstartoptim, _StatusstartoptimErr := io.ReadBit()
-            if _StatusstartoptimErr != nil {
-                return nil, errors.New("Error parsing 'Statusstartoptim' field " + _StatusstartoptimErr.Error())
+            // Simple Field (controllerInactive)
+            controllerInactive, _controllerInactiveErr := io.ReadBit()
+            if _controllerInactiveErr != nil {
+                return nil, errors.New("Error parsing 'controllerInactive' field " + _controllerInactiveErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusstartoptim)
+            _map["Struct"] = values.NewPlcBOOL(controllerInactive)
 
-            // Simple Field (Statusmorningboost)
-            Statusmorningboost, _StatusmorningboostErr := io.ReadBit()
-            if _StatusmorningboostErr != nil {
-                return nil, errors.New("Error parsing 'Statusmorningboost' field " + _StatusmorningboostErr.Error())
+            // Simple Field (overheatAlarm)
+            overheatAlarm, _overheatAlarmErr := io.ReadBit()
+            if _overheatAlarmErr != nil {
+                return nil, errors.New("Error parsing 'overheatAlarm' field " + _overheatAlarmErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusmorningboost)
+            _map["Struct"] = values.NewPlcBOOL(overheatAlarm)
 
-            // Simple Field (Tempreturnlimit)
-            Tempreturnlimit, _TempreturnlimitErr := io.ReadBit()
-            if _TempreturnlimitErr != nil {
-                return nil, errors.New("Error parsing 'Tempreturnlimit' field " + _TempreturnlimitErr.Error())
+            // Simple Field (frostAlarm)
+            frostAlarm, _frostAlarmErr := io.ReadBit()
+            if _frostAlarmErr != nil {
+                return nil, errors.New("Error parsing 'frostAlarm' field " + _frostAlarmErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Tempreturnlimit)
+            _map["Struct"] = values.NewPlcBOOL(frostAlarm)
 
-            // Simple Field (Tempflowlimit)
-            Tempflowlimit, _TempflowlimitErr := io.ReadBit()
-            if _TempflowlimitErr != nil {
-                return nil, errors.New("Error parsing 'Tempflowlimit' field " + _TempflowlimitErr.Error())
+            // Simple Field (dewPointStatus)
+            dewPointStatus, _dewPointStatusErr := io.ReadBit()
+            if _dewPointStatusErr != nil {
+                return nil, errors.New("Error parsing 'dewPointStatus' field " + _dewPointStatusErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Tempflowlimit)
+            _map["Struct"] = values.NewPlcBOOL(dewPointStatus)
 
-            // Simple Field (Satuseco)
-            Satuseco, _SatusecoErr := io.ReadBit()
-            if _SatusecoErr != nil {
-                return nil, errors.New("Error parsing 'Satuseco' field " + _SatusecoErr.Error())
+            // Simple Field (activeMode)
+            activeMode, _activeModeErr := io.ReadBit()
+            if _activeModeErr != nil {
+                return nil, errors.New("Error parsing 'activeMode' field " + _activeModeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Satuseco)
+            _map["Struct"] = values.NewPlcBOOL(activeMode)
 
-            // Simple Field (Fault)
-            Fault, _FaultErr := io.ReadBit()
-            if _FaultErr != nil {
-                return nil, errors.New("Error parsing 'Fault' field " + _FaultErr.Error())
+            // Simple Field (generalFailureInformation)
+            generalFailureInformation, _generalFailureInformationErr := io.ReadBit()
+            if _generalFailureInformationErr != nil {
+                return nil, errors.New("Error parsing 'generalFailureInformation' field " + _generalFailureInformationErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fault)
+            _map["Struct"] = values.NewPlcBOOL(generalFailureInformation)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_StatusSDHWC: // Struct
+        case datapointType == KnxDatapointType_DPT_Media: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(5); _err != nil {
+            if _, _err := io.ReadUint16(10); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (knxIp)
+            knxIp, _knxIpErr := io.ReadBit()
+            if _knxIpErr != nil {
+                return nil, errors.New("Error parsing 'knxIp' field " + _knxIpErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(knxIp)
+
+            // Simple Field (rf)
+            rf, _rfErr := io.ReadBit()
+            if _rfErr != nil {
+                return nil, errors.New("Error parsing 'rf' field " + _rfErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(rf)
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(1); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Solarloadsufficient)
-            Solarloadsufficient, _SolarloadsufficientErr := io.ReadBit()
-            if _SolarloadsufficientErr != nil {
-                return nil, errors.New("Error parsing 'Solarloadsufficient' field " + _SolarloadsufficientErr.Error())
+            // Simple Field (pl110)
+            pl110, _pl110Err := io.ReadBit()
+            if _pl110Err != nil {
+                return nil, errors.New("Error parsing 'pl110' field " + _pl110Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Solarloadsufficient)
+            _map["Struct"] = values.NewPlcBOOL(pl110)
 
-            // Simple Field (Sdhwloadactive)
-            Sdhwloadactive, _SdhwloadactiveErr := io.ReadBit()
-            if _SdhwloadactiveErr != nil {
-                return nil, errors.New("Error parsing 'Sdhwloadactive' field " + _SdhwloadactiveErr.Error())
+            // Simple Field (tp1)
+            tp1, _tp1Err := io.ReadBit()
+            if _tp1Err != nil {
+                return nil, errors.New("Error parsing 'tp1' field " + _tp1Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Sdhwloadactive)
+            _map["Struct"] = values.NewPlcBOOL(tp1)
 
-            // Simple Field (Fault)
-            Fault, _FaultErr := io.ReadBit()
-            if _FaultErr != nil {
-                return nil, errors.New("Error parsing 'Fault' field " + _FaultErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(1); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fault)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_FuelTypeSet: // Struct
+        case datapointType == KnxDatapointType_DPT_Channel_Activation_16: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(5); _err != nil {
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Solidstate)
-            Solidstate, _SolidstateErr := io.ReadBit()
-            if _SolidstateErr != nil {
-                return nil, errors.New("Error parsing 'Solidstate' field " + _SolidstateErr.Error())
+            // Simple Field (activationStateOfChannel1)
+            activationStateOfChannel1, _activationStateOfChannel1Err := io.ReadBit()
+            if _activationStateOfChannel1Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel1' field " + _activationStateOfChannel1Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel1)
+
+            // Simple Field (activationStateOfChannel2)
+            activationStateOfChannel2, _activationStateOfChannel2Err := io.ReadBit()
+            if _activationStateOfChannel2Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel2' field " + _activationStateOfChannel2Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel2)
+
+            // Simple Field (activationStateOfChannel3)
+            activationStateOfChannel3, _activationStateOfChannel3Err := io.ReadBit()
+            if _activationStateOfChannel3Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel3' field " + _activationStateOfChannel3Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel3)
+
+            // Simple Field (activationStateOfChannel4)
+            activationStateOfChannel4, _activationStateOfChannel4Err := io.ReadBit()
+            if _activationStateOfChannel4Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel4' field " + _activationStateOfChannel4Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel4)
+
+            // Simple Field (activationStateOfChannel5)
+            activationStateOfChannel5, _activationStateOfChannel5Err := io.ReadBit()
+            if _activationStateOfChannel5Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel5' field " + _activationStateOfChannel5Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel5)
+
+            // Simple Field (activationStateOfChannel6)
+            activationStateOfChannel6, _activationStateOfChannel6Err := io.ReadBit()
+            if _activationStateOfChannel6Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel6' field " + _activationStateOfChannel6Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel6)
+
+            // Simple Field (activationStateOfChannel7)
+            activationStateOfChannel7, _activationStateOfChannel7Err := io.ReadBit()
+            if _activationStateOfChannel7Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel7' field " + _activationStateOfChannel7Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Solidstate)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel7)
 
-            // Simple Field (Gas)
-            Gas, _GasErr := io.ReadBit()
-            if _GasErr != nil {
-                return nil, errors.New("Error parsing 'Gas' field " + _GasErr.Error())
+            // Simple Field (activationStateOfChannel8)
+            activationStateOfChannel8, _activationStateOfChannel8Err := io.ReadBit()
+            if _activationStateOfChannel8Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel8' field " + _activationStateOfChannel8Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Gas)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel8)
 
-            // Simple Field (Oil)
-            Oil, _OilErr := io.ReadBit()
-            if _OilErr != nil {
-                return nil, errors.New("Error parsing 'Oil' field " + _OilErr.Error())
+            // Simple Field (activationStateOfChannel9)
+            activationStateOfChannel9, _activationStateOfChannel9Err := io.ReadBit()
+            if _activationStateOfChannel9Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel9' field " + _activationStateOfChannel9Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Oil)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel9)
+
+            // Simple Field (activationStateOfChannel10)
+            activationStateOfChannel10, _activationStateOfChannel10Err := io.ReadBit()
+            if _activationStateOfChannel10Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel10' field " + _activationStateOfChannel10Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel10)
+
+            // Simple Field (activationStateOfChannel11)
+            activationStateOfChannel11, _activationStateOfChannel11Err := io.ReadBit()
+            if _activationStateOfChannel11Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel11' field " + _activationStateOfChannel11Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel11)
+
+            // Simple Field (activationStateOfChannel12)
+            activationStateOfChannel12, _activationStateOfChannel12Err := io.ReadBit()
+            if _activationStateOfChannel12Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel12' field " + _activationStateOfChannel12Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel12)
+
+            // Simple Field (activationStateOfChannel13)
+            activationStateOfChannel13, _activationStateOfChannel13Err := io.ReadBit()
+            if _activationStateOfChannel13Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel13' field " + _activationStateOfChannel13Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel13)
+
+            // Simple Field (activationStateOfChannel14)
+            activationStateOfChannel14, _activationStateOfChannel14Err := io.ReadBit()
+            if _activationStateOfChannel14Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel14' field " + _activationStateOfChannel14Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel14)
+
+            // Simple Field (activationStateOfChannel15)
+            activationStateOfChannel15, _activationStateOfChannel15Err := io.ReadBit()
+            if _activationStateOfChannel15Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel15' field " + _activationStateOfChannel15Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel15)
+
+            // Simple Field (activationStateOfChannel16)
+            activationStateOfChannel16, _activationStateOfChannel16Err := io.ReadBit()
+            if _activationStateOfChannel16Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel16' field " + _activationStateOfChannel16Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel16)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_StatusRCC: // BOOL
+        case datapointType == KnxDatapointType_DPT_OnOffAction: // USINT
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(7); _err != nil {
+            if _, _err := io.ReadUint8(6); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
             // Simple Field (value)
-            value, _valueErr := io.ReadBit()
+            value, _valueErr := io.ReadUint8(2)
             if _valueErr != nil {
                 return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
-            return values.NewPlcBOOL(value), nil
-        case datapointType == KnxDatapointType.DPT_StatusAHU: // Struct
-            _map := map[string]api.PlcValue{}
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Alarm_Reaction: // USINT
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(4); _err != nil {
+            if _, _err := io.ReadUint8(6); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Cool)
-            Cool, _CoolErr := io.ReadBit()
-            if _CoolErr != nil {
-                return nil, errors.New("Error parsing 'Cool' field " + _CoolErr.Error())
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(2)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_UpDown_Action: // USINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(6); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Cool)
 
-            // Simple Field (Heat)
-            Heat, _HeatErr := io.ReadBit()
-            if _HeatErr != nil {
-                return nil, errors.New("Error parsing 'Heat' field " + _HeatErr.Error())
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(2)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Heat)
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_HVAC_PB_Action: // USINT
 
-            // Simple Field (Fanactive)
-            Fanactive, _FanactiveErr := io.ReadBit()
-            if _FanactiveErr != nil {
-                return nil, errors.New("Error parsing 'Fanactive' field " + _FanactiveErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(6); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fanactive)
 
-            // Simple Field (Fault)
-            Fault, _FaultErr := io.ReadBit()
-            if _FaultErr != nil {
-                return nil, errors.New("Error parsing 'Fault' field " + _FaultErr.Error())
+            // Simple Field (value)
+            value, _valueErr := io.ReadUint8(2)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fault)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_CombinedStatus_RTSM: // Struct
+            return values.NewPlcUSINT(value), nil
+        case datapointType == KnxDatapointType_DPT_DoubleNibble: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(3); _err != nil {
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (StatusOfHvacModeUser)
-            StatusOfHvacModeUser, _StatusOfHvacModeUserErr := io.ReadBit()
-            if _StatusOfHvacModeUserErr != nil {
-                return nil, errors.New("Error parsing 'StatusOfHvacModeUser' field " + _StatusOfHvacModeUserErr.Error())
+            // Simple Field (busy)
+            busy, _busyErr := io.ReadUint8(4)
+            if _busyErr != nil {
+                return nil, errors.New("Error parsing 'busy' field " + _busyErr.Error())
+            }
+            _map["Struct"] = values.NewPlcUSINT(busy)
+
+            // Simple Field (nak)
+            nak, _nakErr := io.ReadUint8(4)
+            if _nakErr != nil {
+                return nil, errors.New("Error parsing 'nak' field " + _nakErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StatusOfHvacModeUser)
+            _map["Struct"] = values.NewPlcUSINT(nak)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_SceneInfo: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (StatusOfComfortProlongationUser)
-            StatusOfComfortProlongationUser, _StatusOfComfortProlongationUserErr := io.ReadBit()
-            if _StatusOfComfortProlongationUserErr != nil {
-                return nil, errors.New("Error parsing 'StatusOfComfortProlongationUser' field " + _StatusOfComfortProlongationUserErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(StatusOfComfortProlongationUser)
 
-            // Simple Field (EffectiveValueOfTheComfortPushButton)
-            EffectiveValueOfTheComfortPushButton, _EffectiveValueOfTheComfortPushButtonErr := io.ReadBit()
-            if _EffectiveValueOfTheComfortPushButtonErr != nil {
-                return nil, errors.New("Error parsing 'EffectiveValueOfTheComfortPushButton' field " + _EffectiveValueOfTheComfortPushButtonErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(1); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(EffectiveValueOfTheComfortPushButton)
 
-            // Simple Field (EffectiveValueOfThePresenceStatus)
-            EffectiveValueOfThePresenceStatus, _EffectiveValueOfThePresenceStatusErr := io.ReadBit()
-            if _EffectiveValueOfThePresenceStatusErr != nil {
-                return nil, errors.New("Error parsing 'EffectiveValueOfThePresenceStatus' field " + _EffectiveValueOfThePresenceStatusErr.Error())
+            // Simple Field (sceneIsInactive)
+            sceneIsInactive, _sceneIsInactiveErr := io.ReadBit()
+            if _sceneIsInactiveErr != nil {
+                return nil, errors.New("Error parsing 'sceneIsInactive' field " + _sceneIsInactiveErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(EffectiveValueOfThePresenceStatus)
+            _map["Struct"] = values.NewPlcBOOL(sceneIsInactive)
 
-            // Simple Field (EffectiveValueOfTheWindowStatus)
-            EffectiveValueOfTheWindowStatus, _EffectiveValueOfTheWindowStatusErr := io.ReadBit()
-            if _EffectiveValueOfTheWindowStatusErr != nil {
-                return nil, errors.New("Error parsing 'EffectiveValueOfTheWindowStatus' field " + _EffectiveValueOfTheWindowStatusErr.Error())
+            // Simple Field (scenenumber)
+            scenenumber, _scenenumberErr := io.ReadUint8(6)
+            if _scenenumberErr != nil {
+                return nil, errors.New("Error parsing 'scenenumber' field " + _scenenumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(EffectiveValueOfTheWindowStatus)
+            _map["Struct"] = values.NewPlcUSINT(scenenumber)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_LightActuatorErrorInfo: // Struct
+        case datapointType == KnxDatapointType_DPT_CombinedInfoOnOff: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -3515,247 +4962,446 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(1); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (maskBitInfoOnOffOutput16)
+            maskBitInfoOnOffOutput16, _maskBitInfoOnOffOutput16Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput16Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput16' field " + _maskBitInfoOnOffOutput16Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput16)
+
+            // Simple Field (maskBitInfoOnOffOutput15)
+            maskBitInfoOnOffOutput15, _maskBitInfoOnOffOutput15Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput15Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput15' field " + _maskBitInfoOnOffOutput15Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput15)
+
+            // Simple Field (maskBitInfoOnOffOutput14)
+            maskBitInfoOnOffOutput14, _maskBitInfoOnOffOutput14Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput14Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput14' field " + _maskBitInfoOnOffOutput14Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput14)
+
+            // Simple Field (maskBitInfoOnOffOutput13)
+            maskBitInfoOnOffOutput13, _maskBitInfoOnOffOutput13Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput13Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput13' field " + _maskBitInfoOnOffOutput13Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput13)
+
+            // Simple Field (maskBitInfoOnOffOutput12)
+            maskBitInfoOnOffOutput12, _maskBitInfoOnOffOutput12Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput12Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput12' field " + _maskBitInfoOnOffOutput12Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput12)
+
+            // Simple Field (maskBitInfoOnOffOutput11)
+            maskBitInfoOnOffOutput11, _maskBitInfoOnOffOutput11Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput11Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput11' field " + _maskBitInfoOnOffOutput11Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput11)
+
+            // Simple Field (maskBitInfoOnOffOutput10)
+            maskBitInfoOnOffOutput10, _maskBitInfoOnOffOutput10Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput10Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput10' field " + _maskBitInfoOnOffOutput10Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput10)
+
+            // Simple Field (maskBitInfoOnOffOutput9)
+            maskBitInfoOnOffOutput9, _maskBitInfoOnOffOutput9Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput9Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput9' field " + _maskBitInfoOnOffOutput9Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput9)
+
+            // Simple Field (maskBitInfoOnOffOutput8)
+            maskBitInfoOnOffOutput8, _maskBitInfoOnOffOutput8Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput8Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput8' field " + _maskBitInfoOnOffOutput8Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput8)
+
+            // Simple Field (maskBitInfoOnOffOutput7)
+            maskBitInfoOnOffOutput7, _maskBitInfoOnOffOutput7Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput7Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput7' field " + _maskBitInfoOnOffOutput7Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput7)
+
+            // Simple Field (maskBitInfoOnOffOutput6)
+            maskBitInfoOnOffOutput6, _maskBitInfoOnOffOutput6Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput6Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput6' field " + _maskBitInfoOnOffOutput6Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput6)
+
+            // Simple Field (maskBitInfoOnOffOutput5)
+            maskBitInfoOnOffOutput5, _maskBitInfoOnOffOutput5Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput5Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput5' field " + _maskBitInfoOnOffOutput5Err.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput5)
 
-            // Simple Field (Overheat)
-            Overheat, _OverheatErr := io.ReadBit()
-            if _OverheatErr != nil {
-                return nil, errors.New("Error parsing 'Overheat' field " + _OverheatErr.Error())
+            // Simple Field (maskBitInfoOnOffOutput4)
+            maskBitInfoOnOffOutput4, _maskBitInfoOnOffOutput4Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput4Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput4' field " + _maskBitInfoOnOffOutput4Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Overheat)
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput4)
 
-            // Simple Field (Lampfailure)
-            Lampfailure, _LampfailureErr := io.ReadBit()
-            if _LampfailureErr != nil {
-                return nil, errors.New("Error parsing 'Lampfailure' field " + _LampfailureErr.Error())
+            // Simple Field (maskBitInfoOnOffOutput3)
+            maskBitInfoOnOffOutput3, _maskBitInfoOnOffOutput3Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput3Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput3' field " + _maskBitInfoOnOffOutput3Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Lampfailure)
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput3)
 
-            // Simple Field (Defectiveload)
-            Defectiveload, _DefectiveloadErr := io.ReadBit()
-            if _DefectiveloadErr != nil {
-                return nil, errors.New("Error parsing 'Defectiveload' field " + _DefectiveloadErr.Error())
+            // Simple Field (maskBitInfoOnOffOutput2)
+            maskBitInfoOnOffOutput2, _maskBitInfoOnOffOutput2Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput2Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput2' field " + _maskBitInfoOnOffOutput2Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Defectiveload)
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput2)
 
-            // Simple Field (Underload)
-            Underload, _UnderloadErr := io.ReadBit()
-            if _UnderloadErr != nil {
-                return nil, errors.New("Error parsing 'Underload' field " + _UnderloadErr.Error())
+            // Simple Field (maskBitInfoOnOffOutput1)
+            maskBitInfoOnOffOutput1, _maskBitInfoOnOffOutput1Err := io.ReadBit()
+            if _maskBitInfoOnOffOutput1Err != nil {
+                return nil, errors.New("Error parsing 'maskBitInfoOnOffOutput1' field " + _maskBitInfoOnOffOutput1Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Underload)
+            _map["Struct"] = values.NewPlcBOOL(maskBitInfoOnOffOutput1)
 
-            // Simple Field (Overcurrent)
-            Overcurrent, _OvercurrentErr := io.ReadBit()
-            if _OvercurrentErr != nil {
-                return nil, errors.New("Error parsing 'Overcurrent' field " + _OvercurrentErr.Error())
+            // Simple Field (infoOnOffOutput16)
+            infoOnOffOutput16, _infoOnOffOutput16Err := io.ReadBit()
+            if _infoOnOffOutput16Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput16' field " + _infoOnOffOutput16Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Overcurrent)
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput16)
 
-            // Simple Field (Undervoltage)
-            Undervoltage, _UndervoltageErr := io.ReadBit()
-            if _UndervoltageErr != nil {
-                return nil, errors.New("Error parsing 'Undervoltage' field " + _UndervoltageErr.Error())
+            // Simple Field (infoOnOffOutput15)
+            infoOnOffOutput15, _infoOnOffOutput15Err := io.ReadBit()
+            if _infoOnOffOutput15Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput15' field " + _infoOnOffOutput15Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Undervoltage)
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput15)
 
-            // Simple Field (Loaddetectionerror)
-            Loaddetectionerror, _LoaddetectionerrorErr := io.ReadBit()
-            if _LoaddetectionerrorErr != nil {
-                return nil, errors.New("Error parsing 'Loaddetectionerror' field " + _LoaddetectionerrorErr.Error())
+            // Simple Field (infoOnOffOutput14)
+            infoOnOffOutput14, _infoOnOffOutput14Err := io.ReadBit()
+            if _infoOnOffOutput14Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput14' field " + _infoOnOffOutput14Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Loaddetectionerror)
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput14)
+
+            // Simple Field (infoOnOffOutput13)
+            infoOnOffOutput13, _infoOnOffOutput13Err := io.ReadBit()
+            if _infoOnOffOutput13Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput13' field " + _infoOnOffOutput13Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput13)
+
+            // Simple Field (infoOnOffOutput12)
+            infoOnOffOutput12, _infoOnOffOutput12Err := io.ReadBit()
+            if _infoOnOffOutput12Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput12' field " + _infoOnOffOutput12Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput12)
+
+            // Simple Field (infoOnOffOutput11)
+            infoOnOffOutput11, _infoOnOffOutput11Err := io.ReadBit()
+            if _infoOnOffOutput11Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput11' field " + _infoOnOffOutput11Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput11)
+
+            // Simple Field (infoOnOffOutput10)
+            infoOnOffOutput10, _infoOnOffOutput10Err := io.ReadBit()
+            if _infoOnOffOutput10Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput10' field " + _infoOnOffOutput10Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput10)
+
+            // Simple Field (infoOnOffOutput9)
+            infoOnOffOutput9, _infoOnOffOutput9Err := io.ReadBit()
+            if _infoOnOffOutput9Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput9' field " + _infoOnOffOutput9Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput9)
+
+            // Simple Field (infoOnOffOutput8)
+            infoOnOffOutput8, _infoOnOffOutput8Err := io.ReadBit()
+            if _infoOnOffOutput8Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput8' field " + _infoOnOffOutput8Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput8)
+
+            // Simple Field (infoOnOffOutput7)
+            infoOnOffOutput7, _infoOnOffOutput7Err := io.ReadBit()
+            if _infoOnOffOutput7Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput7' field " + _infoOnOffOutput7Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput7)
+
+            // Simple Field (infoOnOffOutput6)
+            infoOnOffOutput6, _infoOnOffOutput6Err := io.ReadBit()
+            if _infoOnOffOutput6Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput6' field " + _infoOnOffOutput6Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput6)
+
+            // Simple Field (infoOnOffOutput5)
+            infoOnOffOutput5, _infoOnOffOutput5Err := io.ReadBit()
+            if _infoOnOffOutput5Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput5' field " + _infoOnOffOutput5Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput5)
+
+            // Simple Field (infoOnOffOutput4)
+            infoOnOffOutput4, _infoOnOffOutput4Err := io.ReadBit()
+            if _infoOnOffOutput4Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput4' field " + _infoOnOffOutput4Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput4)
+
+            // Simple Field (infoOnOffOutput3)
+            infoOnOffOutput3, _infoOnOffOutput3Err := io.ReadBit()
+            if _infoOnOffOutput3Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput3' field " + _infoOnOffOutput3Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput3)
+
+            // Simple Field (infoOnOffOutput2)
+            infoOnOffOutput2, _infoOnOffOutput2Err := io.ReadBit()
+            if _infoOnOffOutput2Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput2' field " + _infoOnOffOutput2Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput2)
+
+            // Simple Field (infoOnOffOutput1)
+            infoOnOffOutput1, _infoOnOffOutput1Err := io.ReadBit()
+            if _infoOnOffOutput1Err != nil {
+                return nil, errors.New("Error parsing 'infoOnOffOutput1' field " + _infoOnOffOutput1Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(infoOnOffOutput1)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_RF_ModeInfo: // Struct
-            _map := map[string]api.PlcValue{}
+        case datapointType == KnxDatapointType_DPT_ActiveEnergy_V64: // LINT
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(5); _err != nil {
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadInt64(64)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcLINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ApparantEnergy_V64: // LINT
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (BibatSlave)
-            BibatSlave, _BibatSlaveErr := io.ReadBit()
-            if _BibatSlaveErr != nil {
-                return nil, errors.New("Error parsing 'BibatSlave' field " + _BibatSlaveErr.Error())
+            // Simple Field (value)
+            value, _valueErr := io.ReadInt64(64)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(BibatSlave)
+            return values.NewPlcLINT(value), nil
+        case datapointType == KnxDatapointType_DPT_ReactiveEnergy_V64: // LINT
 
-            // Simple Field (BibatMaster)
-            BibatMaster, _BibatMasterErr := io.ReadBit()
-            if _BibatMasterErr != nil {
-                return nil, errors.New("Error parsing 'BibatMaster' field " + _BibatMasterErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(BibatMaster)
 
-            // Simple Field (Asynchronous)
-            Asynchronous, _AsynchronousErr := io.ReadBit()
-            if _AsynchronousErr != nil {
-                return nil, errors.New("Error parsing 'Asynchronous' field " + _AsynchronousErr.Error())
+            // Simple Field (value)
+            value, _valueErr := io.ReadInt64(64)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Asynchronous)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_RF_FilterInfo: // Struct
+            return values.NewPlcLINT(value), nil
+        case datapointType == KnxDatapointType_DPT_Channel_Activation_24: // Struct
             _map := map[string]api.PlcValue{}
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(5); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (activationStateOfChannel1)
+            activationStateOfChannel1, _activationStateOfChannel1Err := io.ReadBit()
+            if _activationStateOfChannel1Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel1' field " + _activationStateOfChannel1Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel1)
+
+            // Simple Field (activationStateOfChannel2)
+            activationStateOfChannel2, _activationStateOfChannel2Err := io.ReadBit()
+            if _activationStateOfChannel2Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel2' field " + _activationStateOfChannel2Err.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel2)
+
+            // Simple Field (activationStateOfChannel3)
+            activationStateOfChannel3, _activationStateOfChannel3Err := io.ReadBit()
+            if _activationStateOfChannel3Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel3' field " + _activationStateOfChannel3Err.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel3)
 
-            // Simple Field (Doa)
-            Doa, _DoaErr := io.ReadBit()
-            if _DoaErr != nil {
-                return nil, errors.New("Error parsing 'Doa' field " + _DoaErr.Error())
+            // Simple Field (activationStateOfChannel4)
+            activationStateOfChannel4, _activationStateOfChannel4Err := io.ReadBit()
+            if _activationStateOfChannel4Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel4' field " + _activationStateOfChannel4Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Doa)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel4)
 
-            // Simple Field (KnxSn)
-            KnxSn, _KnxSnErr := io.ReadBit()
-            if _KnxSnErr != nil {
-                return nil, errors.New("Error parsing 'KnxSn' field " + _KnxSnErr.Error())
+            // Simple Field (activationStateOfChannel5)
+            activationStateOfChannel5, _activationStateOfChannel5Err := io.ReadBit()
+            if _activationStateOfChannel5Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel5' field " + _activationStateOfChannel5Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(KnxSn)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel5)
 
-            // Simple Field (DoaAndKnxSn)
-            DoaAndKnxSn, _DoaAndKnxSnErr := io.ReadBit()
-            if _DoaAndKnxSnErr != nil {
-                return nil, errors.New("Error parsing 'DoaAndKnxSn' field " + _DoaAndKnxSnErr.Error())
+            // Simple Field (activationStateOfChannel6)
+            activationStateOfChannel6, _activationStateOfChannel6Err := io.ReadBit()
+            if _activationStateOfChannel6Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel6' field " + _activationStateOfChannel6Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(DoaAndKnxSn)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Channel_Activation_8: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel6)
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (activationStateOfChannel7)
+            activationStateOfChannel7, _activationStateOfChannel7Err := io.ReadBit()
+            if _activationStateOfChannel7Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel7' field " + _activationStateOfChannel7Err.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel7)
 
-            // Simple Field (ActivationStateOfChannel1)
-            ActivationStateOfChannel1, _ActivationStateOfChannel1Err := io.ReadBit()
-            if _ActivationStateOfChannel1Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel1' field " + _ActivationStateOfChannel1Err.Error())
+            // Simple Field (activationStateOfChannel8)
+            activationStateOfChannel8, _activationStateOfChannel8Err := io.ReadBit()
+            if _activationStateOfChannel8Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel8' field " + _activationStateOfChannel8Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel1)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel8)
 
-            // Simple Field (ActivationStateOfChannel2)
-            ActivationStateOfChannel2, _ActivationStateOfChannel2Err := io.ReadBit()
-            if _ActivationStateOfChannel2Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel2' field " + _ActivationStateOfChannel2Err.Error())
+            // Simple Field (activationStateOfChannel9)
+            activationStateOfChannel9, _activationStateOfChannel9Err := io.ReadBit()
+            if _activationStateOfChannel9Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel9' field " + _activationStateOfChannel9Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel2)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel9)
 
-            // Simple Field (ActivationStateOfChannel3)
-            ActivationStateOfChannel3, _ActivationStateOfChannel3Err := io.ReadBit()
-            if _ActivationStateOfChannel3Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel3' field " + _ActivationStateOfChannel3Err.Error())
+            // Simple Field (activationStateOfChannel10)
+            activationStateOfChannel10, _activationStateOfChannel10Err := io.ReadBit()
+            if _activationStateOfChannel10Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel10' field " + _activationStateOfChannel10Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel3)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel10)
 
-            // Simple Field (ActivationStateOfChannel4)
-            ActivationStateOfChannel4, _ActivationStateOfChannel4Err := io.ReadBit()
-            if _ActivationStateOfChannel4Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel4' field " + _ActivationStateOfChannel4Err.Error())
+            // Simple Field (activationStateOfChannel11)
+            activationStateOfChannel11, _activationStateOfChannel11Err := io.ReadBit()
+            if _activationStateOfChannel11Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel11' field " + _activationStateOfChannel11Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel4)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel11)
 
-            // Simple Field (ActivationStateOfChannel5)
-            ActivationStateOfChannel5, _ActivationStateOfChannel5Err := io.ReadBit()
-            if _ActivationStateOfChannel5Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel5' field " + _ActivationStateOfChannel5Err.Error())
+            // Simple Field (activationStateOfChannel12)
+            activationStateOfChannel12, _activationStateOfChannel12Err := io.ReadBit()
+            if _activationStateOfChannel12Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel12' field " + _activationStateOfChannel12Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel5)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel12)
 
-            // Simple Field (ActivationStateOfChannel6)
-            ActivationStateOfChannel6, _ActivationStateOfChannel6Err := io.ReadBit()
-            if _ActivationStateOfChannel6Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel6' field " + _ActivationStateOfChannel6Err.Error())
+            // Simple Field (activationStateOfChannel13)
+            activationStateOfChannel13, _activationStateOfChannel13Err := io.ReadBit()
+            if _activationStateOfChannel13Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel13' field " + _activationStateOfChannel13Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel6)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel13)
 
-            // Simple Field (ActivationStateOfChannel7)
-            ActivationStateOfChannel7, _ActivationStateOfChannel7Err := io.ReadBit()
-            if _ActivationStateOfChannel7Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel7' field " + _ActivationStateOfChannel7Err.Error())
+            // Simple Field (activationStateOfChannel14)
+            activationStateOfChannel14, _activationStateOfChannel14Err := io.ReadBit()
+            if _activationStateOfChannel14Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel14' field " + _activationStateOfChannel14Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel7)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel14)
 
-            // Simple Field (ActivationStateOfChannel8)
-            ActivationStateOfChannel8, _ActivationStateOfChannel8Err := io.ReadBit()
-            if _ActivationStateOfChannel8Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel8' field " + _ActivationStateOfChannel8Err.Error())
+            // Simple Field (activationStateOfChannel15)
+            activationStateOfChannel15, _activationStateOfChannel15Err := io.ReadBit()
+            if _activationStateOfChannel15Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel15' field " + _activationStateOfChannel15Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel8)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_StatusDHWC: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel15)
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (activationStateOfChannel16)
+            activationStateOfChannel16, _activationStateOfChannel16Err := io.ReadBit()
+            if _activationStateOfChannel16Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel16' field " + _activationStateOfChannel16Err.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel16)
 
-            // Simple Field (Tempoptimshiftactive)
-            Tempoptimshiftactive, _TempoptimshiftactiveErr := io.ReadBit()
-            if _TempoptimshiftactiveErr != nil {
-                return nil, errors.New("Error parsing 'Tempoptimshiftactive' field " + _TempoptimshiftactiveErr.Error())
+            // Simple Field (activationStateOfChannel17)
+            activationStateOfChannel17, _activationStateOfChannel17Err := io.ReadBit()
+            if _activationStateOfChannel17Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel17' field " + _activationStateOfChannel17Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Tempoptimshiftactive)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel17)
 
-            // Simple Field (Solarenergysupport)
-            Solarenergysupport, _SolarenergysupportErr := io.ReadBit()
-            if _SolarenergysupportErr != nil {
-                return nil, errors.New("Error parsing 'Solarenergysupport' field " + _SolarenergysupportErr.Error())
+            // Simple Field (activationStateOfChannel18)
+            activationStateOfChannel18, _activationStateOfChannel18Err := io.ReadBit()
+            if _activationStateOfChannel18Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel18' field " + _activationStateOfChannel18Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Solarenergysupport)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel18)
 
-            // Simple Field (Solarenergyonly)
-            Solarenergyonly, _SolarenergyonlyErr := io.ReadBit()
-            if _SolarenergyonlyErr != nil {
-                return nil, errors.New("Error parsing 'Solarenergyonly' field " + _SolarenergyonlyErr.Error())
+            // Simple Field (activationStateOfChannel19)
+            activationStateOfChannel19, _activationStateOfChannel19Err := io.ReadBit()
+            if _activationStateOfChannel19Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel19' field " + _activationStateOfChannel19Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Solarenergyonly)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel19)
 
-            // Simple Field (Otherenergysourceactive)
-            Otherenergysourceactive, _OtherenergysourceactiveErr := io.ReadBit()
-            if _OtherenergysourceactiveErr != nil {
-                return nil, errors.New("Error parsing 'Otherenergysourceactive' field " + _OtherenergysourceactiveErr.Error())
+            // Simple Field (activationStateOfChannel20)
+            activationStateOfChannel20, _activationStateOfChannel20Err := io.ReadBit()
+            if _activationStateOfChannel20Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel20' field " + _activationStateOfChannel20Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Otherenergysourceactive)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel20)
 
-            // Simple Field (Dhwpushactive)
-            Dhwpushactive, _DhwpushactiveErr := io.ReadBit()
-            if _DhwpushactiveErr != nil {
-                return nil, errors.New("Error parsing 'Dhwpushactive' field " + _DhwpushactiveErr.Error())
+            // Simple Field (activationStateOfChannel21)
+            activationStateOfChannel21, _activationStateOfChannel21Err := io.ReadBit()
+            if _activationStateOfChannel21Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel21' field " + _activationStateOfChannel21Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Dhwpushactive)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel21)
 
-            // Simple Field (Legioprotactive)
-            Legioprotactive, _LegioprotactiveErr := io.ReadBit()
-            if _LegioprotactiveErr != nil {
-                return nil, errors.New("Error parsing 'Legioprotactive' field " + _LegioprotactiveErr.Error())
+            // Simple Field (activationStateOfChannel22)
+            activationStateOfChannel22, _activationStateOfChannel22Err := io.ReadBit()
+            if _activationStateOfChannel22Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel22' field " + _activationStateOfChannel22Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Legioprotactive)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel22)
 
-            // Simple Field (Dhwloadactive)
-            Dhwloadactive, _DhwloadactiveErr := io.ReadBit()
-            if _DhwloadactiveErr != nil {
-                return nil, errors.New("Error parsing 'Dhwloadactive' field " + _DhwloadactiveErr.Error())
+            // Simple Field (activationStateOfChannel23)
+            activationStateOfChannel23, _activationStateOfChannel23Err := io.ReadBit()
+            if _activationStateOfChannel23Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel23' field " + _activationStateOfChannel23Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Dhwloadactive)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel23)
 
-            // Simple Field (Fault)
-            Fault, _FaultErr := io.ReadBit()
-            if _FaultErr != nil {
-                return nil, errors.New("Error parsing 'Fault' field " + _FaultErr.Error())
+            // Simple Field (activationStateOfChannel24)
+            activationStateOfChannel24, _activationStateOfChannel24Err := io.ReadBit()
+            if _activationStateOfChannel24Err != nil {
+                return nil, errors.New("Error parsing 'activationStateOfChannel24' field " + _activationStateOfChannel24Err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fault)
+            _map["Struct"] = values.NewPlcBOOL(activationStateOfChannel24)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_StatusRHCC: // Struct
+        case datapointType == KnxDatapointType_DPT_HVACModeNext: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -3763,305 +5409,291 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(1); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
-            }
-
-            // Simple Field (Overheatalarm)
-            Overheatalarm, _OverheatalarmErr := io.ReadBit()
-            if _OverheatalarmErr != nil {
-                return nil, errors.New("Error parsing 'Overheatalarm' field " + _OverheatalarmErr.Error())
+            // Simple Field (delayTimeMin)
+            delayTimeMin, _delayTimeMinErr := io.ReadUint16(16)
+            if _delayTimeMinErr != nil {
+                return nil, errors.New("Error parsing 'delayTimeMin' field " + _delayTimeMinErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Overheatalarm)
+            _map["Struct"] = values.NewPlcUINT(delayTimeMin)
 
-            // Simple Field (Frostalarm)
-            Frostalarm, _FrostalarmErr := io.ReadBit()
-            if _FrostalarmErr != nil {
-                return nil, errors.New("Error parsing 'Frostalarm' field " + _FrostalarmErr.Error())
+            // Simple Field (hvacMode)
+            hvacMode, _hvacModeErr := io.ReadUint8(8)
+            if _hvacModeErr != nil {
+                return nil, errors.New("Error parsing 'hvacMode' field " + _hvacModeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Frostalarm)
+            _map["Struct"] = values.NewPlcUSINT(hvacMode)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_DHWModeNext: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (Dewpointstatus)
-            Dewpointstatus, _DewpointstatusErr := io.ReadBit()
-            if _DewpointstatusErr != nil {
-                return nil, errors.New("Error parsing 'Dewpointstatus' field " + _DewpointstatusErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Dewpointstatus)
 
-            // Simple Field (Coolingdisabled)
-            Coolingdisabled, _CoolingdisabledErr := io.ReadBit()
-            if _CoolingdisabledErr != nil {
-                return nil, errors.New("Error parsing 'Coolingdisabled' field " + _CoolingdisabledErr.Error())
+            // Simple Field (delayTimeMin)
+            delayTimeMin, _delayTimeMinErr := io.ReadUint16(16)
+            if _delayTimeMinErr != nil {
+                return nil, errors.New("Error parsing 'delayTimeMin' field " + _delayTimeMinErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Coolingdisabled)
+            _map["Struct"] = values.NewPlcUINT(delayTimeMin)
 
-            // Simple Field (Statusprecool)
-            Statusprecool, _StatusprecoolErr := io.ReadBit()
-            if _StatusprecoolErr != nil {
-                return nil, errors.New("Error parsing 'Statusprecool' field " + _StatusprecoolErr.Error())
+            // Simple Field (dhwMode)
+            dhwMode, _dhwModeErr := io.ReadUint8(8)
+            if _dhwModeErr != nil {
+                return nil, errors.New("Error parsing 'dhwMode' field " + _dhwModeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusprecool)
+            _map["Struct"] = values.NewPlcUSINT(dhwMode)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_OccModeNext: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (Statusecoc)
-            Statusecoc, _StatusecocErr := io.ReadBit()
-            if _StatusecocErr != nil {
-                return nil, errors.New("Error parsing 'Statusecoc' field " + _StatusecocErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusecoc)
 
-            // Simple Field (Heatcoolmode)
-            Heatcoolmode, _HeatcoolmodeErr := io.ReadBit()
-            if _HeatcoolmodeErr != nil {
-                return nil, errors.New("Error parsing 'Heatcoolmode' field " + _HeatcoolmodeErr.Error())
+            // Simple Field (delayTimeMin)
+            delayTimeMin, _delayTimeMinErr := io.ReadUint16(16)
+            if _delayTimeMinErr != nil {
+                return nil, errors.New("Error parsing 'delayTimeMin' field " + _delayTimeMinErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Heatcoolmode)
+            _map["Struct"] = values.NewPlcUINT(delayTimeMin)
 
-            // Simple Field (Heatingdiabled)
-            Heatingdiabled, _HeatingdiabledErr := io.ReadBit()
-            if _HeatingdiabledErr != nil {
-                return nil, errors.New("Error parsing 'Heatingdiabled' field " + _HeatingdiabledErr.Error())
+            // Simple Field (occupancyMode)
+            occupancyMode, _occupancyModeErr := io.ReadUint8(8)
+            if _occupancyModeErr != nil {
+                return nil, errors.New("Error parsing 'occupancyMode' field " + _occupancyModeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Heatingdiabled)
+            _map["Struct"] = values.NewPlcUSINT(occupancyMode)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_BuildingModeNext: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (Statusstopoptim)
-            Statusstopoptim, _StatusstopoptimErr := io.ReadBit()
-            if _StatusstopoptimErr != nil {
-                return nil, errors.New("Error parsing 'Statusstopoptim' field " + _StatusstopoptimErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusstopoptim)
 
-            // Simple Field (Statusstartoptim)
-            Statusstartoptim, _StatusstartoptimErr := io.ReadBit()
-            if _StatusstartoptimErr != nil {
-                return nil, errors.New("Error parsing 'Statusstartoptim' field " + _StatusstartoptimErr.Error())
+            // Simple Field (delayTimeMin)
+            delayTimeMin, _delayTimeMinErr := io.ReadUint16(16)
+            if _delayTimeMinErr != nil {
+                return nil, errors.New("Error parsing 'delayTimeMin' field " + _delayTimeMinErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusstartoptim)
+            _map["Struct"] = values.NewPlcUINT(delayTimeMin)
 
-            // Simple Field (Statusmorningboosth)
-            Statusmorningboosth, _StatusmorningboosthErr := io.ReadBit()
-            if _StatusmorningboosthErr != nil {
-                return nil, errors.New("Error parsing 'Statusmorningboosth' field " + _StatusmorningboosthErr.Error())
+            // Simple Field (buildingMode)
+            buildingMode, _buildingModeErr := io.ReadUint8(8)
+            if _buildingModeErr != nil {
+                return nil, errors.New("Error parsing 'buildingMode' field " + _buildingModeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusmorningboosth)
+            _map["Struct"] = values.NewPlcUSINT(buildingMode)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_Version: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (Tempflowreturnlimit)
-            Tempflowreturnlimit, _TempflowreturnlimitErr := io.ReadBit()
-            if _TempflowreturnlimitErr != nil {
-                return nil, errors.New("Error parsing 'Tempflowreturnlimit' field " + _TempflowreturnlimitErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Tempflowreturnlimit)
 
-            // Simple Field (Tempflowlimit)
-            Tempflowlimit, _TempflowlimitErr := io.ReadBit()
-            if _TempflowlimitErr != nil {
-                return nil, errors.New("Error parsing 'Tempflowlimit' field " + _TempflowlimitErr.Error())
+            // Simple Field (magicNumber)
+            magicNumber, _magicNumberErr := io.ReadUint8(5)
+            if _magicNumberErr != nil {
+                return nil, errors.New("Error parsing 'magicNumber' field " + _magicNumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Tempflowlimit)
+            _map["Struct"] = values.NewPlcUSINT(magicNumber)
 
-            // Simple Field (Statusecoh)
-            Statusecoh, _StatusecohErr := io.ReadBit()
-            if _StatusecohErr != nil {
-                return nil, errors.New("Error parsing 'Statusecoh' field " + _StatusecohErr.Error())
+            // Simple Field (versionNumber)
+            versionNumber, _versionNumberErr := io.ReadUint8(5)
+            if _versionNumberErr != nil {
+                return nil, errors.New("Error parsing 'versionNumber' field " + _versionNumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Statusecoh)
+            _map["Struct"] = values.NewPlcUSINT(versionNumber)
 
-            // Simple Field (Fault)
-            Fault, _FaultErr := io.ReadBit()
-            if _FaultErr != nil {
-                return nil, errors.New("Error parsing 'Fault' field " + _FaultErr.Error())
+            // Simple Field (revisionNumber)
+            revisionNumber, _revisionNumberErr := io.ReadUint8(6)
+            if _revisionNumberErr != nil {
+                return nil, errors.New("Error parsing 'revisionNumber' field " + _revisionNumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fault)
+            _map["Struct"] = values.NewPlcUSINT(revisionNumber)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_CombinedStatus_HVA: // Struct
+        case datapointType == KnxDatapointType_DPT_AlarmInfo: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(7); _err != nil {
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (CalibrationMode)
-            CalibrationMode, _CalibrationModeErr := io.ReadBit()
-            if _CalibrationModeErr != nil {
-                return nil, errors.New("Error parsing 'CalibrationMode' field " + _CalibrationModeErr.Error())
+            // Simple Field (logNumber)
+            logNumber, _logNumberErr := io.ReadUint8(8)
+            if _logNumberErr != nil {
+                return nil, errors.New("Error parsing 'logNumber' field " + _logNumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(CalibrationMode)
+            _map["Struct"] = values.NewPlcUSINT(logNumber)
 
-            // Simple Field (LockedPosition)
-            LockedPosition, _LockedPositionErr := io.ReadBit()
-            if _LockedPositionErr != nil {
-                return nil, errors.New("Error parsing 'LockedPosition' field " + _LockedPositionErr.Error())
+            // Simple Field (alarmPriority)
+            alarmPriority, _alarmPriorityErr := io.ReadUint8(8)
+            if _alarmPriorityErr != nil {
+                return nil, errors.New("Error parsing 'alarmPriority' field " + _alarmPriorityErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(LockedPosition)
+            _map["Struct"] = values.NewPlcUSINT(alarmPriority)
 
-            // Simple Field (ForcedPosition)
-            ForcedPosition, _ForcedPositionErr := io.ReadBit()
-            if _ForcedPositionErr != nil {
-                return nil, errors.New("Error parsing 'ForcedPosition' field " + _ForcedPositionErr.Error())
+            // Simple Field (applicationArea)
+            applicationArea, _applicationAreaErr := io.ReadUint8(8)
+            if _applicationAreaErr != nil {
+                return nil, errors.New("Error parsing 'applicationArea' field " + _applicationAreaErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ForcedPosition)
+            _map["Struct"] = values.NewPlcUSINT(applicationArea)
 
-            // Simple Field (ManuaOperationOverridden)
-            ManuaOperationOverridden, _ManuaOperationOverriddenErr := io.ReadBit()
-            if _ManuaOperationOverriddenErr != nil {
-                return nil, errors.New("Error parsing 'ManuaOperationOverridden' field " + _ManuaOperationOverriddenErr.Error())
+            // Simple Field (errorClass)
+            errorClass, _errorClassErr := io.ReadUint8(8)
+            if _errorClassErr != nil {
+                return nil, errors.New("Error parsing 'errorClass' field " + _errorClassErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ManuaOperationOverridden)
+            _map["Struct"] = values.NewPlcUSINT(errorClass)
 
-            // Simple Field (ServiceMode)
-            ServiceMode, _ServiceModeErr := io.ReadBit()
-            if _ServiceModeErr != nil {
-                return nil, errors.New("Error parsing 'ServiceMode' field " + _ServiceModeErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ServiceMode)
 
-            // Simple Field (ValveKick)
-            ValveKick, _ValveKickErr := io.ReadBit()
-            if _ValveKickErr != nil {
-                return nil, errors.New("Error parsing 'ValveKick' field " + _ValveKickErr.Error())
+            // Simple Field (errorcodeSup)
+            errorcodeSup, _errorcodeSupErr := io.ReadBit()
+            if _errorcodeSupErr != nil {
+                return nil, errors.New("Error parsing 'errorcodeSup' field " + _errorcodeSupErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ValveKick)
+            _map["Struct"] = values.NewPlcBOOL(errorcodeSup)
 
-            // Simple Field (Overload)
-            Overload, _OverloadErr := io.ReadBit()
-            if _OverloadErr != nil {
-                return nil, errors.New("Error parsing 'Overload' field " + _OverloadErr.Error())
+            // Simple Field (alarmtextSup)
+            alarmtextSup, _alarmtextSupErr := io.ReadBit()
+            if _alarmtextSupErr != nil {
+                return nil, errors.New("Error parsing 'alarmtextSup' field " + _alarmtextSupErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Overload)
+            _map["Struct"] = values.NewPlcBOOL(alarmtextSup)
 
-            // Simple Field (ShortCircuit)
-            ShortCircuit, _ShortCircuitErr := io.ReadBit()
-            if _ShortCircuitErr != nil {
-                return nil, errors.New("Error parsing 'ShortCircuit' field " + _ShortCircuitErr.Error())
+            // Simple Field (timestampSup)
+            timestampSup, _timestampSupErr := io.ReadBit()
+            if _timestampSupErr != nil {
+                return nil, errors.New("Error parsing 'timestampSup' field " + _timestampSupErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ShortCircuit)
+            _map["Struct"] = values.NewPlcBOOL(timestampSup)
 
-            // Simple Field (CurrentValvePosition)
-            CurrentValvePosition, _CurrentValvePositionErr := io.ReadBit()
-            if _CurrentValvePositionErr != nil {
-                return nil, errors.New("Error parsing 'CurrentValvePosition' field " + _CurrentValvePositionErr.Error())
+            // Simple Field (ackSup)
+            ackSup, _ackSupErr := io.ReadBit()
+            if _ackSupErr != nil {
+                return nil, errors.New("Error parsing 'ackSup' field " + _ackSupErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(CurrentValvePosition)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_CombinedStatus_RTC: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcBOOL(ackSup)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(7); _err != nil {
+            if _, _err := io.ReadUint8(5); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (CoolingModeEnabled)
-            CoolingModeEnabled, _CoolingModeEnabledErr := io.ReadBit()
-            if _CoolingModeEnabledErr != nil {
-                return nil, errors.New("Error parsing 'CoolingModeEnabled' field " + _CoolingModeEnabledErr.Error())
-            }
-            _map["Struct"] = values.NewPlcBOOL(CoolingModeEnabled)
-
-            // Simple Field (HeatingModeEnabled)
-            HeatingModeEnabled, _HeatingModeEnabledErr := io.ReadBit()
-            if _HeatingModeEnabledErr != nil {
-                return nil, errors.New("Error parsing 'HeatingModeEnabled' field " + _HeatingModeEnabledErr.Error())
-            }
-            _map["Struct"] = values.NewPlcBOOL(HeatingModeEnabled)
-
-            // Simple Field (AdditionalHeatingCoolingStage2Stage)
-            AdditionalHeatingCoolingStage2Stage, _AdditionalHeatingCoolingStage2StageErr := io.ReadBit()
-            if _AdditionalHeatingCoolingStage2StageErr != nil {
-                return nil, errors.New("Error parsing 'AdditionalHeatingCoolingStage2Stage' field " + _AdditionalHeatingCoolingStage2StageErr.Error())
+            // Simple Field (locked)
+            locked, _lockedErr := io.ReadBit()
+            if _lockedErr != nil {
+                return nil, errors.New("Error parsing 'locked' field " + _lockedErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(AdditionalHeatingCoolingStage2Stage)
+            _map["Struct"] = values.NewPlcBOOL(locked)
 
-            // Simple Field (ControllerInactive)
-            ControllerInactive, _ControllerInactiveErr := io.ReadBit()
-            if _ControllerInactiveErr != nil {
-                return nil, errors.New("Error parsing 'ControllerInactive' field " + _ControllerInactiveErr.Error())
+            // Simple Field (alarmunack)
+            alarmunack, _alarmunackErr := io.ReadBit()
+            if _alarmunackErr != nil {
+                return nil, errors.New("Error parsing 'alarmunack' field " + _alarmunackErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ControllerInactive)
+            _map["Struct"] = values.NewPlcBOOL(alarmunack)
 
-            // Simple Field (OverheatAlarm)
-            OverheatAlarm, _OverheatAlarmErr := io.ReadBit()
-            if _OverheatAlarmErr != nil {
-                return nil, errors.New("Error parsing 'OverheatAlarm' field " + _OverheatAlarmErr.Error())
+            // Simple Field (inalarm)
+            inalarm, _inalarmErr := io.ReadBit()
+            if _inalarmErr != nil {
+                return nil, errors.New("Error parsing 'inalarm' field " + _inalarmErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(OverheatAlarm)
+            _map["Struct"] = values.NewPlcBOOL(inalarm)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_TempRoomSetpSetF16_3: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (FrostAlarm)
-            FrostAlarm, _FrostAlarmErr := io.ReadBit()
-            if _FrostAlarmErr != nil {
-                return nil, errors.New("Error parsing 'FrostAlarm' field " + _FrostAlarmErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(FrostAlarm)
 
-            // Simple Field (DewPointStatus)
-            DewPointStatus, _DewPointStatusErr := io.ReadBit()
-            if _DewPointStatusErr != nil {
-                return nil, errors.New("Error parsing 'DewPointStatus' field " + _DewPointStatusErr.Error())
+            // Simple Field (tempsetpcomf)
+            tempsetpcomf, _tempsetpcomfErr := io.ReadFloat32(true, 4, 11)
+            if _tempsetpcomfErr != nil {
+                return nil, errors.New("Error parsing 'tempsetpcomf' field " + _tempsetpcomfErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(DewPointStatus)
+            _map["Struct"] = values.NewPlcREAL(tempsetpcomf)
 
-            // Simple Field (ActiveMode)
-            ActiveMode, _ActiveModeErr := io.ReadBit()
-            if _ActiveModeErr != nil {
-                return nil, errors.New("Error parsing 'ActiveMode' field " + _ActiveModeErr.Error())
+            // Simple Field (tempsetpstdby)
+            tempsetpstdby, _tempsetpstdbyErr := io.ReadFloat32(true, 4, 11)
+            if _tempsetpstdbyErr != nil {
+                return nil, errors.New("Error parsing 'tempsetpstdby' field " + _tempsetpstdbyErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActiveMode)
+            _map["Struct"] = values.NewPlcREAL(tempsetpstdby)
 
-            // Simple Field (GeneralFailureInformation)
-            GeneralFailureInformation, _GeneralFailureInformationErr := io.ReadBit()
-            if _GeneralFailureInformationErr != nil {
-                return nil, errors.New("Error parsing 'GeneralFailureInformation' field " + _GeneralFailureInformationErr.Error())
+            // Simple Field (tempsetpeco)
+            tempsetpeco, _tempsetpecoErr := io.ReadFloat32(true, 4, 11)
+            if _tempsetpecoErr != nil {
+                return nil, errors.New("Error parsing 'tempsetpeco' field " + _tempsetpecoErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(GeneralFailureInformation)
+            _map["Struct"] = values.NewPlcREAL(tempsetpeco)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Media: // Struct
+        case datapointType == KnxDatapointType_DPT_TempRoomSetpSetShiftF16_3: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint16(10); _err != nil {
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (KnxIp)
-            KnxIp, _KnxIpErr := io.ReadBit()
-            if _KnxIpErr != nil {
-                return nil, errors.New("Error parsing 'KnxIp' field " + _KnxIpErr.Error())
+            // Simple Field (tempsetpshiftcomf)
+            tempsetpshiftcomf, _tempsetpshiftcomfErr := io.ReadFloat32(true, 4, 11)
+            if _tempsetpshiftcomfErr != nil {
+                return nil, errors.New("Error parsing 'tempsetpshiftcomf' field " + _tempsetpshiftcomfErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(KnxIp)
+            _map["Struct"] = values.NewPlcREAL(tempsetpshiftcomf)
 
-            // Simple Field (Rf)
-            Rf, _RfErr := io.ReadBit()
-            if _RfErr != nil {
-                return nil, errors.New("Error parsing 'Rf' field " + _RfErr.Error())
+            // Simple Field (tempsetpshiftstdby)
+            tempsetpshiftstdby, _tempsetpshiftstdbyErr := io.ReadFloat32(true, 4, 11)
+            if _tempsetpshiftstdbyErr != nil {
+                return nil, errors.New("Error parsing 'tempsetpshiftstdby' field " + _tempsetpshiftstdbyErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Rf)
+            _map["Struct"] = values.NewPlcREAL(tempsetpshiftstdby)
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(1); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (tempsetpshifteco)
+            tempsetpshifteco, _tempsetpshiftecoErr := io.ReadFloat32(true, 4, 11)
+            if _tempsetpshiftecoErr != nil {
+                return nil, errors.New("Error parsing 'tempsetpshifteco' field " + _tempsetpshiftecoErr.Error())
             }
+            _map["Struct"] = values.NewPlcREAL(tempsetpshifteco)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_Scaling_Speed: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (Pl110)
-            Pl110, _Pl110Err := io.ReadBit()
-            if _Pl110Err != nil {
-                return nil, errors.New("Error parsing 'Pl110' field " + _Pl110Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Pl110)
 
-            // Simple Field (Tp1)
-            Tp1, _Tp1Err := io.ReadBit()
-            if _Tp1Err != nil {
-                return nil, errors.New("Error parsing 'Tp1' field " + _Tp1Err.Error())
+            // Simple Field (timePeriod)
+            timePeriod, _timePeriodErr := io.ReadUint16(16)
+            if _timePeriodErr != nil {
+                return nil, errors.New("Error parsing 'timePeriod' field " + _timePeriodErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Tp1)
+            _map["Struct"] = values.NewPlcUINT(timePeriod)
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(1); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (percent)
+            percent, _percentErr := io.ReadUint8(8)
+            if _percentErr != nil {
+                return nil, errors.New("Error parsing 'percent' field " + _percentErr.Error())
             }
+            _map["Struct"] = values.NewPlcUSINT(percent)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Channel_Activation_16: // Struct
+        case datapointType == KnxDatapointType_DPT_Scaling_Step_Time: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4069,123 +5701,119 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (ActivationStateOfChannel1)
-            ActivationStateOfChannel1, _ActivationStateOfChannel1Err := io.ReadBit()
-            if _ActivationStateOfChannel1Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel1' field " + _ActivationStateOfChannel1Err.Error())
+            // Simple Field (timePeriod)
+            timePeriod, _timePeriodErr := io.ReadUint16(16)
+            if _timePeriodErr != nil {
+                return nil, errors.New("Error parsing 'timePeriod' field " + _timePeriodErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel1)
+            _map["Struct"] = values.NewPlcUINT(timePeriod)
 
-            // Simple Field (ActivationStateOfChannel2)
-            ActivationStateOfChannel2, _ActivationStateOfChannel2Err := io.ReadBit()
-            if _ActivationStateOfChannel2Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel2' field " + _ActivationStateOfChannel2Err.Error())
+            // Simple Field (percent)
+            percent, _percentErr := io.ReadUint8(8)
+            if _percentErr != nil {
+                return nil, errors.New("Error parsing 'percent' field " + _percentErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel2)
+            _map["Struct"] = values.NewPlcUSINT(percent)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_MeteringValue: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (ActivationStateOfChannel3)
-            ActivationStateOfChannel3, _ActivationStateOfChannel3Err := io.ReadBit()
-            if _ActivationStateOfChannel3Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel3' field " + _ActivationStateOfChannel3Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel3)
 
-            // Simple Field (ActivationStateOfChannel4)
-            ActivationStateOfChannel4, _ActivationStateOfChannel4Err := io.ReadBit()
-            if _ActivationStateOfChannel4Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel4' field " + _ActivationStateOfChannel4Err.Error())
+            // Simple Field (countval)
+            countval, _countvalErr := io.ReadInt32(32)
+            if _countvalErr != nil {
+                return nil, errors.New("Error parsing 'countval' field " + _countvalErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel4)
+            _map["Struct"] = values.NewPlcDINT(countval)
 
-            // Simple Field (ActivationStateOfChannel5)
-            ActivationStateOfChannel5, _ActivationStateOfChannel5Err := io.ReadBit()
-            if _ActivationStateOfChannel5Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel5' field " + _ActivationStateOfChannel5Err.Error())
+            // Simple Field (valinffield)
+            valinffield, _valinffieldErr := io.ReadUint8(8)
+            if _valinffieldErr != nil {
+                return nil, errors.New("Error parsing 'valinffield' field " + _valinffieldErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel5)
+            _map["Struct"] = values.NewPlcUSINT(valinffield)
 
-            // Simple Field (ActivationStateOfChannel6)
-            ActivationStateOfChannel6, _ActivationStateOfChannel6Err := io.ReadBit()
-            if _ActivationStateOfChannel6Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel6' field " + _ActivationStateOfChannel6Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(3); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel6)
 
-            // Simple Field (ActivationStateOfChannel7)
-            ActivationStateOfChannel7, _ActivationStateOfChannel7Err := io.ReadBit()
-            if _ActivationStateOfChannel7Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel7' field " + _ActivationStateOfChannel7Err.Error())
+            // Simple Field (alarmunack)
+            alarmunack, _alarmunackErr := io.ReadBit()
+            if _alarmunackErr != nil {
+                return nil, errors.New("Error parsing 'alarmunack' field " + _alarmunackErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel7)
+            _map["Struct"] = values.NewPlcBOOL(alarmunack)
 
-            // Simple Field (ActivationStateOfChannel8)
-            ActivationStateOfChannel8, _ActivationStateOfChannel8Err := io.ReadBit()
-            if _ActivationStateOfChannel8Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel8' field " + _ActivationStateOfChannel8Err.Error())
+            // Simple Field (inalarm)
+            inalarm, _inalarmErr := io.ReadBit()
+            if _inalarmErr != nil {
+                return nil, errors.New("Error parsing 'inalarm' field " + _inalarmErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel8)
+            _map["Struct"] = values.NewPlcBOOL(inalarm)
 
-            // Simple Field (ActivationStateOfChannel9)
-            ActivationStateOfChannel9, _ActivationStateOfChannel9Err := io.ReadBit()
-            if _ActivationStateOfChannel9Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel9' field " + _ActivationStateOfChannel9Err.Error())
+            // Simple Field (overridden)
+            overridden, _overriddenErr := io.ReadBit()
+            if _overriddenErr != nil {
+                return nil, errors.New("Error parsing 'overridden' field " + _overriddenErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel9)
+            _map["Struct"] = values.NewPlcBOOL(overridden)
 
-            // Simple Field (ActivationStateOfChannel10)
-            ActivationStateOfChannel10, _ActivationStateOfChannel10Err := io.ReadBit()
-            if _ActivationStateOfChannel10Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel10' field " + _ActivationStateOfChannel10Err.Error())
+            // Simple Field (fault)
+            fault, _faultErr := io.ReadBit()
+            if _faultErr != nil {
+                return nil, errors.New("Error parsing 'fault' field " + _faultErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel10)
+            _map["Struct"] = values.NewPlcBOOL(fault)
 
-            // Simple Field (ActivationStateOfChannel11)
-            ActivationStateOfChannel11, _ActivationStateOfChannel11Err := io.ReadBit()
-            if _ActivationStateOfChannel11Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel11' field " + _ActivationStateOfChannel11Err.Error())
+            // Simple Field (outofservice)
+            outofservice, _outofserviceErr := io.ReadBit()
+            if _outofserviceErr != nil {
+                return nil, errors.New("Error parsing 'outofservice' field " + _outofserviceErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel11)
+            _map["Struct"] = values.NewPlcBOOL(outofservice)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_MBus_Address: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (ActivationStateOfChannel12)
-            ActivationStateOfChannel12, _ActivationStateOfChannel12Err := io.ReadBit()
-            if _ActivationStateOfChannel12Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel12' field " + _ActivationStateOfChannel12Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel12)
 
-            // Simple Field (ActivationStateOfChannel13)
-            ActivationStateOfChannel13, _ActivationStateOfChannel13Err := io.ReadBit()
-            if _ActivationStateOfChannel13Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel13' field " + _ActivationStateOfChannel13Err.Error())
+            // Simple Field (manufactid)
+            manufactid, _manufactidErr := io.ReadUint16(16)
+            if _manufactidErr != nil {
+                return nil, errors.New("Error parsing 'manufactid' field " + _manufactidErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel13)
+            _map["Struct"] = values.NewPlcUINT(manufactid)
 
-            // Simple Field (ActivationStateOfChannel14)
-            ActivationStateOfChannel14, _ActivationStateOfChannel14Err := io.ReadBit()
-            if _ActivationStateOfChannel14Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel14' field " + _ActivationStateOfChannel14Err.Error())
+            // Simple Field (identnumber)
+            identnumber, _identnumberErr := io.ReadUint32(32)
+            if _identnumberErr != nil {
+                return nil, errors.New("Error parsing 'identnumber' field " + _identnumberErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel14)
+            _map["Struct"] = values.NewPlcUDINT(identnumber)
 
-            // Simple Field (ActivationStateOfChannel15)
-            ActivationStateOfChannel15, _ActivationStateOfChannel15Err := io.ReadBit()
-            if _ActivationStateOfChannel15Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel15' field " + _ActivationStateOfChannel15Err.Error())
+            // Simple Field (version)
+            version, _versionErr := io.ReadUint8(8)
+            if _versionErr != nil {
+                return nil, errors.New("Error parsing 'version' field " + _versionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel15)
+            _map["Struct"] = values.NewPlcUSINT(version)
 
-            // Simple Field (ActivationStateOfChannel16)
-            ActivationStateOfChannel16, _ActivationStateOfChannel16Err := io.ReadBit()
-            if _ActivationStateOfChannel16Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel16' field " + _ActivationStateOfChannel16Err.Error())
+            // Simple Field (medium)
+            medium, _mediumErr := io.ReadUint8(8)
+            if _mediumErr != nil {
+                return nil, errors.New("Error parsing 'medium' field " + _mediumErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel16)
+            _map["Struct"] = values.NewPlcUSINT(medium)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_OnOffAction: // STRING
-        case datapointType == KnxDatapointType.DPT_Alarm_Reaction: // STRING
-        case datapointType == KnxDatapointType.DPT_UpDown_Action: // STRING
-        case datapointType == KnxDatapointType.DPT_HVAC_PB_Action: // STRING
-        case datapointType == KnxDatapointType.DPT_DoubleNibble: // Struct
+        case datapointType == KnxDatapointType_DPT_Colour_RGB: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4193,21 +5821,41 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Busy)
-            Busy, _BusyErr := io.ReadUint8(4)
-            if _BusyErr != nil {
-                return nil, errors.New("Error parsing 'Busy' field " + _BusyErr.Error())
+            // Simple Field (r)
+            r, _rErr := io.ReadUint8(8)
+            if _rErr != nil {
+                return nil, errors.New("Error parsing 'r' field " + _rErr.Error())
+            }
+            _map["Struct"] = values.NewPlcUSINT(r)
+
+            // Simple Field (g)
+            g, _gErr := io.ReadUint8(8)
+            if _gErr != nil {
+                return nil, errors.New("Error parsing 'g' field " + _gErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Busy)
+            _map["Struct"] = values.NewPlcUSINT(g)
 
-            // Simple Field (Nak)
-            Nak, _NakErr := io.ReadUint8(4)
-            if _NakErr != nil {
-                return nil, errors.New("Error parsing 'Nak' field " + _NakErr.Error())
+            // Simple Field (b)
+            b, _bErr := io.ReadUint8(8)
+            if _bErr != nil {
+                return nil, errors.New("Error parsing 'b' field " + _bErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Nak)
+            _map["Struct"] = values.NewPlcUSINT(b)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_SceneInfo: // Struct
+        case datapointType == KnxDatapointType_DPT_LanguageCodeAlpha2_ASCII: // STRING
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+
+            // Simple Field (value)
+            value, _valueErr := io.ReadString(16)
+            if _valueErr != nil {
+                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            }
+            return values.NewPlcSTRING(value), nil
+        case datapointType == KnxDatapointType_DPT_Tariff_ActiveEnergy: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4215,26 +5863,40 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
+            // Simple Field (activeelectricalenergy)
+            activeelectricalenergy, _activeelectricalenergyErr := io.ReadInt32(32)
+            if _activeelectricalenergyErr != nil {
+                return nil, errors.New("Error parsing 'activeelectricalenergy' field " + _activeelectricalenergyErr.Error())
+            }
+            _map["Struct"] = values.NewPlcDINT(activeelectricalenergy)
+
+            // Simple Field (tariff)
+            tariff, _tariffErr := io.ReadUint8(8)
+            if _tariffErr != nil {
+                return nil, errors.New("Error parsing 'tariff' field " + _tariffErr.Error())
+            }
+            _map["Struct"] = values.NewPlcUSINT(tariff)
+
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(1); _err != nil {
+            if _, _err := io.ReadUint8(6); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (SceneIsInactive)
-            SceneIsInactive, _SceneIsInactiveErr := io.ReadBit()
-            if _SceneIsInactiveErr != nil {
-                return nil, errors.New("Error parsing 'SceneIsInactive' field " + _SceneIsInactiveErr.Error())
+            // Simple Field (electricalengergyvalidity)
+            electricalengergyvalidity, _electricalengergyvalidityErr := io.ReadBit()
+            if _electricalengergyvalidityErr != nil {
+                return nil, errors.New("Error parsing 'electricalengergyvalidity' field " + _electricalengergyvalidityErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(SceneIsInactive)
+            _map["Struct"] = values.NewPlcBOOL(electricalengergyvalidity)
 
-            // Simple Field (Scenenumber)
-            Scenenumber, _ScenenumberErr := io.ReadUint8(6)
-            if _ScenenumberErr != nil {
-                return nil, errors.New("Error parsing 'Scenenumber' field " + _ScenenumberErr.Error())
+            // Simple Field (tariffvalidity)
+            tariffvalidity, _tariffvalidityErr := io.ReadBit()
+            if _tariffvalidityErr != nil {
+                return nil, errors.New("Error parsing 'tariffvalidity' field " + _tariffvalidityErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Scenenumber)
+            _map["Struct"] = values.NewPlcBOOL(tariffvalidity)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_CombinedInfoOnOff: // Struct
+        case datapointType == KnxDatapointType_DPT_Prioritised_Mode_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4242,270 +5904,266 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (MaskBitInfoOnOffOutput16)
-            MaskBitInfoOnOffOutput16, _MaskBitInfoOnOffOutput16Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput16Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput16' field " + _MaskBitInfoOnOffOutput16Err.Error())
+            // Simple Field (deactivationOfPriority)
+            deactivationOfPriority, _deactivationOfPriorityErr := io.ReadBit()
+            if _deactivationOfPriorityErr != nil {
+                return nil, errors.New("Error parsing 'deactivationOfPriority' field " + _deactivationOfPriorityErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput16)
+            _map["Struct"] = values.NewPlcBOOL(deactivationOfPriority)
 
-            // Simple Field (MaskBitInfoOnOffOutput15)
-            MaskBitInfoOnOffOutput15, _MaskBitInfoOnOffOutput15Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput15Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput15' field " + _MaskBitInfoOnOffOutput15Err.Error())
+            // Simple Field (priorityLevel)
+            priorityLevel, _priorityLevelErr := io.ReadUint8(3)
+            if _priorityLevelErr != nil {
+                return nil, errors.New("Error parsing 'priorityLevel' field " + _priorityLevelErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput15)
+            _map["Struct"] = values.NewPlcUSINT(priorityLevel)
 
-            // Simple Field (MaskBitInfoOnOffOutput14)
-            MaskBitInfoOnOffOutput14, _MaskBitInfoOnOffOutput14Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput14Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput14' field " + _MaskBitInfoOnOffOutput14Err.Error())
+            // Simple Field (modeLevel)
+            modeLevel, _modeLevelErr := io.ReadUint8(4)
+            if _modeLevelErr != nil {
+                return nil, errors.New("Error parsing 'modeLevel' field " + _modeLevelErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput14)
+            _map["Struct"] = values.NewPlcUSINT(modeLevel)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_DALI_Control_Gear_Diagnostic: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (MaskBitInfoOnOffOutput13)
-            MaskBitInfoOnOffOutput13, _MaskBitInfoOnOffOutput13Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput13Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput13' field " + _MaskBitInfoOnOffOutput13Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(5); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput13)
 
-            // Simple Field (MaskBitInfoOnOffOutput12)
-            MaskBitInfoOnOffOutput12, _MaskBitInfoOnOffOutput12Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput12Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput12' field " + _MaskBitInfoOnOffOutput12Err.Error())
+            // Simple Field (convertorError)
+            convertorError, _convertorErrorErr := io.ReadBit()
+            if _convertorErrorErr != nil {
+                return nil, errors.New("Error parsing 'convertorError' field " + _convertorErrorErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput12)
+            _map["Struct"] = values.NewPlcBOOL(convertorError)
 
-            // Simple Field (MaskBitInfoOnOffOutput11)
-            MaskBitInfoOnOffOutput11, _MaskBitInfoOnOffOutput11Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput11Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput11' field " + _MaskBitInfoOnOffOutput11Err.Error())
+            // Simple Field (ballastFailure)
+            ballastFailure, _ballastFailureErr := io.ReadBit()
+            if _ballastFailureErr != nil {
+                return nil, errors.New("Error parsing 'ballastFailure' field " + _ballastFailureErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput11)
+            _map["Struct"] = values.NewPlcBOOL(ballastFailure)
 
-            // Simple Field (MaskBitInfoOnOffOutput10)
-            MaskBitInfoOnOffOutput10, _MaskBitInfoOnOffOutput10Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput10Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput10' field " + _MaskBitInfoOnOffOutput10Err.Error())
+            // Simple Field (lampFailure)
+            lampFailure, _lampFailureErr := io.ReadBit()
+            if _lampFailureErr != nil {
+                return nil, errors.New("Error parsing 'lampFailure' field " + _lampFailureErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput10)
+            _map["Struct"] = values.NewPlcBOOL(lampFailure)
 
-            // Simple Field (MaskBitInfoOnOffOutput9)
-            MaskBitInfoOnOffOutput9, _MaskBitInfoOnOffOutput9Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput9Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput9' field " + _MaskBitInfoOnOffOutput9Err.Error())
+            // Simple Field (readOrResponse)
+            readOrResponse, _readOrResponseErr := io.ReadBit()
+            if _readOrResponseErr != nil {
+                return nil, errors.New("Error parsing 'readOrResponse' field " + _readOrResponseErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput9)
+            _map["Struct"] = values.NewPlcBOOL(readOrResponse)
 
-            // Simple Field (MaskBitInfoOnOffOutput8)
-            MaskBitInfoOnOffOutput8, _MaskBitInfoOnOffOutput8Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput8Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput8' field " + _MaskBitInfoOnOffOutput8Err.Error())
+            // Simple Field (addressIndicator)
+            addressIndicator, _addressIndicatorErr := io.ReadBit()
+            if _addressIndicatorErr != nil {
+                return nil, errors.New("Error parsing 'addressIndicator' field " + _addressIndicatorErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput8)
+            _map["Struct"] = values.NewPlcBOOL(addressIndicator)
 
-            // Simple Field (MaskBitInfoOnOffOutput7)
-            MaskBitInfoOnOffOutput7, _MaskBitInfoOnOffOutput7Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput7Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput7' field " + _MaskBitInfoOnOffOutput7Err.Error())
+            // Simple Field (daliDeviceAddressOrDaliGroupAddress)
+            daliDeviceAddressOrDaliGroupAddress, _daliDeviceAddressOrDaliGroupAddressErr := io.ReadUint8(6)
+            if _daliDeviceAddressOrDaliGroupAddressErr != nil {
+                return nil, errors.New("Error parsing 'daliDeviceAddressOrDaliGroupAddress' field " + _daliDeviceAddressOrDaliGroupAddressErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput7)
+            _map["Struct"] = values.NewPlcUSINT(daliDeviceAddressOrDaliGroupAddress)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_DALI_Diagnostics: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (MaskBitInfoOnOffOutput6)
-            MaskBitInfoOnOffOutput6, _MaskBitInfoOnOffOutput6Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput6Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput6' field " + _MaskBitInfoOnOffOutput6Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput6)
 
-            // Simple Field (MaskBitInfoOnOffOutput5)
-            MaskBitInfoOnOffOutput5, _MaskBitInfoOnOffOutput5Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput5Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput5' field " + _MaskBitInfoOnOffOutput5Err.Error())
+            // Simple Field (ballastFailure)
+            ballastFailure, _ballastFailureErr := io.ReadBit()
+            if _ballastFailureErr != nil {
+                return nil, errors.New("Error parsing 'ballastFailure' field " + _ballastFailureErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput5)
+            _map["Struct"] = values.NewPlcBOOL(ballastFailure)
 
-            // Simple Field (MaskBitInfoOnOffOutput4)
-            MaskBitInfoOnOffOutput4, _MaskBitInfoOnOffOutput4Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput4Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput4' field " + _MaskBitInfoOnOffOutput4Err.Error())
+            // Simple Field (lampFailure)
+            lampFailure, _lampFailureErr := io.ReadBit()
+            if _lampFailureErr != nil {
+                return nil, errors.New("Error parsing 'lampFailure' field " + _lampFailureErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput4)
+            _map["Struct"] = values.NewPlcBOOL(lampFailure)
 
-            // Simple Field (MaskBitInfoOnOffOutput3)
-            MaskBitInfoOnOffOutput3, _MaskBitInfoOnOffOutput3Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput3Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput3' field " + _MaskBitInfoOnOffOutput3Err.Error())
+            // Simple Field (deviceAddress)
+            deviceAddress, _deviceAddressErr := io.ReadUint8(6)
+            if _deviceAddressErr != nil {
+                return nil, errors.New("Error parsing 'deviceAddress' field " + _deviceAddressErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput3)
+            _map["Struct"] = values.NewPlcUSINT(deviceAddress)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_CombinedPosition: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (MaskBitInfoOnOffOutput2)
-            MaskBitInfoOnOffOutput2, _MaskBitInfoOnOffOutput2Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput2Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput2' field " + _MaskBitInfoOnOffOutput2Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput2)
 
-            // Simple Field (MaskBitInfoOnOffOutput1)
-            MaskBitInfoOnOffOutput1, _MaskBitInfoOnOffOutput1Err := io.ReadBit()
-            if _MaskBitInfoOnOffOutput1Err != nil {
-                return nil, errors.New("Error parsing 'MaskBitInfoOnOffOutput1' field " + _MaskBitInfoOnOffOutput1Err.Error())
+            // Simple Field (heightPosition)
+            heightPosition, _heightPositionErr := io.ReadUint8(8)
+            if _heightPositionErr != nil {
+                return nil, errors.New("Error parsing 'heightPosition' field " + _heightPositionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(MaskBitInfoOnOffOutput1)
+            _map["Struct"] = values.NewPlcUSINT(heightPosition)
 
-            // Simple Field (InfoOnOffOutput16)
-            InfoOnOffOutput16, _InfoOnOffOutput16Err := io.ReadBit()
-            if _InfoOnOffOutput16Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput16' field " + _InfoOnOffOutput16Err.Error())
+            // Simple Field (slatsPosition)
+            slatsPosition, _slatsPositionErr := io.ReadUint8(8)
+            if _slatsPositionErr != nil {
+                return nil, errors.New("Error parsing 'slatsPosition' field " + _slatsPositionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput16)
+            _map["Struct"] = values.NewPlcUSINT(slatsPosition)
 
-            // Simple Field (InfoOnOffOutput15)
-            InfoOnOffOutput15, _InfoOnOffOutput15Err := io.ReadBit()
-            if _InfoOnOffOutput15Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput15' field " + _InfoOnOffOutput15Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(6); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput15)
 
-            // Simple Field (InfoOnOffOutput14)
-            InfoOnOffOutput14, _InfoOnOffOutput14Err := io.ReadBit()
-            if _InfoOnOffOutput14Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput14' field " + _InfoOnOffOutput14Err.Error())
+            // Simple Field (validityHeightPosition)
+            validityHeightPosition, _validityHeightPositionErr := io.ReadBit()
+            if _validityHeightPositionErr != nil {
+                return nil, errors.New("Error parsing 'validityHeightPosition' field " + _validityHeightPositionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput14)
+            _map["Struct"] = values.NewPlcBOOL(validityHeightPosition)
 
-            // Simple Field (InfoOnOffOutput13)
-            InfoOnOffOutput13, _InfoOnOffOutput13Err := io.ReadBit()
-            if _InfoOnOffOutput13Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput13' field " + _InfoOnOffOutput13Err.Error())
+            // Simple Field (validitySlatsPosition)
+            validitySlatsPosition, _validitySlatsPositionErr := io.ReadBit()
+            if _validitySlatsPositionErr != nil {
+                return nil, errors.New("Error parsing 'validitySlatsPosition' field " + _validitySlatsPositionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput13)
+            _map["Struct"] = values.NewPlcBOOL(validitySlatsPosition)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_StatusSAB: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (InfoOnOffOutput12)
-            InfoOnOffOutput12, _InfoOnOffOutput12Err := io.ReadBit()
-            if _InfoOnOffOutput12Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput12' field " + _InfoOnOffOutput12Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput12)
 
-            // Simple Field (InfoOnOffOutput11)
-            InfoOnOffOutput11, _InfoOnOffOutput11Err := io.ReadBit()
-            if _InfoOnOffOutput11Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput11' field " + _InfoOnOffOutput11Err.Error())
+            // Simple Field (heightPosition)
+            heightPosition, _heightPositionErr := io.ReadUint8(8)
+            if _heightPositionErr != nil {
+                return nil, errors.New("Error parsing 'heightPosition' field " + _heightPositionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput11)
+            _map["Struct"] = values.NewPlcUSINT(heightPosition)
 
-            // Simple Field (InfoOnOffOutput10)
-            InfoOnOffOutput10, _InfoOnOffOutput10Err := io.ReadBit()
-            if _InfoOnOffOutput10Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput10' field " + _InfoOnOffOutput10Err.Error())
+            // Simple Field (slatsPosition)
+            slatsPosition, _slatsPositionErr := io.ReadUint8(8)
+            if _slatsPositionErr != nil {
+                return nil, errors.New("Error parsing 'slatsPosition' field " + _slatsPositionErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput10)
+            _map["Struct"] = values.NewPlcUSINT(slatsPosition)
 
-            // Simple Field (InfoOnOffOutput9)
-            InfoOnOffOutput9, _InfoOnOffOutput9Err := io.ReadBit()
-            if _InfoOnOffOutput9Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput9' field " + _InfoOnOffOutput9Err.Error())
+            // Simple Field (upperEndPosReached)
+            upperEndPosReached, _upperEndPosReachedErr := io.ReadBit()
+            if _upperEndPosReachedErr != nil {
+                return nil, errors.New("Error parsing 'upperEndPosReached' field " + _upperEndPosReachedErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput9)
+            _map["Struct"] = values.NewPlcBOOL(upperEndPosReached)
 
-            // Simple Field (InfoOnOffOutput8)
-            InfoOnOffOutput8, _InfoOnOffOutput8Err := io.ReadBit()
-            if _InfoOnOffOutput8Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput8' field " + _InfoOnOffOutput8Err.Error())
+            // Simple Field (lowerEndPosReached)
+            lowerEndPosReached, _lowerEndPosReachedErr := io.ReadBit()
+            if _lowerEndPosReachedErr != nil {
+                return nil, errors.New("Error parsing 'lowerEndPosReached' field " + _lowerEndPosReachedErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput8)
+            _map["Struct"] = values.NewPlcBOOL(lowerEndPosReached)
 
-            // Simple Field (InfoOnOffOutput7)
-            InfoOnOffOutput7, _InfoOnOffOutput7Err := io.ReadBit()
-            if _InfoOnOffOutput7Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput7' field " + _InfoOnOffOutput7Err.Error())
+            // Simple Field (lowerPredefPosReachedTypHeight100PercentSlatsAngle100Percent)
+            lowerPredefPosReachedTypHeight100PercentSlatsAngle100Percent, _lowerPredefPosReachedTypHeight100PercentSlatsAngle100PercentErr := io.ReadBit()
+            if _lowerPredefPosReachedTypHeight100PercentSlatsAngle100PercentErr != nil {
+                return nil, errors.New("Error parsing 'lowerPredefPosReachedTypHeight100PercentSlatsAngle100Percent' field " + _lowerPredefPosReachedTypHeight100PercentSlatsAngle100PercentErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput7)
+            _map["Struct"] = values.NewPlcBOOL(lowerPredefPosReachedTypHeight100PercentSlatsAngle100Percent)
 
-            // Simple Field (InfoOnOffOutput6)
-            InfoOnOffOutput6, _InfoOnOffOutput6Err := io.ReadBit()
-            if _InfoOnOffOutput6Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput6' field " + _InfoOnOffOutput6Err.Error())
+            // Simple Field (targetPosDrive)
+            targetPosDrive, _targetPosDriveErr := io.ReadBit()
+            if _targetPosDriveErr != nil {
+                return nil, errors.New("Error parsing 'targetPosDrive' field " + _targetPosDriveErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput6)
+            _map["Struct"] = values.NewPlcBOOL(targetPosDrive)
 
-            // Simple Field (InfoOnOffOutput5)
-            InfoOnOffOutput5, _InfoOnOffOutput5Err := io.ReadBit()
-            if _InfoOnOffOutput5Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput5' field " + _InfoOnOffOutput5Err.Error())
+            // Simple Field (restrictionOfTargetHeightPosPosCanNotBeReached)
+            restrictionOfTargetHeightPosPosCanNotBeReached, _restrictionOfTargetHeightPosPosCanNotBeReachedErr := io.ReadBit()
+            if _restrictionOfTargetHeightPosPosCanNotBeReachedErr != nil {
+                return nil, errors.New("Error parsing 'restrictionOfTargetHeightPosPosCanNotBeReached' field " + _restrictionOfTargetHeightPosPosCanNotBeReachedErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput5)
+            _map["Struct"] = values.NewPlcBOOL(restrictionOfTargetHeightPosPosCanNotBeReached)
 
-            // Simple Field (InfoOnOffOutput4)
-            InfoOnOffOutput4, _InfoOnOffOutput4Err := io.ReadBit()
-            if _InfoOnOffOutput4Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput4' field " + _InfoOnOffOutput4Err.Error())
+            // Simple Field (restrictionOfSlatsHeightPosPosCanNotBeReached)
+            restrictionOfSlatsHeightPosPosCanNotBeReached, _restrictionOfSlatsHeightPosPosCanNotBeReachedErr := io.ReadBit()
+            if _restrictionOfSlatsHeightPosPosCanNotBeReachedErr != nil {
+                return nil, errors.New("Error parsing 'restrictionOfSlatsHeightPosPosCanNotBeReached' field " + _restrictionOfSlatsHeightPosPosCanNotBeReachedErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput4)
+            _map["Struct"] = values.NewPlcBOOL(restrictionOfSlatsHeightPosPosCanNotBeReached)
 
-            // Simple Field (InfoOnOffOutput3)
-            InfoOnOffOutput3, _InfoOnOffOutput3Err := io.ReadBit()
-            if _InfoOnOffOutput3Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput3' field " + _InfoOnOffOutput3Err.Error())
+            // Simple Field (atLeastOneOfTheInputsWindRainFrostAlarmIsInAlarm)
+            atLeastOneOfTheInputsWindRainFrostAlarmIsInAlarm, _atLeastOneOfTheInputsWindRainFrostAlarmIsInAlarmErr := io.ReadBit()
+            if _atLeastOneOfTheInputsWindRainFrostAlarmIsInAlarmErr != nil {
+                return nil, errors.New("Error parsing 'atLeastOneOfTheInputsWindRainFrostAlarmIsInAlarm' field " + _atLeastOneOfTheInputsWindRainFrostAlarmIsInAlarmErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput3)
+            _map["Struct"] = values.NewPlcBOOL(atLeastOneOfTheInputsWindRainFrostAlarmIsInAlarm)
 
-            // Simple Field (InfoOnOffOutput2)
-            InfoOnOffOutput2, _InfoOnOffOutput2Err := io.ReadBit()
-            if _InfoOnOffOutput2Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput2' field " + _InfoOnOffOutput2Err.Error())
+            // Simple Field (upDownPositionIsForcedByMoveupdownforcedInput)
+            upDownPositionIsForcedByMoveupdownforcedInput, _upDownPositionIsForcedByMoveupdownforcedInputErr := io.ReadBit()
+            if _upDownPositionIsForcedByMoveupdownforcedInputErr != nil {
+                return nil, errors.New("Error parsing 'upDownPositionIsForcedByMoveupdownforcedInput' field " + _upDownPositionIsForcedByMoveupdownforcedInputErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput2)
+            _map["Struct"] = values.NewPlcBOOL(upDownPositionIsForcedByMoveupdownforcedInput)
 
-            // Simple Field (InfoOnOffOutput1)
-            InfoOnOffOutput1, _InfoOnOffOutput1Err := io.ReadBit()
-            if _InfoOnOffOutput1Err != nil {
-                return nil, errors.New("Error parsing 'InfoOnOffOutput1' field " + _InfoOnOffOutput1Err.Error())
+            // Simple Field (movementIsLockedEGByDevicelockedInput)
+            movementIsLockedEGByDevicelockedInput, _movementIsLockedEGByDevicelockedInputErr := io.ReadBit()
+            if _movementIsLockedEGByDevicelockedInputErr != nil {
+                return nil, errors.New("Error parsing 'movementIsLockedEGByDevicelockedInput' field " + _movementIsLockedEGByDevicelockedInputErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(InfoOnOffOutput1)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_ActiveEnergy_V64: // LINT
+            _map["Struct"] = values.NewPlcBOOL(movementIsLockedEGByDevicelockedInput)
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (actuatorSetvalueIsLocallyOverriddenEGViaALocalUserInterface)
+            actuatorSetvalueIsLocallyOverriddenEGViaALocalUserInterface, _actuatorSetvalueIsLocallyOverriddenEGViaALocalUserInterfaceErr := io.ReadBit()
+            if _actuatorSetvalueIsLocallyOverriddenEGViaALocalUserInterfaceErr != nil {
+                return nil, errors.New("Error parsing 'actuatorSetvalueIsLocallyOverriddenEGViaALocalUserInterface' field " + _actuatorSetvalueIsLocallyOverriddenEGViaALocalUserInterfaceErr.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(actuatorSetvalueIsLocallyOverriddenEGViaALocalUserInterface)
 
-            // Simple Field (value)
-            value, _valueErr := io.ReadInt64(64)
-            if _valueErr != nil {
-                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            // Simple Field (generalFailureOfTheActuatorOrTheDrive)
+            generalFailureOfTheActuatorOrTheDrive, _generalFailureOfTheActuatorOrTheDriveErr := io.ReadBit()
+            if _generalFailureOfTheActuatorOrTheDriveErr != nil {
+                return nil, errors.New("Error parsing 'generalFailureOfTheActuatorOrTheDrive' field " + _generalFailureOfTheActuatorOrTheDriveErr.Error())
             }
-            return values.NewPlcLINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ApparantEnergy_V64: // LINT
+            _map["Struct"] = values.NewPlcBOOL(generalFailureOfTheActuatorOrTheDrive)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(3); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (value)
-            value, _valueErr := io.ReadInt64(64)
-            if _valueErr != nil {
-                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
-            }
-            return values.NewPlcLINT(value), nil
-        case datapointType == KnxDatapointType.DPT_ReactiveEnergy_V64: // LINT
-
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (validityHeightPos)
+            validityHeightPos, _validityHeightPosErr := io.ReadBit()
+            if _validityHeightPosErr != nil {
+                return nil, errors.New("Error parsing 'validityHeightPos' field " + _validityHeightPosErr.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(validityHeightPos)
 
-            // Simple Field (value)
-            value, _valueErr := io.ReadInt64(64)
-            if _valueErr != nil {
-                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            // Simple Field (validitySlatsPos)
+            validitySlatsPos, _validitySlatsPosErr := io.ReadBit()
+            if _validitySlatsPosErr != nil {
+                return nil, errors.New("Error parsing 'validitySlatsPos' field " + _validitySlatsPosErr.Error())
             }
-            return values.NewPlcLINT(value), nil
-        case datapointType == KnxDatapointType.DPT_Channel_Activation_24: // Struct
+            _map["Struct"] = values.NewPlcBOOL(validitySlatsPos)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_Colour_xyY: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4513,241 +6171,219 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (ActivationStateOfChannel1)
-            ActivationStateOfChannel1, _ActivationStateOfChannel1Err := io.ReadBit()
-            if _ActivationStateOfChannel1Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel1' field " + _ActivationStateOfChannel1Err.Error())
+            // Simple Field (xAxis)
+            xAxis, _xAxisErr := io.ReadUint16(16)
+            if _xAxisErr != nil {
+                return nil, errors.New("Error parsing 'xAxis' field " + _xAxisErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel1)
+            _map["Struct"] = values.NewPlcUINT(xAxis)
 
-            // Simple Field (ActivationStateOfChannel2)
-            ActivationStateOfChannel2, _ActivationStateOfChannel2Err := io.ReadBit()
-            if _ActivationStateOfChannel2Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel2' field " + _ActivationStateOfChannel2Err.Error())
+            // Simple Field (yAxis)
+            yAxis, _yAxisErr := io.ReadUint16(16)
+            if _yAxisErr != nil {
+                return nil, errors.New("Error parsing 'yAxis' field " + _yAxisErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel2)
+            _map["Struct"] = values.NewPlcUINT(yAxis)
 
-            // Simple Field (ActivationStateOfChannel3)
-            ActivationStateOfChannel3, _ActivationStateOfChannel3Err := io.ReadBit()
-            if _ActivationStateOfChannel3Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel3' field " + _ActivationStateOfChannel3Err.Error())
+            // Simple Field (brightness)
+            brightness, _brightnessErr := io.ReadUint8(8)
+            if _brightnessErr != nil {
+                return nil, errors.New("Error parsing 'brightness' field " + _brightnessErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel3)
+            _map["Struct"] = values.NewPlcUSINT(brightness)
 
-            // Simple Field (ActivationStateOfChannel4)
-            ActivationStateOfChannel4, _ActivationStateOfChannel4Err := io.ReadBit()
-            if _ActivationStateOfChannel4Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel4' field " + _ActivationStateOfChannel4Err.Error())
-            }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel4)
-
-            // Simple Field (ActivationStateOfChannel5)
-            ActivationStateOfChannel5, _ActivationStateOfChannel5Err := io.ReadBit()
-            if _ActivationStateOfChannel5Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel5' field " + _ActivationStateOfChannel5Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(6); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel5)
 
-            // Simple Field (ActivationStateOfChannel6)
-            ActivationStateOfChannel6, _ActivationStateOfChannel6Err := io.ReadBit()
-            if _ActivationStateOfChannel6Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel6' field " + _ActivationStateOfChannel6Err.Error())
+            // Simple Field (validityXy)
+            validityXy, _validityXyErr := io.ReadBit()
+            if _validityXyErr != nil {
+                return nil, errors.New("Error parsing 'validityXy' field " + _validityXyErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel6)
+            _map["Struct"] = values.NewPlcBOOL(validityXy)
 
-            // Simple Field (ActivationStateOfChannel7)
-            ActivationStateOfChannel7, _ActivationStateOfChannel7Err := io.ReadBit()
-            if _ActivationStateOfChannel7Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel7' field " + _ActivationStateOfChannel7Err.Error())
+            // Simple Field (validityBrightness)
+            validityBrightness, _validityBrightnessErr := io.ReadBit()
+            if _validityBrightnessErr != nil {
+                return nil, errors.New("Error parsing 'validityBrightness' field " + _validityBrightnessErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel7)
+            _map["Struct"] = values.NewPlcBOOL(validityBrightness)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_Converter_Status: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (ActivationStateOfChannel8)
-            ActivationStateOfChannel8, _ActivationStateOfChannel8Err := io.ReadBit()
-            if _ActivationStateOfChannel8Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel8' field " + _ActivationStateOfChannel8Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel8)
 
-            // Simple Field (ActivationStateOfChannel9)
-            ActivationStateOfChannel9, _ActivationStateOfChannel9Err := io.ReadBit()
-            if _ActivationStateOfChannel9Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel9' field " + _ActivationStateOfChannel9Err.Error())
+            // Simple Field (converterModeAccordingToTheDaliConverterStateMachine)
+            converterModeAccordingToTheDaliConverterStateMachine, _converterModeAccordingToTheDaliConverterStateMachineErr := io.ReadUint8(4)
+            if _converterModeAccordingToTheDaliConverterStateMachineErr != nil {
+                return nil, errors.New("Error parsing 'converterModeAccordingToTheDaliConverterStateMachine' field " + _converterModeAccordingToTheDaliConverterStateMachineErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel9)
+            _map["Struct"] = values.NewPlcUSINT(converterModeAccordingToTheDaliConverterStateMachine)
 
-            // Simple Field (ActivationStateOfChannel10)
-            ActivationStateOfChannel10, _ActivationStateOfChannel10Err := io.ReadBit()
-            if _ActivationStateOfChannel10Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel10' field " + _ActivationStateOfChannel10Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(2); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel10)
 
-            // Simple Field (ActivationStateOfChannel11)
-            ActivationStateOfChannel11, _ActivationStateOfChannel11Err := io.ReadBit()
-            if _ActivationStateOfChannel11Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel11' field " + _ActivationStateOfChannel11Err.Error())
+            // Simple Field (hardwiredSwitchIsActive)
+            hardwiredSwitchIsActive, _hardwiredSwitchIsActiveErr := io.ReadBit()
+            if _hardwiredSwitchIsActiveErr != nil {
+                return nil, errors.New("Error parsing 'hardwiredSwitchIsActive' field " + _hardwiredSwitchIsActiveErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel11)
+            _map["Struct"] = values.NewPlcBOOL(hardwiredSwitchIsActive)
 
-            // Simple Field (ActivationStateOfChannel12)
-            ActivationStateOfChannel12, _ActivationStateOfChannel12Err := io.ReadBit()
-            if _ActivationStateOfChannel12Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel12' field " + _ActivationStateOfChannel12Err.Error())
+            // Simple Field (hardwiredInhibitIsActive)
+            hardwiredInhibitIsActive, _hardwiredInhibitIsActiveErr := io.ReadBit()
+            if _hardwiredInhibitIsActiveErr != nil {
+                return nil, errors.New("Error parsing 'hardwiredInhibitIsActive' field " + _hardwiredInhibitIsActiveErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel12)
+            _map["Struct"] = values.NewPlcBOOL(hardwiredInhibitIsActive)
 
-            // Simple Field (ActivationStateOfChannel13)
-            ActivationStateOfChannel13, _ActivationStateOfChannel13Err := io.ReadBit()
-            if _ActivationStateOfChannel13Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel13' field " + _ActivationStateOfChannel13Err.Error())
+            // Simple Field (functionTestPending)
+            functionTestPending, _functionTestPendingErr := io.ReadUint8(2)
+            if _functionTestPendingErr != nil {
+                return nil, errors.New("Error parsing 'functionTestPending' field " + _functionTestPendingErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel13)
+            _map["Struct"] = values.NewPlcUSINT(functionTestPending)
 
-            // Simple Field (ActivationStateOfChannel14)
-            ActivationStateOfChannel14, _ActivationStateOfChannel14Err := io.ReadBit()
-            if _ActivationStateOfChannel14Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel14' field " + _ActivationStateOfChannel14Err.Error())
+            // Simple Field (durationTestPending)
+            durationTestPending, _durationTestPendingErr := io.ReadUint8(2)
+            if _durationTestPendingErr != nil {
+                return nil, errors.New("Error parsing 'durationTestPending' field " + _durationTestPendingErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel14)
+            _map["Struct"] = values.NewPlcUSINT(durationTestPending)
 
-            // Simple Field (ActivationStateOfChannel15)
-            ActivationStateOfChannel15, _ActivationStateOfChannel15Err := io.ReadBit()
-            if _ActivationStateOfChannel15Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel15' field " + _ActivationStateOfChannel15Err.Error())
+            // Simple Field (partialDurationTestPending)
+            partialDurationTestPending, _partialDurationTestPendingErr := io.ReadUint8(2)
+            if _partialDurationTestPendingErr != nil {
+                return nil, errors.New("Error parsing 'partialDurationTestPending' field " + _partialDurationTestPendingErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel15)
+            _map["Struct"] = values.NewPlcUSINT(partialDurationTestPending)
 
-            // Simple Field (ActivationStateOfChannel16)
-            ActivationStateOfChannel16, _ActivationStateOfChannel16Err := io.ReadBit()
-            if _ActivationStateOfChannel16Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel16' field " + _ActivationStateOfChannel16Err.Error())
+            // Simple Field (converterFailure)
+            converterFailure, _converterFailureErr := io.ReadUint8(2)
+            if _converterFailureErr != nil {
+                return nil, errors.New("Error parsing 'converterFailure' field " + _converterFailureErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel16)
+            _map["Struct"] = values.NewPlcUSINT(converterFailure)
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_Converter_Test_Result: // Struct
+            _map := map[string]api.PlcValue{}
 
-            // Simple Field (ActivationStateOfChannel17)
-            ActivationStateOfChannel17, _ActivationStateOfChannel17Err := io.ReadBit()
-            if _ActivationStateOfChannel17Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel17' field " + _ActivationStateOfChannel17Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel17)
 
-            // Simple Field (ActivationStateOfChannel18)
-            ActivationStateOfChannel18, _ActivationStateOfChannel18Err := io.ReadBit()
-            if _ActivationStateOfChannel18Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel18' field " + _ActivationStateOfChannel18Err.Error())
+            // Simple Field (ltrf)
+            ltrf, _ltrfErr := io.ReadUint8(4)
+            if _ltrfErr != nil {
+                return nil, errors.New("Error parsing 'ltrf' field " + _ltrfErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel18)
+            _map["Struct"] = values.NewPlcUSINT(ltrf)
 
-            // Simple Field (ActivationStateOfChannel19)
-            ActivationStateOfChannel19, _ActivationStateOfChannel19Err := io.ReadBit()
-            if _ActivationStateOfChannel19Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel19' field " + _ActivationStateOfChannel19Err.Error())
+            // Simple Field (ltrd)
+            ltrd, _ltrdErr := io.ReadUint8(4)
+            if _ltrdErr != nil {
+                return nil, errors.New("Error parsing 'ltrd' field " + _ltrdErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel19)
+            _map["Struct"] = values.NewPlcUSINT(ltrd)
 
-            // Simple Field (ActivationStateOfChannel20)
-            ActivationStateOfChannel20, _ActivationStateOfChannel20Err := io.ReadBit()
-            if _ActivationStateOfChannel20Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel20' field " + _ActivationStateOfChannel20Err.Error())
+            // Simple Field (ltrp)
+            ltrp, _ltrpErr := io.ReadUint8(4)
+            if _ltrpErr != nil {
+                return nil, errors.New("Error parsing 'ltrp' field " + _ltrpErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel20)
+            _map["Struct"] = values.NewPlcUSINT(ltrp)
 
-            // Simple Field (ActivationStateOfChannel21)
-            ActivationStateOfChannel21, _ActivationStateOfChannel21Err := io.ReadBit()
-            if _ActivationStateOfChannel21Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel21' field " + _ActivationStateOfChannel21Err.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel21)
 
-            // Simple Field (ActivationStateOfChannel22)
-            ActivationStateOfChannel22, _ActivationStateOfChannel22Err := io.ReadBit()
-            if _ActivationStateOfChannel22Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel22' field " + _ActivationStateOfChannel22Err.Error())
+            // Simple Field (sf)
+            sf, _sfErr := io.ReadUint8(2)
+            if _sfErr != nil {
+                return nil, errors.New("Error parsing 'sf' field " + _sfErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel22)
+            _map["Struct"] = values.NewPlcUSINT(sf)
 
-            // Simple Field (ActivationStateOfChannel23)
-            ActivationStateOfChannel23, _ActivationStateOfChannel23Err := io.ReadBit()
-            if _ActivationStateOfChannel23Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel23' field " + _ActivationStateOfChannel23Err.Error())
+            // Simple Field (sd)
+            sd, _sdErr := io.ReadUint8(2)
+            if _sdErr != nil {
+                return nil, errors.New("Error parsing 'sd' field " + _sdErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel23)
+            _map["Struct"] = values.NewPlcUSINT(sd)
 
-            // Simple Field (ActivationStateOfChannel24)
-            ActivationStateOfChannel24, _ActivationStateOfChannel24Err := io.ReadBit()
-            if _ActivationStateOfChannel24Err != nil {
-                return nil, errors.New("Error parsing 'ActivationStateOfChannel24' field " + _ActivationStateOfChannel24Err.Error())
+            // Simple Field (sp)
+            sp, _spErr := io.ReadUint8(2)
+            if _spErr != nil {
+                return nil, errors.New("Error parsing 'sp' field " + _spErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(ActivationStateOfChannel24)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_HVACModeNext: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcUSINT(sp)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(2); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (DelayTimeMin)
-            DelayTimeMin, _DelayTimeMinErr := io.ReadUint16(16)
-            if _DelayTimeMinErr != nil {
-                return nil, errors.New("Error parsing 'DelayTimeMin' field " + _DelayTimeMinErr.Error())
+            // Simple Field (ldtr)
+            ldtr, _ldtrErr := io.ReadUint16(16)
+            if _ldtrErr != nil {
+                return nil, errors.New("Error parsing 'ldtr' field " + _ldtrErr.Error())
             }
-            _map["Struct"] = values.NewPlcUINT(DelayTimeMin)
+            _map["Struct"] = values.NewPlcUINT(ldtr)
 
-            // Simple Field (HvacMode)
-            HvacMode, _HvacModeErr := io.ReadUint8(8)
-            if _HvacModeErr != nil {
-                return nil, errors.New("Error parsing 'HvacMode' field " + _HvacModeErr.Error())
+            // Simple Field (lpdtr)
+            lpdtr, _lpdtrErr := io.ReadUint8(8)
+            if _lpdtrErr != nil {
+                return nil, errors.New("Error parsing 'lpdtr' field " + _lpdtrErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(HvacMode)
+            _map["Struct"] = values.NewPlcUSINT(lpdtr)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_DHWModeNext: // Struct
+        case datapointType == KnxDatapointType_DPT_Battery_Info: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(5); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (DelayTimeMin)
-            DelayTimeMin, _DelayTimeMinErr := io.ReadUint16(16)
-            if _DelayTimeMinErr != nil {
-                return nil, errors.New("Error parsing 'DelayTimeMin' field " + _DelayTimeMinErr.Error())
-            }
-            _map["Struct"] = values.NewPlcUINT(DelayTimeMin)
-
-            // Simple Field (DhwMode)
-            DhwMode, _DhwModeErr := io.ReadUint8(8)
-            if _DhwModeErr != nil {
-                return nil, errors.New("Error parsing 'DhwMode' field " + _DhwModeErr.Error())
+            // Simple Field (batteryFailure)
+            batteryFailure, _batteryFailureErr := io.ReadBit()
+            if _batteryFailureErr != nil {
+                return nil, errors.New("Error parsing 'batteryFailure' field " + _batteryFailureErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(DhwMode)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_OccModeNext: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcBOOL(batteryFailure)
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (batteryDurationFailure)
+            batteryDurationFailure, _batteryDurationFailureErr := io.ReadBit()
+            if _batteryDurationFailureErr != nil {
+                return nil, errors.New("Error parsing 'batteryDurationFailure' field " + _batteryDurationFailureErr.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(batteryDurationFailure)
 
-            // Simple Field (DelayTimeMin)
-            DelayTimeMin, _DelayTimeMinErr := io.ReadUint16(16)
-            if _DelayTimeMinErr != nil {
-                return nil, errors.New("Error parsing 'DelayTimeMin' field " + _DelayTimeMinErr.Error())
+            // Simple Field (batteryFullyCharged)
+            batteryFullyCharged, _batteryFullyChargedErr := io.ReadBit()
+            if _batteryFullyChargedErr != nil {
+                return nil, errors.New("Error parsing 'batteryFullyCharged' field " + _batteryFullyChargedErr.Error())
             }
-            _map["Struct"] = values.NewPlcUINT(DelayTimeMin)
+            _map["Struct"] = values.NewPlcBOOL(batteryFullyCharged)
 
-            // Simple Field (OccupancyMode)
-            OccupancyMode, _OccupancyModeErr := io.ReadUint8(8)
-            if _OccupancyModeErr != nil {
-                return nil, errors.New("Error parsing 'OccupancyMode' field " + _OccupancyModeErr.Error())
+            // Simple Field (batteryChargeLevel)
+            batteryChargeLevel, _batteryChargeLevelErr := io.ReadUint8(8)
+            if _batteryChargeLevelErr != nil {
+                return nil, errors.New("Error parsing 'batteryChargeLevel' field " + _batteryChargeLevelErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(OccupancyMode)
+            _map["Struct"] = values.NewPlcUSINT(batteryChargeLevel)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_BuildingModeNext: // Struct
+        case datapointType == KnxDatapointType_DPT_Brightness_Colour_Temperature_Transition: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4755,145 +6391,114 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (DelayTimeMin)
-            DelayTimeMin, _DelayTimeMinErr := io.ReadUint16(16)
-            if _DelayTimeMinErr != nil {
-                return nil, errors.New("Error parsing 'DelayTimeMin' field " + _DelayTimeMinErr.Error())
+            // Simple Field (ms)
+            ms, _msErr := io.ReadUint16(16)
+            if _msErr != nil {
+                return nil, errors.New("Error parsing 'ms' field " + _msErr.Error())
             }
-            _map["Struct"] = values.NewPlcUINT(DelayTimeMin)
+            _map["Struct"] = values.NewPlcUINT(ms)
 
-            // Simple Field (BuildingMode)
-            BuildingMode, _BuildingModeErr := io.ReadUint8(8)
-            if _BuildingModeErr != nil {
-                return nil, errors.New("Error parsing 'BuildingMode' field " + _BuildingModeErr.Error())
+            // Simple Field (temperatureK)
+            temperatureK, _temperatureKErr := io.ReadUint16(16)
+            if _temperatureKErr != nil {
+                return nil, errors.New("Error parsing 'temperatureK' field " + _temperatureKErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(BuildingMode)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Version: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcUINT(temperatureK)
+
+            // Simple Field (percent)
+            percent, _percentErr := io.ReadUint8(8)
+            if _percentErr != nil {
+                return nil, errors.New("Error parsing 'percent' field " + _percentErr.Error())
+            }
+            _map["Struct"] = values.NewPlcUSINT(percent)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(5); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (MagicNumber)
-            MagicNumber, _MagicNumberErr := io.ReadUint8(5)
-            if _MagicNumberErr != nil {
-                return nil, errors.New("Error parsing 'MagicNumber' field " + _MagicNumberErr.Error())
+            // Simple Field (validityOfTheTimePeriod)
+            validityOfTheTimePeriod, _validityOfTheTimePeriodErr := io.ReadBit()
+            if _validityOfTheTimePeriodErr != nil {
+                return nil, errors.New("Error parsing 'validityOfTheTimePeriod' field " + _validityOfTheTimePeriodErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(MagicNumber)
+            _map["Struct"] = values.NewPlcBOOL(validityOfTheTimePeriod)
 
-            // Simple Field (VersionNumber)
-            VersionNumber, _VersionNumberErr := io.ReadUint8(5)
-            if _VersionNumberErr != nil {
-                return nil, errors.New("Error parsing 'VersionNumber' field " + _VersionNumberErr.Error())
+            // Simple Field (validityOfTheAbsoluteColourTemperature)
+            validityOfTheAbsoluteColourTemperature, _validityOfTheAbsoluteColourTemperatureErr := io.ReadBit()
+            if _validityOfTheAbsoluteColourTemperatureErr != nil {
+                return nil, errors.New("Error parsing 'validityOfTheAbsoluteColourTemperature' field " + _validityOfTheAbsoluteColourTemperatureErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(VersionNumber)
+            _map["Struct"] = values.NewPlcBOOL(validityOfTheAbsoluteColourTemperature)
 
-            // Simple Field (RevisionNumber)
-            RevisionNumber, _RevisionNumberErr := io.ReadUint8(6)
-            if _RevisionNumberErr != nil {
-                return nil, errors.New("Error parsing 'RevisionNumber' field " + _RevisionNumberErr.Error())
+            // Simple Field (validityOfTheAbsoluteBrightness)
+            validityOfTheAbsoluteBrightness, _validityOfTheAbsoluteBrightnessErr := io.ReadBit()
+            if _validityOfTheAbsoluteBrightnessErr != nil {
+                return nil, errors.New("Error parsing 'validityOfTheAbsoluteBrightness' field " + _validityOfTheAbsoluteBrightnessErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(RevisionNumber)
+            _map["Struct"] = values.NewPlcBOOL(validityOfTheAbsoluteBrightness)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_AlarmInfo: // Struct
+        case datapointType == KnxDatapointType_DPT_Brightness_Colour_Temperature_Control: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (LogNumber)
-            LogNumber, _LogNumberErr := io.ReadUint8(8)
-            if _LogNumberErr != nil {
-                return nil, errors.New("Error parsing 'LogNumber' field " + _LogNumberErr.Error())
-            }
-            _map["Struct"] = values.NewPlcUSINT(LogNumber)
-
-            // Simple Field (AlarmPriority)
-            AlarmPriority, _AlarmPriorityErr := io.ReadUint8(8)
-            if _AlarmPriorityErr != nil {
-                return nil, errors.New("Error parsing 'AlarmPriority' field " + _AlarmPriorityErr.Error())
+            // Simple Field (cct)
+            cct, _cctErr := io.ReadBit()
+            if _cctErr != nil {
+                return nil, errors.New("Error parsing 'cct' field " + _cctErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(AlarmPriority)
+            _map["Struct"] = values.NewPlcBOOL(cct)
 
-            // Simple Field (ApplicationArea)
-            ApplicationArea, _ApplicationAreaErr := io.ReadUint8(8)
-            if _ApplicationAreaErr != nil {
-                return nil, errors.New("Error parsing 'ApplicationArea' field " + _ApplicationAreaErr.Error())
+            // Simple Field (stepCodeColourTemperature)
+            stepCodeColourTemperature, _stepCodeColourTemperatureErr := io.ReadUint8(3)
+            if _stepCodeColourTemperatureErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourTemperature' field " + _stepCodeColourTemperatureErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(ApplicationArea)
-
-            // Simple Field (ErrorClass)
-            ErrorClass, _ErrorClassErr := io.ReadUint8(8)
-            if _ErrorClassErr != nil {
-                return nil, errors.New("Error parsing 'ErrorClass' field " + _ErrorClassErr.Error())
-            }
-            _map["Struct"] = values.NewPlcUSINT(ErrorClass)
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourTemperature)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (ErrorcodeSup)
-            ErrorcodeSup, _ErrorcodeSupErr := io.ReadBit()
-            if _ErrorcodeSupErr != nil {
-                return nil, errors.New("Error parsing 'ErrorcodeSup' field " + _ErrorcodeSupErr.Error())
-            }
-            _map["Struct"] = values.NewPlcBOOL(ErrorcodeSup)
-
-            // Simple Field (AlarmtextSup)
-            AlarmtextSup, _AlarmtextSupErr := io.ReadBit()
-            if _AlarmtextSupErr != nil {
-                return nil, errors.New("Error parsing 'AlarmtextSup' field " + _AlarmtextSupErr.Error())
+            // Simple Field (cb)
+            cb, _cbErr := io.ReadBit()
+            if _cbErr != nil {
+                return nil, errors.New("Error parsing 'cb' field " + _cbErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(AlarmtextSup)
+            _map["Struct"] = values.NewPlcBOOL(cb)
 
-            // Simple Field (TimestampSup)
-            TimestampSup, _TimestampSupErr := io.ReadBit()
-            if _TimestampSupErr != nil {
-                return nil, errors.New("Error parsing 'TimestampSup' field " + _TimestampSupErr.Error())
+            // Simple Field (stepCodeBrightness)
+            stepCodeBrightness, _stepCodeBrightnessErr := io.ReadUint8(3)
+            if _stepCodeBrightnessErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeBrightness' field " + _stepCodeBrightnessErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(TimestampSup)
-
-            // Simple Field (AckSup)
-            AckSup, _AckSupErr := io.ReadBit()
-            if _AckSupErr != nil {
-                return nil, errors.New("Error parsing 'AckSup' field " + _AckSupErr.Error())
-            }
-            _map["Struct"] = values.NewPlcBOOL(AckSup)
+            _map["Struct"] = values.NewPlcUSINT(stepCodeBrightness)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(5); _err != nil {
+            if _, _err := io.ReadUint8(6); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Locked)
-            Locked, _LockedErr := io.ReadBit()
-            if _LockedErr != nil {
-                return nil, errors.New("Error parsing 'Locked' field " + _LockedErr.Error())
+            // Simple Field (cctAndStepCodeColourValidity)
+            cctAndStepCodeColourValidity, _cctAndStepCodeColourValidityErr := io.ReadBit()
+            if _cctAndStepCodeColourValidityErr != nil {
+                return nil, errors.New("Error parsing 'cctAndStepCodeColourValidity' field " + _cctAndStepCodeColourValidityErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Locked)
+            _map["Struct"] = values.NewPlcBOOL(cctAndStepCodeColourValidity)
 
-            // Simple Field (Alarmunack)
-            Alarmunack, _AlarmunackErr := io.ReadBit()
-            if _AlarmunackErr != nil {
-                return nil, errors.New("Error parsing 'Alarmunack' field " + _AlarmunackErr.Error())
+            // Simple Field (cbAndStepCodeBrightnessValidity)
+            cbAndStepCodeBrightnessValidity, _cbAndStepCodeBrightnessValidityErr := io.ReadBit()
+            if _cbAndStepCodeBrightnessValidityErr != nil {
+                return nil, errors.New("Error parsing 'cbAndStepCodeBrightnessValidity' field " + _cbAndStepCodeBrightnessValidityErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Alarmunack)
-
-            // Simple Field (Inalarm)
-            Inalarm, _InalarmErr := io.ReadBit()
-            if _InalarmErr != nil {
-                return nil, errors.New("Error parsing 'Inalarm' field " + _InalarmErr.Error())
-            }
-            _map["Struct"] = values.NewPlcBOOL(Inalarm)
+            _map["Struct"] = values.NewPlcBOOL(cbAndStepCodeBrightnessValidity)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_TempRoomSetpSetF16_3: // Struct
+        case datapointType == KnxDatapointType_DPT_Colour_RGBW: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4901,79 +6506,73 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Tempsetpcomf)
-            Tempsetpcomf, _TempsetpcomfErr := io.ReadFloat32(true, 4, 11)
-            if _TempsetpcomfErr != nil {
-                return nil, errors.New("Error parsing 'Tempsetpcomf' field " + _TempsetpcomfErr.Error())
+            // Simple Field (colourLevelRed)
+            colourLevelRed, _colourLevelRedErr := io.ReadUint8(8)
+            if _colourLevelRedErr != nil {
+                return nil, errors.New("Error parsing 'colourLevelRed' field " + _colourLevelRedErr.Error())
             }
-            _map["Struct"] = values.NewPlcREAL(Tempsetpcomf)
+            _map["Struct"] = values.NewPlcUSINT(colourLevelRed)
 
-            // Simple Field (Tempsetpstdby)
-            Tempsetpstdby, _TempsetpstdbyErr := io.ReadFloat32(true, 4, 11)
-            if _TempsetpstdbyErr != nil {
-                return nil, errors.New("Error parsing 'Tempsetpstdby' field " + _TempsetpstdbyErr.Error())
+            // Simple Field (colourLevelGreen)
+            colourLevelGreen, _colourLevelGreenErr := io.ReadUint8(8)
+            if _colourLevelGreenErr != nil {
+                return nil, errors.New("Error parsing 'colourLevelGreen' field " + _colourLevelGreenErr.Error())
             }
-            _map["Struct"] = values.NewPlcREAL(Tempsetpstdby)
+            _map["Struct"] = values.NewPlcUSINT(colourLevelGreen)
 
-            // Simple Field (Tempsetpeco)
-            Tempsetpeco, _TempsetpecoErr := io.ReadFloat32(true, 4, 11)
-            if _TempsetpecoErr != nil {
-                return nil, errors.New("Error parsing 'Tempsetpeco' field " + _TempsetpecoErr.Error())
+            // Simple Field (colourLevelBlue)
+            colourLevelBlue, _colourLevelBlueErr := io.ReadUint8(8)
+            if _colourLevelBlueErr != nil {
+                return nil, errors.New("Error parsing 'colourLevelBlue' field " + _colourLevelBlueErr.Error())
             }
-            _map["Struct"] = values.NewPlcREAL(Tempsetpeco)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_TempRoomSetpSetShiftF16_3: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcUSINT(colourLevelBlue)
+
+            // Simple Field (colourLevelWhite)
+            colourLevelWhite, _colourLevelWhiteErr := io.ReadUint8(8)
+            if _colourLevelWhiteErr != nil {
+                return nil, errors.New("Error parsing 'colourLevelWhite' field " + _colourLevelWhiteErr.Error())
+            }
+            _map["Struct"] = values.NewPlcUSINT(colourLevelWhite)
 
             // Reserved Field (Just skip the bytes)
             if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Tempsetpshiftcomf)
-            Tempsetpshiftcomf, _TempsetpshiftcomfErr := io.ReadFloat32(true, 4, 11)
-            if _TempsetpshiftcomfErr != nil {
-                return nil, errors.New("Error parsing 'Tempsetpshiftcomf' field " + _TempsetpshiftcomfErr.Error())
-            }
-            _map["Struct"] = values.NewPlcREAL(Tempsetpshiftcomf)
-
-            // Simple Field (Tempsetpshiftstdby)
-            Tempsetpshiftstdby, _TempsetpshiftstdbyErr := io.ReadFloat32(true, 4, 11)
-            if _TempsetpshiftstdbyErr != nil {
-                return nil, errors.New("Error parsing 'Tempsetpshiftstdby' field " + _TempsetpshiftstdbyErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcREAL(Tempsetpshiftstdby)
 
-            // Simple Field (Tempsetpshifteco)
-            Tempsetpshifteco, _TempsetpshiftecoErr := io.ReadFloat32(true, 4, 11)
-            if _TempsetpshiftecoErr != nil {
-                return nil, errors.New("Error parsing 'Tempsetpshifteco' field " + _TempsetpshiftecoErr.Error())
+            // Simple Field (mr)
+            mr, _mrErr := io.ReadBit()
+            if _mrErr != nil {
+                return nil, errors.New("Error parsing 'mr' field " + _mrErr.Error())
             }
-            _map["Struct"] = values.NewPlcREAL(Tempsetpshifteco)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Scaling_Speed: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcBOOL(mr)
 
-            // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
-                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            // Simple Field (mg)
+            mg, _mgErr := io.ReadBit()
+            if _mgErr != nil {
+                return nil, errors.New("Error parsing 'mg' field " + _mgErr.Error())
             }
+            _map["Struct"] = values.NewPlcBOOL(mg)
 
-            // Simple Field (TimePeriod)
-            TimePeriod, _TimePeriodErr := io.ReadUint16(16)
-            if _TimePeriodErr != nil {
-                return nil, errors.New("Error parsing 'TimePeriod' field " + _TimePeriodErr.Error())
+            // Simple Field (mb)
+            mb, _mbErr := io.ReadBit()
+            if _mbErr != nil {
+                return nil, errors.New("Error parsing 'mb' field " + _mbErr.Error())
             }
-            _map["Struct"] = values.NewPlcUINT(TimePeriod)
+            _map["Struct"] = values.NewPlcBOOL(mb)
 
-            // Simple Field (Percent)
-            Percent, _PercentErr := io.ReadUint8(8)
-            if _PercentErr != nil {
-                return nil, errors.New("Error parsing 'Percent' field " + _PercentErr.Error())
+            // Simple Field (mw)
+            mw, _mwErr := io.ReadBit()
+            if _mwErr != nil {
+                return nil, errors.New("Error parsing 'mw' field " + _mwErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Percent)
+            _map["Struct"] = values.NewPlcBOOL(mw)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Scaling_Step_Time: // Struct
+        case datapointType == KnxDatapointType_DPT_Relative_Control_RGBW: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -4981,119 +6580,116 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (TimePeriod)
-            TimePeriod, _TimePeriodErr := io.ReadUint16(16)
-            if _TimePeriodErr != nil {
-                return nil, errors.New("Error parsing 'TimePeriod' field " + _TimePeriodErr.Error())
+            // Simple Field (maskcw)
+            maskcw, _maskcwErr := io.ReadBit()
+            if _maskcwErr != nil {
+                return nil, errors.New("Error parsing 'maskcw' field " + _maskcwErr.Error())
             }
-            _map["Struct"] = values.NewPlcUINT(TimePeriod)
+            _map["Struct"] = values.NewPlcBOOL(maskcw)
 
-            // Simple Field (Percent)
-            Percent, _PercentErr := io.ReadUint8(8)
-            if _PercentErr != nil {
-                return nil, errors.New("Error parsing 'Percent' field " + _PercentErr.Error())
+            // Simple Field (maskcb)
+            maskcb, _maskcbErr := io.ReadBit()
+            if _maskcbErr != nil {
+                return nil, errors.New("Error parsing 'maskcb' field " + _maskcbErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Percent)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_MeteringValue: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcBOOL(maskcb)
+
+            // Simple Field (maskcg)
+            maskcg, _maskcgErr := io.ReadBit()
+            if _maskcgErr != nil {
+                return nil, errors.New("Error parsing 'maskcg' field " + _maskcgErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskcg)
+
+            // Simple Field (maskcr)
+            maskcr, _maskcrErr := io.ReadBit()
+            if _maskcrErr != nil {
+                return nil, errors.New("Error parsing 'maskcr' field " + _maskcrErr.Error())
+            }
+            _map["Struct"] = values.NewPlcBOOL(maskcr)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Countval)
-            Countval, _CountvalErr := io.ReadInt32(32)
-            if _CountvalErr != nil {
-                return nil, errors.New("Error parsing 'Countval' field " + _CountvalErr.Error())
+            // Simple Field (cw)
+            cw, _cwErr := io.ReadBit()
+            if _cwErr != nil {
+                return nil, errors.New("Error parsing 'cw' field " + _cwErr.Error())
             }
-            _map["Struct"] = values.NewPlcDINT(Countval)
+            _map["Struct"] = values.NewPlcBOOL(cw)
 
-            // Simple Field (Valinffield)
-            Valinffield, _ValinffieldErr := io.ReadUint8(8)
-            if _ValinffieldErr != nil {
-                return nil, errors.New("Error parsing 'Valinffield' field " + _ValinffieldErr.Error())
+            // Simple Field (stepCodeColourWhite)
+            stepCodeColourWhite, _stepCodeColourWhiteErr := io.ReadUint8(3)
+            if _stepCodeColourWhiteErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourWhite' field " + _stepCodeColourWhiteErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Valinffield)
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourWhite)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(3); _err != nil {
+            if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Alarmunack)
-            Alarmunack, _AlarmunackErr := io.ReadBit()
-            if _AlarmunackErr != nil {
-                return nil, errors.New("Error parsing 'Alarmunack' field " + _AlarmunackErr.Error())
+            // Simple Field (cb)
+            cb, _cbErr := io.ReadBit()
+            if _cbErr != nil {
+                return nil, errors.New("Error parsing 'cb' field " + _cbErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Alarmunack)
+            _map["Struct"] = values.NewPlcBOOL(cb)
 
-            // Simple Field (Inalarm)
-            Inalarm, _InalarmErr := io.ReadBit()
-            if _InalarmErr != nil {
-                return nil, errors.New("Error parsing 'Inalarm' field " + _InalarmErr.Error())
+            // Simple Field (stepCodeColourBlue)
+            stepCodeColourBlue, _stepCodeColourBlueErr := io.ReadUint8(3)
+            if _stepCodeColourBlueErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourBlue' field " + _stepCodeColourBlueErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Inalarm)
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourBlue)
 
-            // Simple Field (Overridden)
-            Overridden, _OverriddenErr := io.ReadBit()
-            if _OverriddenErr != nil {
-                return nil, errors.New("Error parsing 'Overridden' field " + _OverriddenErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Overridden)
 
-            // Simple Field (Fault)
-            Fault, _FaultErr := io.ReadBit()
-            if _FaultErr != nil {
-                return nil, errors.New("Error parsing 'Fault' field " + _FaultErr.Error())
+            // Simple Field (cg)
+            cg, _cgErr := io.ReadBit()
+            if _cgErr != nil {
+                return nil, errors.New("Error parsing 'cg' field " + _cgErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Fault)
+            _map["Struct"] = values.NewPlcBOOL(cg)
 
-            // Simple Field (Outofservice)
-            Outofservice, _OutofserviceErr := io.ReadBit()
-            if _OutofserviceErr != nil {
-                return nil, errors.New("Error parsing 'Outofservice' field " + _OutofserviceErr.Error())
+            // Simple Field (stepCodeColourGreen)
+            stepCodeColourGreen, _stepCodeColourGreenErr := io.ReadUint8(3)
+            if _stepCodeColourGreenErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourGreen' field " + _stepCodeColourGreenErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Outofservice)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_MBus_Address: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourGreen)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Manufactid)
-            Manufactid, _ManufactidErr := io.ReadUint16(16)
-            if _ManufactidErr != nil {
-                return nil, errors.New("Error parsing 'Manufactid' field " + _ManufactidErr.Error())
-            }
-            _map["Struct"] = values.NewPlcUINT(Manufactid)
-
-            // Simple Field (Identnumber)
-            Identnumber, _IdentnumberErr := io.ReadUint32(32)
-            if _IdentnumberErr != nil {
-                return nil, errors.New("Error parsing 'Identnumber' field " + _IdentnumberErr.Error())
+            // Simple Field (cr)
+            cr, _crErr := io.ReadBit()
+            if _crErr != nil {
+                return nil, errors.New("Error parsing 'cr' field " + _crErr.Error())
             }
-            _map["Struct"] = values.NewPlcUDINT(Identnumber)
+            _map["Struct"] = values.NewPlcBOOL(cr)
 
-            // Simple Field (Version)
-            Version, _VersionErr := io.ReadUint8(8)
-            if _VersionErr != nil {
-                return nil, errors.New("Error parsing 'Version' field " + _VersionErr.Error())
+            // Simple Field (stepCodeColourRed)
+            stepCodeColourRed, _stepCodeColourRedErr := io.ReadUint8(3)
+            if _stepCodeColourRedErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourRed' field " + _stepCodeColourRedErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Version)
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourRed)
 
-            // Simple Field (Medium)
-            Medium, _MediumErr := io.ReadUint8(8)
-            if _MediumErr != nil {
-                return nil, errors.New("Error parsing 'Medium' field " + _MediumErr.Error())
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Medium)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Colour_RGB: // Struct
+        case datapointType == KnxDatapointType_DPT_Relative_Control_RGB: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -5101,82 +6697,86 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (R)
-            R, _RErr := io.ReadUint8(8)
-            if _RErr != nil {
-                return nil, errors.New("Error parsing 'R' field " + _RErr.Error())
-            }
-            _map["Struct"] = values.NewPlcUSINT(R)
-
-            // Simple Field (G)
-            G, _GErr := io.ReadUint8(8)
-            if _GErr != nil {
-                return nil, errors.New("Error parsing 'G' field " + _GErr.Error())
+            // Simple Field (cb)
+            cb, _cbErr := io.ReadBit()
+            if _cbErr != nil {
+                return nil, errors.New("Error parsing 'cb' field " + _cbErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(G)
+            _map["Struct"] = values.NewPlcBOOL(cb)
 
-            // Simple Field (B)
-            B, _BErr := io.ReadUint8(8)
-            if _BErr != nil {
-                return nil, errors.New("Error parsing 'B' field " + _BErr.Error())
+            // Simple Field (stepCodeColourBlue)
+            stepCodeColourBlue, _stepCodeColourBlueErr := io.ReadUint8(3)
+            if _stepCodeColourBlueErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourBlue' field " + _stepCodeColourBlueErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(B)
-            return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_LanguageCodeAlpha2_ASCII: // STRING
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourBlue)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (value)
-            value, _valueErr := io.ReadString(16)
-            if _valueErr != nil {
-                return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+            // Simple Field (cg)
+            cg, _cgErr := io.ReadBit()
+            if _cgErr != nil {
+                return nil, errors.New("Error parsing 'cg' field " + _cgErr.Error())
             }
-            return values.NewPlcSTRING(value), nil
-        case datapointType == KnxDatapointType.DPT_Tariff_ActiveEnergy: // Struct
-            _map := map[string]api.PlcValue{}
+            _map["Struct"] = values.NewPlcBOOL(cg)
+
+            // Simple Field (stepCodeColourGreen)
+            stepCodeColourGreen, _stepCodeColourGreenErr := io.ReadUint8(3)
+            if _stepCodeColourGreenErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourGreen' field " + _stepCodeColourGreenErr.Error())
+            }
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourGreen)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(8); _err != nil {
+            if _, _err := io.ReadUint8(4); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Activeelectricalenergy)
-            Activeelectricalenergy, _ActiveelectricalenergyErr := io.ReadInt32(32)
-            if _ActiveelectricalenergyErr != nil {
-                return nil, errors.New("Error parsing 'Activeelectricalenergy' field " + _ActiveelectricalenergyErr.Error())
+            // Simple Field (cr)
+            cr, _crErr := io.ReadBit()
+            if _crErr != nil {
+                return nil, errors.New("Error parsing 'cr' field " + _crErr.Error())
             }
-            _map["Struct"] = values.NewPlcDINT(Activeelectricalenergy)
+            _map["Struct"] = values.NewPlcBOOL(cr)
 
-            // Simple Field (Tariff)
-            Tariff, _TariffErr := io.ReadUint8(8)
-            if _TariffErr != nil {
-                return nil, errors.New("Error parsing 'Tariff' field " + _TariffErr.Error())
+            // Simple Field (stepCodeColourRed)
+            stepCodeColourRed, _stepCodeColourRedErr := io.ReadUint8(3)
+            if _stepCodeColourRedErr != nil {
+                return nil, errors.New("Error parsing 'stepCodeColourRed' field " + _stepCodeColourRedErr.Error())
             }
-            _map["Struct"] = values.NewPlcUSINT(Tariff)
+            _map["Struct"] = values.NewPlcUSINT(stepCodeColourRed)
 
             // Reserved Field (Just skip the bytes)
-            if _, _err := io.ReadUint8(6); _err != nil {
+            if _, _err := io.ReadUint8(4); _err != nil {
+                return nil, errors.New("Error parsing reserved field " + _err.Error())
+            }
+            return values.NewPlcStruct(_map), nil
+        case datapointType == KnxDatapointType_DPT_GeographicalLocation: // Struct
+            _map := map[string]api.PlcValue{}
+
+            // Reserved Field (Just skip the bytes)
+            if _, _err := io.ReadUint8(8); _err != nil {
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (Electricalengergyvalidity)
-            Electricalengergyvalidity, _ElectricalengergyvalidityErr := io.ReadBit()
-            if _ElectricalengergyvalidityErr != nil {
-                return nil, errors.New("Error parsing 'Electricalengergyvalidity' field " + _ElectricalengergyvalidityErr.Error())
+            // Simple Field (longitude)
+            longitude, _longitudeErr := io.ReadFloat32(true, 8, 23)
+            if _longitudeErr != nil {
+                return nil, errors.New("Error parsing 'longitude' field " + _longitudeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Electricalengergyvalidity)
+            _map["Struct"] = values.NewPlcREAL(longitude)
 
-            // Simple Field (Tariffvalidity)
-            Tariffvalidity, _TariffvalidityErr := io.ReadBit()
-            if _TariffvalidityErr != nil {
-                return nil, errors.New("Error parsing 'Tariffvalidity' field " + _TariffvalidityErr.Error())
+            // Simple Field (latitude)
+            latitude, _latitudeErr := io.ReadFloat32(true, 8, 23)
+            if _latitudeErr != nil {
+                return nil, errors.New("Error parsing 'latitude' field " + _latitudeErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(Tariffvalidity)
+            _map["Struct"] = values.NewPlcREAL(latitude)
             return values.NewPlcStruct(_map), nil
-        case datapointType == KnxDatapointType.DPT_Prioritised_Mode_Control: // Struct
+        case datapointType == KnxDatapointType_DPT_TempRoomSetpSetF16_4: // Struct
             _map := map[string]api.PlcValue{}
 
             // Reserved Field (Just skip the bytes)
@@ -5184,1500 +6784,1273 @@ func KnxDatapointParse(io *utils.ReadBuffer, datapointType IKnxDatapointType) (a
                 return nil, errors.New("Error parsing reserved field " + _err.Error())
             }
 
-            // Simple Field (DeactivationOfPriority)
-            DeactivationOfPriority, _DeactivationOfPriorityErr := io.ReadBit()
-            if _DeactivationOfPriorityErr != nil {
-                return nil, errors.New("Error parsing 'DeactivationOfPriority' field " + _DeactivationOfPriorityErr.Error())
+            // Simple Field (roomTemperatureSetpointComfort)
+            roomTemperatureSetpointComfort, _roomTemperatureSetpointComfortErr := io.ReadFloat32(true, 4, 11)
+            if _roomTemperatureSetpointComfortErr != nil {
+                return nil, errors.New("Error parsing 'roomTemperatureSetpointComfort' field " + _roomTemperatureSetpointComfortErr.Error())
+            }
+            _map["Struct"] = values.NewPlcREAL(roomTemperatureSetpointComfort)
+
+            // Simple Field (roomTemperatureSetpointStandby)
+            roomTemperatureSetpointStandby, _roomTemperatureSetpointStandbyErr := io.ReadFloat32(true, 4, 11)
+            if _roomTemperatureSetpointStandbyErr != nil {
+                return nil, errors.New("Error parsing 'roomTemperatureSetpointStandby' field " + _roomTemperatureSetpointStandbyErr.Error())
             }
-            _map["Struct"] = values.NewPlcBOOL(DeactivationOfPriority)
+            _map["Struct"] = values.NewPlcREAL(roomTemperatureSetpointStandby)
 
-            // Simple Field (PriorityLevel)
-            PriorityLevel, _PriorityLevelErr := io.ReadUint8(3)
-            if _PriorityLevelErr != nil {
-                return nil, errors.New("Error parsing 'PriorityLevel' field " + _PriorityLevelErr.Error())
+            // Simple Field (roomTemperatureSetpointEconomy)
... 17013 lines suppressed ...


[plc4x] 06/07: - Updated generated Go code

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

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

commit 5e874e50ec254e7c85e63404981807a245395a0f
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 24 12:58:09 2021 +0100

    - Updated generated Go code
---
 plc4go/cmd/main/drivers/knxnetip_test.go           |     2 -
 .../plc4go/bacnetip/readwrite/ParserHelper.go      |     2 +-
 .../plc4go/bacnetip/readwrite/XmlParserHelper.go   |     2 +-
 .../plc4go/knxnetip/KnxNetIpActiveReader.go        |    67 +
 plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go |    10 +-
 .../internal/plc4go/knxnetip/KnxNetIpConnection.go |  1042 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpField.go   |    16 +-
 .../plc4go/knxnetip/KnxNetIpFieldHandler.go        |    16 +-
 .../plc4go/knxnetip/KnxNetIpMessageCodec.go        |     3 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go  |   125 +-
 .../internal/plc4go/knxnetip/KnxNetIpSubscriber.go |    55 +-
 .../plc4go/knxnetip/readwrite/ParserHelper.go      |   142 +-
 .../plc4go/knxnetip/readwrite/XmlParserHelper.go   |   378 +-
 .../plc4go/knxnetip/readwrite/model/APCI.go        |   193 -
 .../plc4go/knxnetip/readwrite/model/Apdu.go        |   286 +
 .../plc4go/knxnetip/readwrite/model/ApduControl.go |   236 +
 .../model/{LDataFrameAck.go => ApduControlAck.go}  |    68 +-
 .../{LDataFrameAck.go => ApduControlConnect.go}    |    68 +-
 .../readwrite/model/ApduControlContainer.go        |   166 +
 .../{LDataFrameAck.go => ApduControlDisconnect.go} |    68 +-
 .../model/{LDataFrameAck.go => ApduControlNack.go} |    68 +-
 .../plc4go/knxnetip/readwrite/model/ApduData.go    |   404 +
 .../model/{LDataFrameAck.go => ApduDataAdcRead.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataAdcResponse.go}   |    68 +-
 .../knxnetip/readwrite/model/ApduDataContainer.go  |   166 +
 ...FrameAck.go => ApduDataDeviceDescriptorRead.go} |    68 +-
 ...eAck.go => ApduDataDeviceDescriptorResponse.go} |    68 +-
 .../plc4go/knxnetip/readwrite/model/ApduDataExt.go |   754 ++
 ...aFrameAck.go => ApduDataExtAuthorizeRequest.go} |    68 +-
 ...FrameAck.go => ApduDataExtAuthorizeResponse.go} |    68 +-
 ...FrameAck.go => ApduDataExtDomainAddressRead.go} |    68 +-
 ...eAck.go => ApduDataExtDomainAddressResponse.go} |    68 +-
 ...go => ApduDataExtDomainAddressSelectiveRead.go} |    68 +-
 ...=> ApduDataExtDomainAddressSerialNumberRead.go} |    68 +-
 ...pduDataExtDomainAddressSerialNumberResponse.go} |    68 +-
 ...> ApduDataExtDomainAddressSerialNumberWrite.go} |    68 +-
 ...rameAck.go => ApduDataExtDomainAddressWrite.go} |    68 +-
 ...meAck.go => ApduDataExtFileStreamInfoReport.go} |    68 +-
 ... => ApduDataExtGroupPropertyValueInfoReport.go} |    68 +-
 ...Ack.go => ApduDataExtGroupPropertyValueRead.go} |    68 +-
 ...go => ApduDataExtGroupPropertyValueResponse.go} |    68 +-
 ...ck.go => ApduDataExtGroupPropertyValueWrite.go} |    68 +-
 ...pduDataExtIndividualAddressSerialNumberRead.go} |    68 +-
 ...ataExtIndividualAddressSerialNumberResponse.go} |    68 +-
 ...duDataExtIndividualAddressSerialNumberWrite.go} |    68 +-
 ...{LDataFrameAck.go => ApduDataExtKeyResponse.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataExtKeyWrite.go}   |    68 +-
 .../{LDataFrameAck.go => ApduDataExtLinkRead.go}   |    68 +-
 ...LDataFrameAck.go => ApduDataExtLinkResponse.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataExtLinkWrite.go}  |    68 +-
 ...ataFrameAck.go => ApduDataExtMemoryBitWrite.go} |    68 +-
 ...meAck.go => ApduDataExtNetworkParameterRead.go} |    68 +-
 ...k.go => ApduDataExtNetworkParameterResponse.go} |    68 +-
 ...eAck.go => ApduDataExtNetworkParameterWrite.go} |    68 +-
 ...ck.go => ApduDataExtOpenRoutingTableRequest.go} |    68 +-
 ...ck.go => ApduDataExtPropertyDescriptionRead.go} |    68 +-
 ...o => ApduDataExtPropertyDescriptionResponse.go} |    68 +-
 .../model/ApduDataExtPropertyValueRead.go          |   248 +
 .../model/ApduDataExtPropertyValueResponse.go      |   292 +
 ...rameAck.go => ApduDataExtPropertyValueWrite.go} |    68 +-
 ...ck.go => ApduDataExtReadRouterMemoryRequest.go} |    68 +-
 ...k.go => ApduDataExtReadRouterMemoryResponse.go} |    68 +-
 ...ck.go => ApduDataExtReadRouterStatusRequest.go} |    68 +-
 ...k.go => ApduDataExtReadRouterStatusResponse.go} |    68 +-
 ...ck.go => ApduDataExtReadRoutingTableRequest.go} |    68 +-
 ...k.go => ApduDataExtReadRoutingTableResponse.go} |    68 +-
 ...k.go => ApduDataExtWriteRouterMemoryRequest.go} |    68 +-
 ...k.go => ApduDataExtWriteRouterStatusRequest.go} |    68 +-
 ...k.go => ApduDataExtWriteRoutingTableRequest.go} |    68 +-
 ...{LDataFrameAck.go => ApduDataGroupValueRead.go} |    68 +-
 ...taFrameAck.go => ApduDataGroupValueResponse.go} |    68 +-
 .../readwrite/model/ApduDataGroupValueWrite.go     |   210 +
 ...rameAck.go => ApduDataIndividualAddressRead.go} |    68 +-
 ...Ack.go => ApduDataIndividualAddressResponse.go} |    68 +-
 ...ameAck.go => ApduDataIndividualAddressWrite.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataMemoryRead.go}    |    68 +-
 ...{LDataFrameAck.go => ApduDataMemoryResponse.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataMemoryWrite.go}   |    68 +-
 .../knxnetip/readwrite/model/ApduDataOther.go      |   163 +
 .../model/{LDataFrameAck.go => ApduDataRestart.go} |    68 +-
 .../{LDataFrameAck.go => ApduDataUserMessage.go}   |    68 +-
 .../knxnetip/readwrite/model/ChannelInformation.go |   167 +
 .../plc4go/knxnetip/readwrite/model/ControlType.go |   109 -
 .../readwrite/model/DeviceDescriptorMediumType.go  |   123 +
 .../readwrite/model/DeviceDescriptorType0.go       |   476 +
 .../readwrite/model/DeviceDescriptorType2.go       |   371 +
 .../knxnetip/readwrite/model/ExtendedAPCI.go       |   368 -
 .../knxnetip/readwrite/model/FirmwareType.go       |   220 +
 .../knxnetip/readwrite/model/KnxDatapoint.go       | 11725 +++++++++++++------
 .../knxnetip/readwrite/model/KnxDatapointType.go   |  5530 ++++++++-
 .../plc4go/knxnetip/readwrite/model/LBusmonInd.go  |    39 +-
 .../plc4go/knxnetip/readwrite/model/LDataFrame.go  |    63 +-
 .../knxnetip/readwrite/model/LDataFrameData.go     |   325 +-
 .../knxnetip/readwrite/model/LDataFrameDataExt.go  |   325 +-
 .../readwrite/model/LDataFramePollingData.go       |    11 +-
 .../plc4go/modbus/readwrite/ParserHelper.go        |     2 +-
 .../plc4go/modbus/readwrite/XmlParserHelper.go     |     2 +-
 .../internal/plc4go/s7/readwrite/ParserHelper.go   |     2 +-
 .../plc4go/s7/readwrite/XmlParserHelper.go         |     2 +-
 99 files changed, 20191 insertions(+), 8523 deletions(-)

diff --git a/plc4go/cmd/main/drivers/knxnetip_test.go b/plc4go/cmd/main/drivers/knxnetip_test.go
index ee2ee3e..1ac5f96 100644
--- a/plc4go/cmd/main/drivers/knxnetip_test.go
+++ b/plc4go/cmd/main/drivers/knxnetip_test.go
@@ -204,11 +204,9 @@ func TestKnxNetIpPlc4goGroupAddressRead(t *testing.T) {
 		attributes["GatewayKnxAddress"],
 		attributes["ClientKnxAddress"])
 
-	// TODO: Find out why a connection-state request breaks everything ...
 	// Try to ping the remote device
 	pingResultChannel := connection.Ping()
 	pingResult := <-pingResultChannel
-	fmt.Println("Ping Received")
 	if pingResult.Err != nil {
 		t.Errorf("couldn't ping device: %s", pingResult.Err.Error())
 		t.Fail()
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
index 92e2428..4dbaa34 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
@@ -16,7 +16,7 @@
 // specific language governing permissions and limitations
 // under the License.
 //
-package model
+package readwrite
 
 import (
     "errors"
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
index 4a310ea..add8614 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
@@ -16,7 +16,7 @@
 // specific language governing permissions and limitations
 // under the License.
 //
-package model
+package readwrite
 
 import (
     "encoding/xml"
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpActiveReader.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpActiveReader.go
new file mode 100644
index 0000000..8501cda
--- /dev/null
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpActiveReader.go
@@ -0,0 +1,67 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package knxnetip
+
+import (
+    "errors"
+    "fmt"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+    "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+)
+
+type KnxNetIpActiveReader struct {
+	messageCodec spi.MessageCodec
+	spi.PlcWriter
+}
+
+func NewKnxNetIpActiveReader(messageCodec spi.MessageCodec) KnxNetIpActiveReader {
+	return KnxNetIpActiveReader{
+		messageCodec: messageCodec,
+	}
+}
+
+func (m KnxNetIpActiveReader) Read(readRequest model.PlcReadRequest) <-chan model.PlcReadRequestResult {
+	result := make(chan model.PlcReadRequestResult)
+	// If we are requesting only one field, use a
+	if len(readRequest.GetFieldNames()) == 1 {
+		fieldName := readRequest.GetFieldNames()[0]
+
+		// Get the KnxNetIp field instance from the request
+		field := readRequest.GetField(fieldName)
+		knxNetIpField, err := CastToKnxNetIpFieldFromPlcField(field)
+		if err != nil {
+			result <- model.PlcReadRequestResult{
+				Request:  readRequest,
+				Response: nil,
+				Err:      errors.New("invalid field item type"),
+			}
+			return result
+		}
+		fmt.Printf("%v", knxNetIpField)
+
+        /*knxnetipModel.LDataReq{
+            AdditionalInformationLength: 0,
+            AdditionalInformation:       nil,
+            DataFrame: nil                  ,
+            Parent:                      nil,
+            ILDataReq:                   nil,
+        }*/
+	}
+	return result
+}
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go
index cf22022..9244cc2 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go
@@ -105,16 +105,15 @@ func (b KnxNetIpBrowser) Browse(browseRequest apiModel.PlcBrowseRequest) <-chan
 
 					curSequenceCounter := b.sequenceCounter
 					b.sequenceCounter++
-					controlType := driverModel.ControlType_CONNECT
 					deviceConnectionRequest := driverModel.NewTunnelingRequest(
 						driverModel.NewTunnelingRequestDataBlock(
 							b.connection.CommunicationChannelId,
 							curSequenceCounter),
 						driverModel.NewLDataReq(0, nil,
 							driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
-								sourceAddress, targetAddress, uint8(0), true, false,
-								uint8(0), &controlType, nil, nil, nil, nil,
-								true, driverModel.CEMIPriority_SYSTEM, false, false)))
+								sourceAddress, targetAddress,
+								driverModel.NewApduControlContainer(driverModel.NewApduControlConnect(), 0, false, 0),
+								true, true, driverModel.CEMIPriority_SYSTEM, false, false)))
 
 					// Send the request
 					done := make(chan bool)
@@ -123,7 +122,8 @@ func (b KnxNetIpBrowser) Browse(browseRequest apiModel.PlcBrowseRequest) <-chan
 						// The Gateway is now supposed to send an Ack to this request.
 						func(message interface{}) bool {
 							tunnelingRequest := driverModel.CastTunnelingRequest(message)
-							if tunnelingRequest == nil || tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != b.connection.CommunicationChannelId {
+							if tunnelingRequest == nil ||
+							    tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != b.connection.CommunicationChannelId {
 								return false
 							}
 							lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go
index 397337e..0f77842 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpConnection.go
@@ -19,624 +19,630 @@
 package knxnetip
 
 import (
-	"bytes"
-	"errors"
-	"fmt"
-	driverModel "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/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/internal/plc4go/spi/transports/udp"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
-	"github.com/apache/plc4x/plc4go/pkg/plc4go"
-	apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
-	"math"
-	"net"
-	"strconv"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"time"
+    "bytes"
+    "errors"
+    "fmt"
+    driverModel "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/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/internal/plc4go/spi/transports/udp"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "github.com/apache/plc4x/plc4go/pkg/plc4go"
+    apiModel "github.com/apache/plc4x/plc4go/pkg/plc4go/model"
+    "math"
+    "net"
+    "strconv"
+    "strings"
+    "sync"
+    "sync/atomic"
+    "time"
 )
 
 type ConnectionMetadata struct {
-	KnxMedium         driverModel.KnxMedium
-	GatewayName       string
-	GatewayKnxAddress string
-	ClientKnxAddress  string
+    KnxMedium         driverModel.KnxMedium
+    GatewayName       string
+    GatewayKnxAddress string
+    ClientKnxAddress  string
 
-	ProjectNumber          uint8
-	InstallationNumber     uint8
-	DeviceSerialNumber     []int8
-	DeviceMulticastAddress []int8
-	DeviceMacAddress       []int8
-	SupportedServices      []string
+    ProjectNumber          uint8
+    InstallationNumber     uint8
+    DeviceSerialNumber     []int8
+    DeviceMulticastAddress []int8
+    DeviceMacAddress       []int8
+    SupportedServices      []string
 
-	apiModel.PlcConnectionMetadata
+    apiModel.PlcConnectionMetadata
 }
 
 func (m ConnectionMetadata) GetConnectionAttributes() map[string]string {
-	return map[string]string{
-		"KnxMedium":         m.KnxMedium.String(),
-		"GatewayName":       m.GatewayName,
-		"GatewayKnxAddress": m.GatewayKnxAddress,
-		"ClientKnxAddress":  m.ClientKnxAddress,
+    return map[string]string{
+        "KnxMedium":         m.KnxMedium.String(),
+        "GatewayName":       m.GatewayName,
+        "GatewayKnxAddress": m.GatewayKnxAddress,
+        "ClientKnxAddress":  m.ClientKnxAddress,
 
-		"ProjectNumber":          strconv.Itoa(int(m.ProjectNumber)),
-		"InstallationNumber":     strconv.Itoa(int(m.InstallationNumber)),
-		"DeviceSerialNumber":     utils.Int8ArrayToString(m.DeviceSerialNumber, " "),
-		"DeviceMulticastAddress": utils.Int8ArrayToString(m.DeviceSerialNumber, "."),
-		"DeviceMacAddress":       utils.Int8ArrayToString(m.DeviceSerialNumber, ":"),
-		"SupportedServices":      strings.Join(m.SupportedServices, ", "),
-	}
+        "ProjectNumber":          strconv.Itoa(int(m.ProjectNumber)),
+        "InstallationNumber":     strconv.Itoa(int(m.InstallationNumber)),
+        "DeviceSerialNumber":     utils.Int8ArrayToString(m.DeviceSerialNumber, " "),
+        "DeviceMulticastAddress": utils.Int8ArrayToString(m.DeviceSerialNumber, "."),
+        "DeviceMacAddress":       utils.Int8ArrayToString(m.DeviceSerialNumber, ":"),
+        "SupportedServices":      strings.Join(m.SupportedServices, ", "),
+    }
 }
 
 func (m ConnectionMetadata) CanRead() bool {
-	return true
+    return true
 }
 
 func (m ConnectionMetadata) CanWrite() bool {
-	return true
+    return true
 }
 
 func (m ConnectionMetadata) CanSubscribe() bool {
-	return true
+    return true
 }
 
 func (m ConnectionMetadata) CanBrowse() bool {
-	return true
+    return true
 }
 
 type KnxNetIpConnection struct {
-	messageCodec             spi.MessageCodec
-	options                  map[string][]string
-	fieldHandler             spi.PlcFieldHandler
-	valueHandler             spi.PlcValueHandler
-	connectionStateTimer     *time.Ticker
-	quitConnectionStateTimer chan struct{}
-	subscribers              []*KnxNetIpSubscriber
-	leve3AddressCache        map[uint16]*driverModel.KnxGroupAddress3Level
-	leve2AddressCache        map[uint16]*driverModel.KnxGroupAddress2Level
-	leve1AddressCache        map[uint16]*driverModel.KnxGroupAddressFreeLevel
-
-	valueCache      map[uint16][]int8
-	valueCacheMutex sync.RWMutex
-	metadata        *ConnectionMetadata
-
-	GatewayKnxAddress             *driverModel.KnxAddress
-	ClientKnxAddress              *driverModel.KnxAddress
-	CommunicationChannelId        uint8
-	SequenceCounter               int32
-	TunnelingRequestExpectationId int32
-
-	requestInterceptor internalModel.RequestInterceptor
-	plc4go.PlcConnection
+    messageCodec             spi.MessageCodec
+    options                  map[string][]string
+    fieldHandler             spi.PlcFieldHandler
+    valueHandler             spi.PlcValueHandler
+    connectionStateTimer     *time.Ticker
+    quitConnectionStateTimer chan struct{}
+    subscribers              []*KnxNetIpSubscriber
+    leve3AddressCache        map[uint16]*driverModel.KnxGroupAddress3Level
+    leve2AddressCache        map[uint16]*driverModel.KnxGroupAddress2Level
+    leve1AddressCache        map[uint16]*driverModel.KnxGroupAddressFreeLevel
+
+    valueCache      map[uint16][]int8
+    valueCacheMutex sync.RWMutex
+    metadata        *ConnectionMetadata
+
+    GatewayKnxAddress             *driverModel.KnxAddress
+    ClientKnxAddress              *driverModel.KnxAddress
+    CommunicationChannelId        uint8
+    SequenceCounter               int32
+    TunnelingRequestExpectationId int32
+
+    requestInterceptor internalModel.RequestInterceptor
+    plc4go.PlcConnection
 }
 
 type InternalKnxNetIpConnection interface {
-	Send(request *driverModel.KnxNetIpMessage) error
-	SendRequest(request *driverModel.KnxNetIpMessage, expect func(response interface{}) (bool, bool)) (int32, chan interface{})
+    Send(request *driverModel.KnxNetIpMessage) error
+    SendRequest(request *driverModel.KnxNetIpMessage, expect func(response interface{}) (bool, bool)) (int32, chan interface{})
 }
 
 func NewKnxNetIpConnection(transportInstance transports.TransportInstance, options map[string][]string, fieldHandler spi.PlcFieldHandler) *KnxNetIpConnection {
-	connection := &KnxNetIpConnection{
-		options:            options,
-		fieldHandler:       fieldHandler,
-		valueHandler:       NewValueHandler(),
-		requestInterceptor: interceptors.NewSingleItemRequestInterceptor(),
-		subscribers:        []*KnxNetIpSubscriber{},
-		leve3AddressCache:  map[uint16]*driverModel.KnxGroupAddress3Level{},
-		leve2AddressCache:  map[uint16]*driverModel.KnxGroupAddress2Level{},
-		leve1AddressCache:  map[uint16]*driverModel.KnxGroupAddressFreeLevel{},
-		valueCache:         map[uint16][]int8{},
-		valueCacheMutex:    sync.RWMutex{},
-		metadata:           &ConnectionMetadata{},
-	}
-	connection.messageCodec = NewKnxNetIpMessageCodec(transportInstance, connection.interceptIncomingMessage)
-	return connection
+    connection := &KnxNetIpConnection{
+        options:            options,
+        fieldHandler:       fieldHandler,
+        valueHandler:       NewValueHandler(),
+        requestInterceptor: interceptors.NewSingleItemRequestInterceptor(),
+        subscribers:        []*KnxNetIpSubscriber{},
+        leve3AddressCache:  map[uint16]*driverModel.KnxGroupAddress3Level{},
+        leve2AddressCache:  map[uint16]*driverModel.KnxGroupAddress2Level{},
+        leve1AddressCache:  map[uint16]*driverModel.KnxGroupAddressFreeLevel{},
+        valueCache:         map[uint16][]int8{},
+        valueCacheMutex:    sync.RWMutex{},
+        metadata:           &ConnectionMetadata{},
+    }
+    connection.messageCodec = NewKnxNetIpMessageCodec(transportInstance, connection.interceptIncomingMessage)
+    return connection
 }
 
 func (m *KnxNetIpConnection) Connect() <-chan plc4go.PlcConnectionConnectResult {
-	result := make(chan plc4go.PlcConnectionConnectResult)
-	sendResult := func(connection plc4go.PlcConnection, err error) {
-		select {
-		case result <- plc4go.NewPlcConnectionConnectResult(connection, err):
-		default:
-		}
-	}
-
-	go func() {
-		err := m.messageCodec.Connect()
-		if err != nil {
-			sendResult(nil, err)
-			return
-		}
-
-		transportInstanceExposer, ok := m.messageCodec.(spi.TransportInstanceExposer)
-		if !ok {
-			sendResult(m, errors.New(
-				"used transport, is not a TransportInstanceExposer"))
-			return
-		}
-
-		// Prepare a SearchReq
-		udpTransportInstance, ok := transportInstanceExposer.GetTransportInstance().(*udp.UdpTransportInstance)
-		if !ok {
-			sendResult(m, errors.New(
-				"used transport, is not a UdpTransportInstance"))
-			return
-		}
-		localAddress := driverModel.NewIPAddress(utils.ByteArrayToInt8Array(udpTransportInstance.LocalAddress.IP))
-		discoveryEndpoint := driverModel.NewHPAIDiscoveryEndpoint(
-			driverModel.HostProtocolCode_IPV4_UDP, localAddress, uint16(udpTransportInstance.LocalAddress.Port))
-		searchRequest := driverModel.NewSearchRequest(discoveryEndpoint)
-
-		// Send the SearchReq
-		err = m.messageCodec.SendRequest(
-			searchRequest,
-			func(message interface{}) bool {
-				searchResponse := driverModel.CastSearchResponse(message)
-				return searchResponse != nil
-			},
-			func(message interface{}) error {
-				searchResponse := driverModel.CastSearchResponse(message)
-
-				// Save some important information
-				m.metadata.KnxMedium = searchResponse.DibDeviceInfo.KnxMedium
-				m.metadata.GatewayName = string(bytes.Trim(utils.Int8ArrayToByteArray(
-					searchResponse.DibDeviceInfo.DeviceFriendlyName), "\x00"))
-				m.GatewayKnxAddress = searchResponse.DibDeviceInfo.KnxAddress
-				m.metadata.GatewayKnxAddress = KnxAddressToString(m.GatewayKnxAddress)
-				m.metadata.ProjectNumber = searchResponse.DibDeviceInfo.ProjectInstallationIdentifier.ProjectNumber
-				m.metadata.InstallationNumber = searchResponse.DibDeviceInfo.ProjectInstallationIdentifier.InstallationNumber
-				m.metadata.DeviceSerialNumber = searchResponse.DibDeviceInfo.KnxNetIpDeviceSerialNumber
-				m.metadata.DeviceMulticastAddress = searchResponse.DibDeviceInfo.KnxNetIpDeviceMulticastAddress.Addr
-				m.metadata.DeviceMacAddress = searchResponse.DibDeviceInfo.KnxNetIpDeviceMacAddress.Addr
-				m.metadata.SupportedServices = []string{}
-				supportsTunneling := false
-				for _, serviceId := range searchResponse.DibSuppSvcFamilies.ServiceIds {
-					m.metadata.SupportedServices = append(m.metadata.SupportedServices, serviceId.Child.GetTypeName())
-					// If this is an instance of the "tunneling", service, this connection supports tunneling
-					_, ok := serviceId.Child.(*driverModel.KnxNetIpTunneling)
-					if ok {
-						supportsTunneling = true
-						break
-					}
-				}
-
-				// If the current device supports tunneling, create a tunneling connection.
-				// Via this connection we then get access to the entire KNX network this Gateway is connected to.
-				if supportsTunneling {
-					// As soon as we got a successful search-response back, send a connection request.
-					localAddress := m.castIpToKnxAddress(udpTransportInstance.LocalAddress.IP)
-					connectionRequest := driverModel.NewConnectionRequest(
-						driverModel.NewHPAIDiscoveryEndpoint(driverModel.HostProtocolCode_IPV4_UDP,
-							localAddress, uint16(udpTransportInstance.LocalAddress.Port)),
-						driverModel.NewHPAIDataEndpoint(driverModel.HostProtocolCode_IPV4_UDP,
-							localAddress, uint16(udpTransportInstance.LocalAddress.Port)),
-						driverModel.NewConnectionRequestInformationTunnelConnection(driverModel.KnxLayer_TUNNEL_LINK_LAYER),
-					)
-
-					// Send the connection request
-					err = m.messageCodec.SendRequest(
-						connectionRequest,
-						func(message interface{}) bool {
-							connectionResponse := driverModel.CastConnectionResponse(message)
-							return connectionResponse != nil
-						},
-						func(message interface{}) error {
-							connectionResponse := driverModel.CastConnectionResponse(message)
-
-							// Save the communication channel id
-							m.CommunicationChannelId = connectionResponse.CommunicationChannelId
-
-							// Reset the sequence counter
-							m.SequenceCounter = -1
-
-							// If the connection was successful, the gateway will now forward any packets
-							// on the KNX bus that are broadcast packets to us, so we have to setup things
-							// to handle these incoming messages.
-							if connectionResponse.Status == driverModel.Status_NO_ERROR {
-								go func() {
-									defaultIncomingMessageChannel := m.messageCodec.GetDefaultIncomingMessageChannel()
-									for {
-										incomingMessage := <-defaultIncomingMessageChannel
-										tunnelingRequest := driverModel.CastTunnelingRequest(incomingMessage)
-										if tunnelingRequest == nil {
-											tunnelingResponse := driverModel.CastTunnelingResponse(incomingMessage)
-											if tunnelingResponse != nil {
-												fmt.Printf("Got an unhandled TunnelingResponse message %v\n", tunnelingResponse)
-											} else {
-												fmt.Printf("Not a TunnelingRequest message %v\n", incomingMessage)
-											}
-										} else {
-											if tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.CommunicationChannelId {
-												fmt.Printf("Not for this connection %v\n", tunnelingRequest)
-												continue
-											}
-											lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
-											if lDataInd != nil {
-												m.handleIncomingTunnelingRequest(tunnelingRequest)
-											}
-										}
-									}
-								}()
-
-								// Save the KNX Address the Gateway assigned to us for this connection.
-								tunnelConnectionDataBlock :=
-									driverModel.CastConnectionResponseDataBlockTunnelConnection(
-										connectionResponse.ConnectionResponseDataBlock)
-								m.ClientKnxAddress = tunnelConnectionDataBlock.KnxAddress
-
-								// Fire the "connected" event
-								sendResult(m, nil)
-
-								// Start a timer that sends connection-state requests every 60 seconds
-								m.connectionStateTimer = time.NewTicker(60 * time.Second)
-								m.quitConnectionStateTimer = make(chan struct{})
-								go func() {
-									for {
-										select {
-										case <-m.connectionStateTimer.C:
-											// We're using the connection-state-request as ping operation ...
-											ping := m.Ping()
-											select {
-											case pingResult := <-ping:
-												if pingResult.Err != nil {
-													// TODO: Do some error handling here ...
-													m.connectionStateTimer.Stop()
-												}
-											case <-time.After(5 * time.Second):
-												// Close the connection
-												m.Close()
-											}
-
-										// If externally a request to stop the timer was issued, stop the timer.
-										case <-m.quitConnectionStateTimer:
-											// TODO: Do some error handling here ...
-											m.connectionStateTimer.Stop()
-											return
-										}
-									}
-								}()
-							}
-							return nil
-						},
-						time.Second*1)
-				} else {
-					return errors.New("current device doesn't support tunneling")
-				}
-				return nil
-			},
-			time.Second*1)
-		if err != nil {
-			sendResult(nil, err)
-		}
-	}()
-	return result
+    result := make(chan plc4go.PlcConnectionConnectResult)
+    sendResult := func(connection plc4go.PlcConnection, err error) {
+        select {
+        case result <- plc4go.NewPlcConnectionConnectResult(connection, err):
+        default:
+        }
+    }
+
+    go func() {
+        err := m.messageCodec.Connect()
+        if err != nil {
+            sendResult(nil, err)
+            return
+        }
+
+        transportInstanceExposer, ok := m.messageCodec.(spi.TransportInstanceExposer)
+        if !ok {
+            sendResult(m, errors.New(
+                "used transport, is not a TransportInstanceExposer"))
+            return
+        }
+
+        // Prepare a SearchReq
+        udpTransportInstance, ok := transportInstanceExposer.GetTransportInstance().(*udp.UdpTransportInstance)
+        if !ok {
+            sendResult(m, errors.New(
+                "used transport, is not a UdpTransportInstance"))
+            return
+        }
+        localAddress := driverModel.NewIPAddress(utils.ByteArrayToInt8Array(udpTransportInstance.LocalAddress.IP))
+        discoveryEndpoint := driverModel.NewHPAIDiscoveryEndpoint(
+            driverModel.HostProtocolCode_IPV4_UDP, localAddress, uint16(udpTransportInstance.LocalAddress.Port))
+        searchRequest := driverModel.NewSearchRequest(discoveryEndpoint)
+
+        // Send the SearchReq
+        err = m.messageCodec.SendRequest(
+            searchRequest,
+            func(message interface{}) bool {
+                searchResponse := driverModel.CastSearchResponse(message)
+                return searchResponse != nil
+            },
+            func(message interface{}) error {
+                searchResponse := driverModel.CastSearchResponse(message)
+
+                // Save some important information
+                m.metadata.KnxMedium = searchResponse.DibDeviceInfo.KnxMedium
+                m.metadata.GatewayName = string(bytes.Trim(utils.Int8ArrayToByteArray(
+                    searchResponse.DibDeviceInfo.DeviceFriendlyName), "\x00"))
+                m.GatewayKnxAddress = searchResponse.DibDeviceInfo.KnxAddress
+                m.metadata.GatewayKnxAddress = KnxAddressToString(m.GatewayKnxAddress)
+                m.metadata.ProjectNumber = searchResponse.DibDeviceInfo.ProjectInstallationIdentifier.ProjectNumber
+                m.metadata.InstallationNumber = searchResponse.DibDeviceInfo.ProjectInstallationIdentifier.InstallationNumber
+                m.metadata.DeviceSerialNumber = searchResponse.DibDeviceInfo.KnxNetIpDeviceSerialNumber
+                m.metadata.DeviceMulticastAddress = searchResponse.DibDeviceInfo.KnxNetIpDeviceMulticastAddress.Addr
+                m.metadata.DeviceMacAddress = searchResponse.DibDeviceInfo.KnxNetIpDeviceMacAddress.Addr
+                m.metadata.SupportedServices = []string{}
+                supportsTunneling := false
+                for _, serviceId := range searchResponse.DibSuppSvcFamilies.ServiceIds {
+                    m.metadata.SupportedServices = append(m.metadata.SupportedServices, serviceId.Child.GetTypeName())
+                    // If this is an instance of the "tunneling", service, this connection supports tunneling
+                    _, ok := serviceId.Child.(*driverModel.KnxNetIpTunneling)
+                    if ok {
+                        supportsTunneling = true
+                        break
+                    }
+                }
+
+                // If the current device supports tunneling, create a tunneling connection.
+                // Via this connection we then get access to the entire KNX network this Gateway is connected to.
+                if supportsTunneling {
+                    // As soon as we got a successful search-response back, send a connection request.
+                    localAddress := m.castIpToKnxAddress(udpTransportInstance.LocalAddress.IP)
+                    connectionRequest := driverModel.NewConnectionRequest(
+                        driverModel.NewHPAIDiscoveryEndpoint(driverModel.HostProtocolCode_IPV4_UDP,
+                            localAddress, uint16(udpTransportInstance.LocalAddress.Port)),
+                        driverModel.NewHPAIDataEndpoint(driverModel.HostProtocolCode_IPV4_UDP,
+                            localAddress, uint16(udpTransportInstance.LocalAddress.Port)),
+                        driverModel.NewConnectionRequestInformationTunnelConnection(driverModel.KnxLayer_TUNNEL_LINK_LAYER),
+                    )
+
+                    // Send the connection request
+                    err = m.messageCodec.SendRequest(
+                        connectionRequest,
+                        func(message interface{}) bool {
+                            connectionResponse := driverModel.CastConnectionResponse(message)
+                            return connectionResponse != nil
+                        },
+                        func(message interface{}) error {
+                            connectionResponse := driverModel.CastConnectionResponse(message)
+
+                            // Save the communication channel id
+                            m.CommunicationChannelId = connectionResponse.CommunicationChannelId
+
+                            // Reset the sequence counter
+                            m.SequenceCounter = -1
+
+                            // If the connection was successful, the gateway will now forward any packets
+                            // on the KNX bus that are broadcast packets to us, so we have to setup things
+                            // to handle these incoming messages.
+                            if connectionResponse.Status == driverModel.Status_NO_ERROR {
+                                go func() {
+                                    defaultIncomingMessageChannel := m.messageCodec.GetDefaultIncomingMessageChannel()
+                                    for {
+                                        incomingMessage := <-defaultIncomingMessageChannel
+                                        tunnelingRequest := driverModel.CastTunnelingRequest(incomingMessage)
+                                        if tunnelingRequest == nil {
+                                            tunnelingResponse := driverModel.CastTunnelingResponse(incomingMessage)
+                                            if tunnelingResponse != nil {
+                                                fmt.Printf("Got an unhandled TunnelingResponse message %v\n", tunnelingResponse)
+                                            } else {
+                                                fmt.Printf("Not a TunnelingRequest message %v\n", incomingMessage)
+                                            }
+                                        } else {
+                                            if tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId != m.CommunicationChannelId {
+                                                fmt.Printf("Not for this connection %v\n", tunnelingRequest)
+                                                continue
+                                            }
+                                            lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
+                                            if lDataInd != nil {
+                                                m.handleIncomingTunnelingRequest(tunnelingRequest)
+                                            }
+                                        }
+                                    }
+                                }()
+
+                                // Save the KNX Address the Gateway assigned to us for this connection.
+                                tunnelConnectionDataBlock :=
+                                    driverModel.CastConnectionResponseDataBlockTunnelConnection(
+                                        connectionResponse.ConnectionResponseDataBlock)
+                                m.ClientKnxAddress = tunnelConnectionDataBlock.KnxAddress
+
+                                // Fire the "connected" event
+                                sendResult(m, nil)
+
+                                // Start a timer that sends connection-state requests every 60 seconds
+                                m.connectionStateTimer = time.NewTicker(60 * time.Second)
+                                m.quitConnectionStateTimer = make(chan struct{})
+                                go func() {
+                                    for {
+                                        select {
+                                        case <-m.connectionStateTimer.C:
+                                            // We're using the connection-state-request as ping operation ...
+                                            ping := m.Ping()
+                                            select {
+                                            case pingResult := <-ping:
+                                                if pingResult.Err != nil {
+                                                    // TODO: Do some error handling here ...
+                                                    m.connectionStateTimer.Stop()
+                                                }
+                                            case <-time.After(5 * time.Second):
+                                                // Close the connection
+                                                m.Close()
+                                            }
+
+                                        // If externally a request to stop the timer was issued, stop the timer.
+                                        case <-m.quitConnectionStateTimer:
+                                            // TODO: Do some error handling here ...
+                                            m.connectionStateTimer.Stop()
+                                            return
+                                        }
+                                    }
+                                }()
+                            }
+                            return nil
+                        },
+                        time.Second*1)
+                } else {
+                    return errors.New("current device doesn't support tunneling")
+                }
+                return nil
+            },
+            time.Second*1)
+        if err != nil {
+            sendResult(nil, err)
+        }
+    }()
+    return result
 }
 
 func (m *KnxNetIpConnection) Close() <-chan plc4go.PlcConnectionCloseResult {
-	// TODO: Implement ...
-	result := make(chan plc4go.PlcConnectionCloseResult)
-	sendResult := func(connection plc4go.PlcConnection, err error) {
-		select {
-		case result <- plc4go.NewPlcConnectionCloseResult(connection, err):
-		default:
-		}
-	}
-
-	go func() {
-		// Stop the connection-state checker.
-		m.connectionStateTimer.Stop()
-
-		transportInstanceExposer, ok := m.messageCodec.(spi.TransportInstanceExposer)
-		if !ok {
-			sendResult(nil, errors.New(
-				"used transport, is not a TransportInstanceExposer"))
-			return
-		}
-
-		// Prepare a SearchReq
-		udpTransportInstance, ok := transportInstanceExposer.GetTransportInstance().(*udp.UdpTransportInstance)
-		if !ok {
-			sendResult(nil, errors.New(
-				"used transport, is not a UdpTransportInstance"))
-			return
-		}
-
-		localAddress := m.castIpToKnxAddress(udpTransportInstance.LocalAddress.IP)
-
-		disconnectRequest := driverModel.NewDisconnectRequest(
-			m.CommunicationChannelId,
-			driverModel.NewHPAIControlEndpoint(
-				driverModel.HostProtocolCode_IPV4_UDP,
-				localAddress,
-				uint16(udpTransportInstance.LocalAddress.Port)))
-
-		err := m.SendRequest(
-			disconnectRequest,
-			func(message interface{}) bool {
-				disconnectResponse := driverModel.CastDisconnectResponse(message)
-				return disconnectResponse != nil
-			},
-			func(message interface{}) error {
-				disconnectResponse := driverModel.CastDisconnectResponse(message)
-				if disconnectResponse.Status == driverModel.Status_NO_ERROR {
-					sendResult(m, nil)
-				} else {
-					sendResult(m, errors.New("got an unexpected response for disconnect "+disconnectResponse.Status.String()))
-				}
-				return nil
-			},
-			time.Second*5)
-
-		if err != nil {
-			sendResult(nil, err)
-		}
-	}()
-	return result
+    // TODO: Implement ...
+    result := make(chan plc4go.PlcConnectionCloseResult)
+    sendResult := func(connection plc4go.PlcConnection, err error) {
+        select {
+        case result <- plc4go.NewPlcConnectionCloseResult(connection, err):
+        default:
+        }
+    }
+
+    go func() {
+        // Stop the connection-state checker.
+        m.connectionStateTimer.Stop()
+
+        transportInstanceExposer, ok := m.messageCodec.(spi.TransportInstanceExposer)
+        if !ok {
+            sendResult(nil, errors.New(
+                "used transport, is not a TransportInstanceExposer"))
+            return
+        }
+
+        // Prepare a SearchReq
+        udpTransportInstance, ok := transportInstanceExposer.GetTransportInstance().(*udp.UdpTransportInstance)
+        if !ok {
+            sendResult(nil, errors.New(
+                "used transport, is not a UdpTransportInstance"))
+            return
+        }
+
+        localAddress := m.castIpToKnxAddress(udpTransportInstance.LocalAddress.IP)
+
+        disconnectRequest := driverModel.NewDisconnectRequest(
+            m.CommunicationChannelId,
+            driverModel.NewHPAIControlEndpoint(
+                driverModel.HostProtocolCode_IPV4_UDP,
+                localAddress,
+                uint16(udpTransportInstance.LocalAddress.Port)))
+
+        err := m.SendRequest(
+            disconnectRequest,
+            func(message interface{}) bool {
+                disconnectResponse := driverModel.CastDisconnectResponse(message)
+                return disconnectResponse != nil
+            },
+            func(message interface{}) error {
+                disconnectResponse := driverModel.CastDisconnectResponse(message)
+                if disconnectResponse.Status == driverModel.Status_NO_ERROR {
+                    sendResult(m, nil)
+                } else {
+                    sendResult(m, errors.New("got an unexpected response for disconnect "+disconnectResponse.Status.String()))
+                }
+                return nil
+            },
+            time.Second*5)
+
+        if err != nil {
+            sendResult(nil, err)
+        }
+    }()
+    return result
 }
 
 func (m *KnxNetIpConnection) IsConnected() bool {
-	if m.messageCodec != nil {
-		pingChannel := m.Ping()
-		select {
-		case pingResponse := <-pingChannel:
-			return pingResponse.Err == nil
-		case <-time.After(time.Second * 5):
-			return false
-		}
-	}
-	return false
+    if m.messageCodec != nil {
+        pingChannel := m.Ping()
+        select {
+        case pingResponse := <-pingChannel:
+            return pingResponse.Err == nil
+        case <-time.After(time.Second * 5):
+            return false
+        }
+    }
+    return false
 }
 
 func (m *KnxNetIpConnection) Ping() <-chan plc4go.PlcConnectionPingResult {
-	result := make(chan plc4go.PlcConnectionPingResult)
-	sendResult := func(err error) {
-		select {
-		case result <- plc4go.NewPlcConnectionPingResult(err):
-		default:
-		}
-	}
-
-	//	diagnosticRequestPdu := driverModel.NewModbusPDUDiagnosticRequest(0, 0x42)
-	go func() {
-		transportInstanceExposer, ok := m.messageCodec.(spi.TransportInstanceExposer)
-		if !ok {
-			sendResult(errors.New(
-				"used transport, is not a TransportInstanceExposer"))
-			return
-		}
-
-		// Prepare a SearchReq
-		udpTransportInstance, ok := transportInstanceExposer.GetTransportInstance().(*udp.UdpTransportInstance)
-		if !ok {
-			sendResult(errors.New(
-				"used transport, is not a UdpTransportInstance"))
-			return
-		}
-
-		localAddress := m.castIpToKnxAddress(udpTransportInstance.LocalAddress.IP)
-
-		connectionStateRequest := driverModel.NewConnectionStateRequest(
-			m.CommunicationChannelId,
-			driverModel.NewHPAIControlEndpoint(
-				driverModel.HostProtocolCode_IPV4_UDP,
-				localAddress, uint16(udpTransportInstance.LocalAddress.Port)))
-
-		// Send the connection state request
-		err := m.messageCodec.SendRequest(
-			connectionStateRequest,
-			func(message interface{}) bool {
-				connectionStateResponse := driverModel.CastConnectionStateResponse(message)
-				return connectionStateResponse != nil
-			},
-			func(message interface{}) error {
-				connectionStateResponse := driverModel.CastConnectionStateResponse(message)
-				if connectionStateResponse.Status != driverModel.Status_NO_ERROR {
-					sendResult(errors.New("got a failure response code " + strconv.Itoa(int(connectionStateResponse.Status))))
-				} else {
-					sendResult(nil)
-				}
-				return nil
-			},
-			// According to the KNX spec, the client is required to wait 10 seconds and if this doesn't
-			// come in within this time to re-try 3 times (total of 4 times)
-			// TODO: Implement the logic to re-try 3 times
-			time.Second*10)
-		if err != nil {
-			sendResult(err)
-		}
-		return
-	}()
-	return result
+    result := make(chan plc4go.PlcConnectionPingResult)
+    sendResult := func(err error) {
+        select {
+        case result <- plc4go.NewPlcConnectionPingResult(err):
+        default:
+        }
+    }
+
+    //	diagnosticRequestPdu := driverModel.NewModbusPDUDiagnosticRequest(0, 0x42)
+    go func() {
+        transportInstanceExposer, ok := m.messageCodec.(spi.TransportInstanceExposer)
+        if !ok {
+            sendResult(errors.New(
+                "used transport, is not a TransportInstanceExposer"))
+            return
+        }
+
+        // Prepare a SearchReq
+        udpTransportInstance, ok := transportInstanceExposer.GetTransportInstance().(*udp.UdpTransportInstance)
+        if !ok {
+            sendResult(errors.New(
+                "used transport, is not a UdpTransportInstance"))
+            return
+        }
+
+        localAddress := m.castIpToKnxAddress(udpTransportInstance.LocalAddress.IP)
+
+        connectionStateRequest := driverModel.NewConnectionStateRequest(
+            m.CommunicationChannelId,
+            driverModel.NewHPAIControlEndpoint(
+                driverModel.HostProtocolCode_IPV4_UDP,
+                localAddress, uint16(udpTransportInstance.LocalAddress.Port)))
+
+        // Send the connection state request
+        err := m.messageCodec.SendRequest(
+            connectionStateRequest,
+            func(message interface{}) bool {
+                connectionStateResponse := driverModel.CastConnectionStateResponse(message)
+                return connectionStateResponse != nil
+            },
+            func(message interface{}) error {
+                connectionStateResponse := driverModel.CastConnectionStateResponse(message)
+                if connectionStateResponse.Status != driverModel.Status_NO_ERROR {
+                    sendResult(errors.New("got a failure response code " + strconv.Itoa(int(connectionStateResponse.Status))))
+                } else {
+                    sendResult(nil)
+                }
+                return nil
+            },
+            // According to the KNX spec, the client is required to wait 10 seconds and if this doesn't
+            // come in within this time to re-try 3 times (total of 4 times)
+            // TODO: Implement the logic to re-try 3 times
+            time.Second*10)
+        if err != nil {
+            sendResult(err)
+        }
+        return
+    }()
+    return result
 }
 
 func (m *KnxNetIpConnection) GetMetadata() apiModel.PlcConnectionMetadata {
-	return m.metadata
+    return m.metadata
 }
 
 func (m *KnxNetIpConnection) ReadRequestBuilder() apiModel.PlcReadRequestBuilder {
-	return internalModel.NewDefaultPlcReadRequestBuilder(
-		m.fieldHandler, NewKnxNetIpReader(m))
+    return internalModel.NewDefaultPlcReadRequestBuilder(
+        m.fieldHandler, NewKnxNetIpReader(m))
 }
 
 func (m *KnxNetIpConnection) WriteRequestBuilder() apiModel.PlcWriteRequestBuilder {
-	return internalModel.NewDefaultPlcWriteRequestBuilder(
-		m.fieldHandler, m.valueHandler, NewKnxNetIpWriter(m.messageCodec))
+    return internalModel.NewDefaultPlcWriteRequestBuilder(
+        m.fieldHandler, m.valueHandler, NewKnxNetIpWriter(m.messageCodec))
 }
 
 func (m *KnxNetIpConnection) SubscriptionRequestBuilder() apiModel.PlcSubscriptionRequestBuilder {
-	return internalModel.NewDefaultPlcSubscriptionRequestBuilder(
-		m.fieldHandler, m.valueHandler, NewKnxNetIpSubscriber(m))
+    return internalModel.NewDefaultPlcSubscriptionRequestBuilder(
+        m.fieldHandler, m.valueHandler, NewKnxNetIpSubscriber(m))
 }
 
 func (m *KnxNetIpConnection) BrowseRequestBuilder() apiModel.PlcBrowseRequestBuilder {
-	return internalModel.NewDefaultPlcBrowseRequestBuilder(NewKnxNetIpBrowser(m, m.messageCodec))
+    return internalModel.NewDefaultPlcBrowseRequestBuilder(NewKnxNetIpBrowser(m, m.messageCodec))
 }
 
 func (m *KnxNetIpConnection) UnsubscriptionRequestBuilder() apiModel.PlcUnsubscriptionRequestBuilder {
-	return nil /*internalModel.NewDefaultPlcUnsubscriptionRequestBuilder(
-	  m.fieldHandler, m.valueHandler, NewKnxNetIpSubscriber(m.messageCodec))*/
+    return nil /*internalModel.NewDefaultPlcUnsubscriptionRequestBuilder(
+      m.fieldHandler, m.valueHandler, NewKnxNetIpSubscriber(m.messageCodec))*/
 }
 
 func (m *KnxNetIpConnection) GetTransportInstance() transports.TransportInstance {
-	if mc, ok := m.messageCodec.(spi.TransportInstanceExposer); ok {
-		return mc.GetTransportInstance()
-	}
-	return nil
+    if mc, ok := m.messageCodec.(spi.TransportInstanceExposer); ok {
+        return mc.GetTransportInstance()
+    }
+    return nil
 }
 
 func (m *KnxNetIpConnection) GetPlcFieldHandler() spi.PlcFieldHandler {
-	return m.fieldHandler
+    return m.fieldHandler
 }
 
 func (m *KnxNetIpConnection) GetPlcValueHandler() spi.PlcValueHandler {
-	return m.valueHandler
+    return m.valueHandler
 }
 
 func (m *KnxNetIpConnection) Send(request *driverModel.KnxNetIpMessage) error {
-	// If this is a tunneling request, we need to update the communicationChannelId and assign a sequenceCounter
-	tunnelingRequest := driverModel.CastTunnelingRequest(request)
-	if tunnelingRequest != nil {
-		tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId = m.CommunicationChannelId
-		tunnelingRequest.TunnelingRequestDataBlock.SequenceCounter = m.getNewSequenceCounter()
-	}
-	return m.messageCodec.Send(request)
+    // If this is a tunneling request, we need to update the communicationChannelId and assign a sequenceCounter
+    tunnelingRequest := driverModel.CastTunnelingRequest(request)
+    if tunnelingRequest != nil {
+        tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId = m.CommunicationChannelId
+        tunnelingRequest.TunnelingRequestDataBlock.SequenceCounter = m.getNewSequenceCounter()
+    }
+    return m.messageCodec.Send(request)
 }
 
 func (m *KnxNetIpConnection) SendRequest(request *driverModel.KnxNetIpMessage, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, ttl time.Duration) error {
-	// If this is a tunneling request, we need to update the communicationChannelId and assign a sequenceCounter
-	tunnelingRequest := driverModel.CastTunnelingRequest(request)
-	if tunnelingRequest != nil {
-		tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId = m.CommunicationChannelId
-		tunnelingRequest.TunnelingRequestDataBlock.SequenceCounter = m.getNewSequenceCounter()
-	}
-	return m.messageCodec.SendRequest(request, acceptsMessage, handleMessage, ttl)
+    // If this is a tunneling request, we need to update the communicationChannelId and assign a sequenceCounter
+    tunnelingRequest := driverModel.CastTunnelingRequest(request)
+    if tunnelingRequest != nil {
+        tunnelingRequest.TunnelingRequestDataBlock.CommunicationChannelId = m.CommunicationChannelId
+        tunnelingRequest.TunnelingRequestDataBlock.SequenceCounter = m.getNewSequenceCounter()
+    }
+    return m.messageCodec.SendRequest(request, acceptsMessage, handleMessage, ttl)
 }
 
 func (m *KnxNetIpConnection) interceptIncomingMessage(interface{}) {
-	if m.connectionStateTimer != nil {
-		// Reset the timer for sending the ConnectionStateRequest
-		m.connectionStateTimer.Reset(60 * time.Second)
-	}
+    if m.connectionStateTimer != nil {
+        // Reset the timer for sending the ConnectionStateRequest
+        m.connectionStateTimer.Reset(60 * time.Second)
+    }
 }
 
 func (m *KnxNetIpConnection) getNewSequenceCounter() uint8 {
-	sequenceCounter := atomic.AddInt32(&m.SequenceCounter, 1)
-	if sequenceCounter >= math.MaxUint8 {
-		atomic.StoreInt32(&m.SequenceCounter, -1)
-		sequenceCounter = -1
-	}
-	return uint8(sequenceCounter)
+    sequenceCounter := atomic.AddInt32(&m.SequenceCounter, 1)
+    if sequenceCounter >= math.MaxUint8 {
+        atomic.StoreInt32(&m.SequenceCounter, -1)
+        sequenceCounter = -1
+    }
+    return uint8(sequenceCounter)
 }
 
 func (m *KnxNetIpConnection) castIpToKnxAddress(ip net.IP) *driverModel.IPAddress {
-	return driverModel.NewIPAddress(utils.ByteArrayToInt8Array(ip)[len(ip)-4:])
+    return driverModel.NewIPAddress(utils.ByteArrayToInt8Array(ip)[len(ip)-4:])
 }
 
 func (m *KnxNetIpConnection) handleIncomingTunnelingRequest(tunnelingRequest *driverModel.TunnelingRequest) {
-	go func() {
-		lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi.Child)
-		if lDataInd != nil {
-			var destinationAddress []int8
-			var dataFirstByte *int8
-			var data []int8
-			switch lDataInd.DataFrame.Child.(type) {
-			case *driverModel.LDataFrameData:
-				dataFrame := driverModel.CastLDataFrameData(lDataInd.DataFrame)
-				destinationAddress = dataFrame.DestinationAddress
-				dataFirstByte = dataFrame.DataFirstByte
-				data = dataFrame.Data
-			case *driverModel.LDataFrameDataExt:
-				dataFrame := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
-				destinationAddress = dataFrame.DestinationAddress
-				dataFirstByte = dataFrame.DataFirstByte
-				data = dataFrame.Data
-			}
-			if destinationAddress != nil {
-				addressData := uint16(destinationAddress[0])<<8 | (uint16(destinationAddress[1]) & 0xFF)
-				m.valueCacheMutex.RLock()
-				val, ok := m.valueCache[addressData]
-				m.valueCacheMutex.RUnlock()
-				changed := false
-				if dataFirstByte != nil {
-					var payload []int8
-					payload = append(payload, *dataFirstByte)
-					payload = append(payload, data...)
-					if !ok || !m.sliceEqual(val, payload) {
-						m.valueCacheMutex.Lock()
-						m.valueCache[addressData] = payload
-						m.valueCacheMutex.Unlock()
-						// If this is a new value, we have to also provide the 3 different types of addresses.
-						if !ok {
-							arb := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(destinationAddress))
-							if address, err2 := driverModel.KnxGroupAddressParse(arb, 3); err2 == nil {
-								m.leve3AddressCache[addressData] = driverModel.CastKnxGroupAddress3Level(address)
-							}
-							arb.Reset()
-							if address, err2 := driverModel.KnxGroupAddressParse(arb, 2); err2 == nil {
-								m.leve2AddressCache[addressData] = driverModel.CastKnxGroupAddress2Level(address)
-							}
-							arb.Reset()
-							if address, err2 := driverModel.KnxGroupAddressParse(arb, 1); err2 == nil {
-								m.leve1AddressCache[addressData] = driverModel.CastKnxGroupAddressFreeLevel(address)
-							}
-						}
-						changed = true
-					}
-					if m.subscribers != nil {
-						for _, subscriber := range m.subscribers {
-							subscriber.handleValueChange(lDataInd.DataFrame, changed)
-						}
-					}
-				}
-			}
-		}
-	}()
+    go func() {
+        lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi.Child)
+        if lDataInd != nil {
+            var destinationAddress []int8
+            var apdu *driverModel.Apdu
+            switch lDataInd.DataFrame.Child.(type) {
+            case *driverModel.LDataFrameData:
+                dataFrame := driverModel.CastLDataFrameData(lDataInd.DataFrame)
+                destinationAddress = dataFrame.DestinationAddress
+                apdu = dataFrame.Apdu
+            case *driverModel.LDataFrameDataExt:
+                dataFrame := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
+                destinationAddress = dataFrame.DestinationAddress
+                apdu = dataFrame.Apdu
+            }
+            container := driverModel.CastApduDataContainer(apdu)
+            if container == nil {
+                return
+            }
+            groupValueWrite := driverModel.CastApduDataGroupValueWrite(container.DataApdu)
+            if groupValueWrite == nil {
+                return
+            }
+            if destinationAddress != nil {
+                addressData := uint16(destinationAddress[0])<<8 | (uint16(destinationAddress[1]) & 0xFF)
+                m.valueCacheMutex.RLock()
+                val, ok := m.valueCache[addressData]
+                m.valueCacheMutex.RUnlock()
+                changed := false
+
+                var payload []int8
+                payload = append(payload, groupValueWrite.DataFirstByte)
+                payload = append(payload, groupValueWrite.Data...)
+                if !ok || !m.sliceEqual(val, payload) {
+                    m.valueCacheMutex.Lock()
+                    m.valueCache[addressData] = payload
+                    m.valueCacheMutex.Unlock()
+                    // If this is a new value, we have to also provide the 3 different types of addresses.
+                    if !ok {
+                        arb := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(destinationAddress))
+                        if address, err2 := driverModel.KnxGroupAddressParse(arb, 3); err2 == nil {
+                            m.leve3AddressCache[addressData] = driverModel.CastKnxGroupAddress3Level(address)
+                        } else {
+                            fmt.Printf("Error parsing Group Address %s", err2.Error())
+                        }
+                        arb.Reset()
+                        if address, err2 := driverModel.KnxGroupAddressParse(arb, 2); err2 == nil {
+                            m.leve2AddressCache[addressData] = driverModel.CastKnxGroupAddress2Level(address)
+                        }
+                        arb.Reset()
+                        if address, err2 := driverModel.KnxGroupAddressParse(arb, 1); err2 == nil {
+                            m.leve1AddressCache[addressData] = driverModel.CastKnxGroupAddressFreeLevel(address)
+                        }
+                    }
+                    changed = true
+                }
+                if m.subscribers != nil {
+                    for _, subscriber := range m.subscribers {
+                        subscriber.handleValueChange(lDataInd.DataFrame, changed)
+                    }
+                }
+            }
+        }
+    }()
 }
 
 func (m *KnxNetIpConnection) getGroupAddressNumLevels() uint8 {
-	if val, ok := m.options["group-address-num-levels"]; ok {
-		groupAddressNumLevels, err := strconv.Atoi(val[0])
-		if err == nil {
-			return uint8(groupAddressNumLevels)
-		}
-	}
-	return 3
+    if val, ok := m.options["group-address-num-levels"]; ok {
+        groupAddressNumLevels, err := strconv.Atoi(val[0])
+        if err == nil {
+            return uint8(groupAddressNumLevels)
+        }
+    }
+    return 3
 }
 
 func (m *KnxNetIpConnection) addSubscriber(subscriber *KnxNetIpSubscriber) {
-	for _, sub := range m.subscribers {
-		if sub == subscriber {
-			return
-		}
-	}
-	m.subscribers = append(m.subscribers, subscriber)
+    for _, sub := range m.subscribers {
+        if sub == subscriber {
+            return
+        }
+    }
+    m.subscribers = append(m.subscribers, subscriber)
 }
 
 func (m *KnxNetIpConnection) removeSubscriber(subscriber *KnxNetIpSubscriber) {
-	for i, sub := range m.subscribers {
-		if sub == subscriber {
-			m.subscribers = append(m.subscribers[:i], m.subscribers[i+1:]...)
-		}
-	}
+    for i, sub := range m.subscribers {
+        if sub == subscriber {
+            m.subscribers = append(m.subscribers[:i], m.subscribers[i+1:]...)
+        }
+    }
 }
 
 func (m *KnxNetIpConnection) sliceEqual(a, b []int8) bool {
-	if len(a) != len(b) {
-		return false
-	}
-	for i, v := range a {
-		if v != b[i] {
-			return false
-		}
-	}
-	return true
+    if len(a) != len(b) {
+        return false
+    }
+    for i, v := range a {
+        if v != b[i] {
+            return false
+        }
+    }
+    return true
 }
 
 func KnxAddressToString(knxAddress *driverModel.KnxAddress) string {
-	return strconv.Itoa(int(knxAddress.MainGroup)) + "." + strconv.Itoa(int(knxAddress.MiddleGroup)) + "." + strconv.Itoa(int(knxAddress.SubGroup))
+    return strconv.Itoa(int(knxAddress.MainGroup)) + "." + strconv.Itoa(int(knxAddress.MiddleGroup)) + "." + strconv.Itoa(int(knxAddress.SubGroup))
 }
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go
index 748d20b..1d255c6 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpField.go
@@ -34,7 +34,7 @@ type KnxNetIpField interface {
 }
 
 type KnxNetIpGroupAddress3LevelPlcField struct {
-	FieldType *driverModel.KnxDatapointType
+	FieldType *driverModel.KnxDatapointSubtype
 	// 5 Bits: Values 0-31
 	MainGroup string
 	// 3 Bits: values 0-7
@@ -44,7 +44,7 @@ type KnxNetIpGroupAddress3LevelPlcField struct {
 	KnxNetIpField
 }
 
-func NewKnxNetIpGroupAddress3LevelPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string, middleGroup string, subGroup string) KnxNetIpGroupAddress3LevelPlcField {
+func NewKnxNetIpGroupAddress3LevelPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string, middleGroup string, subGroup string) KnxNetIpGroupAddress3LevelPlcField {
 	return KnxNetIpGroupAddress3LevelPlcField{
 		FieldType:   fieldType,
 		MainGroup:   mainGroup,
@@ -110,7 +110,7 @@ func (k KnxNetIpGroupAddress3LevelPlcField) toGroupAddress() *driverModel.KnxGro
 }
 
 type KnxNetIpGroupAddress2LevelPlcField struct {
-	FieldType *driverModel.KnxDatapointType
+	FieldType *driverModel.KnxDatapointSubtype
 	// 5 Bits: Values 0-31
 	MainGroup string
 	// 11 Bits
@@ -118,7 +118,7 @@ type KnxNetIpGroupAddress2LevelPlcField struct {
 	KnxNetIpField
 }
 
-func NewKnxNetIpGroupAddress2LevelPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string, subGroup string) KnxNetIpGroupAddress2LevelPlcField {
+func NewKnxNetIpGroupAddress2LevelPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string, subGroup string) KnxNetIpGroupAddress2LevelPlcField {
 	return KnxNetIpGroupAddress2LevelPlcField{
 		FieldType: fieldType,
 		MainGroup: mainGroup,
@@ -174,13 +174,13 @@ func (k KnxNetIpGroupAddress2LevelPlcField) toGroupAddress() *driverModel.KnxGro
 }
 
 type KnxNetIpGroupAddress1LevelPlcField struct {
-	FieldType *driverModel.KnxDatapointType
+	FieldType *driverModel.KnxDatapointSubtype
 	// 16 Bits
 	MainGroup string
 	KnxNetIpField
 }
 
-func NewKnxNetIpGroupAddress1LevelPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string) KnxNetIpGroupAddress1LevelPlcField {
+func NewKnxNetIpGroupAddress1LevelPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string) KnxNetIpGroupAddress1LevelPlcField {
 	return KnxNetIpGroupAddress1LevelPlcField{
 		FieldType: fieldType,
 		MainGroup: mainGroup,
@@ -226,7 +226,7 @@ func (k KnxNetIpGroupAddress1LevelPlcField) toGroupAddress() *driverModel.KnxGro
 }
 
 type KnxNetIpDevicePropertyAddressPlcField struct {
-	FieldType *driverModel.KnxDatapointType
+	FieldType *driverModel.KnxDatapointSubtype
 	// 5 Bits: Values 0-31
 	MainGroup string
 	// 3 Bits: values 0-7
@@ -238,7 +238,7 @@ type KnxNetIpDevicePropertyAddressPlcField struct {
 	KnxNetIpField
 }
 
-func NewKnxNetIpDevicePropertyAddressPlcField(fieldType *driverModel.KnxDatapointType, mainGroup string, middleGroup string, subGroup string, objectId string, propertyId string) KnxNetIpDevicePropertyAddressPlcField {
+func NewKnxNetIpDevicePropertyAddressPlcField(fieldType *driverModel.KnxDatapointSubtype, mainGroup string, middleGroup string, subGroup string, objectId string, propertyId string) KnxNetIpDevicePropertyAddressPlcField {
 	return KnxNetIpDevicePropertyAddressPlcField{
 		FieldType:   fieldType,
 		MainGroup:   mainGroup,
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go
index 2971763..8490018 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpFieldHandler.go
@@ -63,30 +63,30 @@ func NewFieldHandler() FieldHandler {
 func (m FieldHandler) ParseQuery(query string) (apiModel.PlcField, error) {
 	if match := utils.GetSubgroupMatches(m.knxNetIpDeviceQuery, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointType
+		var fieldType driverModel.KnxDatapointSubtype
 		if ok {
-			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpDevicePropertyAddressPlcField(&fieldType, match["mainGroup"], match["middleGroup"], match["subGroup"], match["objectId"], match["propertyId"]), nil
 	} else if match := utils.GetSubgroupMatches(m.knxNetIpGroupAddress3Level, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointType
+		var fieldType driverModel.KnxDatapointSubtype
 		if ok {
-			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpGroupAddress3LevelPlcField(&fieldType, match["mainGroup"], match["middleGroup"], match["subGroup"]), nil
 	} else if match := utils.GetSubgroupMatches(m.knxNetIpGroupAddress2Level, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointType
+		var fieldType driverModel.KnxDatapointSubtype
 		if ok {
-			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpGroupAddress2LevelPlcField(&fieldType, match["mainGroup"], match["subGroup"]), nil
 	} else if match := utils.GetSubgroupMatches(m.knxNetIpGroupAddress1Level, query); match != nil {
 		fieldTypeName, ok := match["datatype"]
-		var fieldType driverModel.KnxDatapointType
+		var fieldType driverModel.KnxDatapointSubtype
 		if ok {
-			fieldType = driverModel.KnxDatapointTypeByName(fieldTypeName)
+			fieldType = driverModel.KnxDatapointSubtypeByName(fieldTypeName)
 		}
 		return NewKnxNetIpGroupAddress1LevelPlcField(&fieldType, match["mainGroup"]), nil
 	}
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpMessageCodec.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpMessageCodec.go
index ffa1226..479d4b6 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpMessageCodec.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpMessageCodec.go
@@ -127,6 +127,7 @@ func (m *KnxNetIpMessageCodec) receive() (interface{}, error) {
 			rb := utils.NewReadBuffer(data)
 			knxMessage, err := model.KnxNetIpMessageParse(rb)
 			if err != nil {
+			    fmt.Printf("Got error parsing message: %s\n", err.Error())
 				// TODO: Possibly clean up ...
 				return nil, nil
 			}
@@ -155,7 +156,7 @@ func work(m *KnxNetIpMessageCodec) {
 				continue
 			}
 
-			// If this is an incoming KNXNet/IP UDP Packet, automatically send an ACK
+            // If this is an incoming KNXNet/IP UDP Packet, automatically send an ACK
 			tunnelingRequest := model.CastTunnelingRequest(message)
 			if tunnelingRequest != nil {
 				response := model.NewTunnelingResponse(
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go
index b69cc5f..d658b5f 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go
@@ -127,15 +127,13 @@ func (m KnxNetIpReader) Read(readRequest apiModel.PlcReadRequest) <-chan apiMode
 
 func (m KnxNetIpReader) connectToDevice(targetAddress driverModel.KnxAddress) error {
 	connectionSuccess := make(chan bool)
-	controlType := driverModel.ControlType_CONNECT
 	deviceConnectionRequest := driverModel.NewTunnelingRequest(
 		driverModel.NewTunnelingRequestDataBlock(0, 0),
 		driverModel.NewLDataReq(0, nil,
-			driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
+			driverModel.NewLDataFrameDataExt(false, 6, 0,
 				driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
-				uint8(0), true, false, uint8(0), &controlType, nil, nil,
-				nil, nil, true, driverModel.CEMIPriority_SYSTEM, false,
-				false)))
+				driverModel.NewApduControlContainer(driverModel.NewApduControlConnect(), 0, false, 0),
+				true, true, driverModel.CEMIPriority_SYSTEM,  false, false)))
 
 	// Send the request
 	err := m.connection.SendRequest(
@@ -159,16 +157,13 @@ func (m KnxNetIpReader) connectToDevice(targetAddress driverModel.KnxAddress) er
 			}
 
 			// Now for some reason it seems as if we need to implement a Device Descriptor read.
-			apciType := driverModel.APCI_DEVICE_DESCRIPTOR_READ_PDU
-			dataFirstByte := int8(0)
 			deviceDescriptorReadRequest := driverModel.NewTunnelingRequest(
 				driverModel.NewTunnelingRequestDataBlock(0, 0),
 				driverModel.NewLDataReq(0, nil,
 					driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
 						driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
-						uint8(1), false, true, uint8(0), nil, &apciType, nil,
-						&dataFirstByte, nil, true, driverModel.CEMIPriority_LOW, false,
-						false)))
+                        driverModel.NewApduDataContainer(driverModel.NewApduDataDeviceDescriptorRead(), 0, false, 0),
+						true, true, driverModel.CEMIPriority_LOW, false, false)))
 			_ = m.connection.SendRequest(
 				deviceDescriptorReadRequest,
 				func(message interface{}) bool {
@@ -185,14 +180,14 @@ func (m KnxNetIpReader) connectToDevice(targetAddress driverModel.KnxAddress) er
 					if dataFrame == nil {
 						return false
 					}
-					if dataFrame.Apci == nil {
+					if dataFrame.Apdu == nil {
 						return false
 					}
-					return *dataFrame.Apci == driverModel.APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU
+					return true
+					//return *dataFrame.Apdu.Apci == driverModel.APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU
 					// TODO: Do something with the request ...
 				},
 				func(message interface{}) error {
-					controlType = driverModel.ControlType_ACK
 					// Send back an ACK
 					_ = m.connection.Send(
 						driverModel.NewTunnelingRequest(
@@ -200,9 +195,8 @@ func (m KnxNetIpReader) connectToDevice(targetAddress driverModel.KnxAddress) er
 							driverModel.NewLDataReq(0, nil,
 								driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
 									driverModel.NewKnxAddress(0, 0, 0), KnxAddressToInt8Array(targetAddress),
-									uint8(0), true, true, uint8(0), &controlType, nil, nil,
-									nil, nil, true, driverModel.CEMIPriority_SYSTEM, false,
-									false))))
+									driverModel.NewApduControlContainer(driverModel.NewApduControlAck(), 0, false, 0),
+									true, true, driverModel.CEMIPriority_SYSTEM, false, false))))
 					// Now we can finally read properties.
 					connectionSuccess <- true
 					return nil
@@ -227,14 +221,13 @@ func (m KnxNetIpReader) connectToDevice(targetAddress driverModel.KnxAddress) er
 }
 
 func (m KnxNetIpReader) disconnectFromDevice(sourceAddress driverModel.KnxAddress, targetAddress driverModel.KnxAddress) error {
-	controlType := driverModel.ControlType_DISCONNECT
 	deviceConnectionRequest := driverModel.NewTunnelingRequest(
 		driverModel.NewTunnelingRequestDataBlock(0, 0),
 		driverModel.NewLDataReq(0, nil,
 			driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
-				&sourceAddress, KnxAddressToInt8Array(targetAddress), uint8(0), true, false,
-				uint8(0), &controlType, nil, nil, nil, nil,
-				true, driverModel.CEMIPriority_SYSTEM, false, false)))
+				&sourceAddress, KnxAddressToInt8Array(targetAddress),
+                driverModel.NewApduControlContainer(driverModel.NewApduControlDisconnect(), 0, false,0),
+                true, true, driverModel.CEMIPriority_SYSTEM, false, false)))
 
 	// Send the request
 	connectionSuccess := make(chan bool)
@@ -255,15 +248,16 @@ func (m KnxNetIpReader) disconnectFromDevice(sourceAddress driverModel.KnxAddres
 			if frameDataExt == nil {
 				return false
 			}
-			return frameDataExt.Control == true && frameDataExt.ControlType == nil
+			return true
+			//return frameDataExt.Control == true && frameDataExt.ControlType == nil
 		},
 		func(message interface{}) error {
 			tunnelingRequest := driverModel.CastTunnelingRequest(message)
 			lDataCon := driverModel.CastLDataCon(tunnelingRequest.Cemi)
-			frameDataExt := driverModel.CastLDataFrameDataExt(lDataCon.DataFrame)
-			if *frameDataExt.ControlType == driverModel.ControlType_DISCONNECT {
+			_ = driverModel.CastLDataFrameDataExt(lDataCon.DataFrame)
+			//if *frameDataExt.ControlType == driverModel.ControlType_DISCONNECT {
 				connectionSuccess <- false
-			}
+			//}
 			return nil
 		},
 		time.Second*1)
@@ -303,24 +297,16 @@ func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPl
 	objectId, _ := strconv.Atoi(field.ObjectId)
 	propertyId, _ := strconv.Atoi(field.PropertyId)
 
-	apci := driverModel.APCI_OTHER_PDU
-	extendedApci := driverModel.ExtendedAPCI_PROPERTY_VALUE_READ_PDU
-	data := make([]int8, 4)
-	// Object Id
-	data[0] = int8(objectId)
-	// Property Id
-	data[1] = int8(propertyId)
-	// First 4 bits = count
-	data[2] = 16
-	// Index (including last 4 bits of previous byte)
-	data[3] = 1
 	request := driverModel.NewTunnelingRequest(
 		driverModel.NewTunnelingRequestDataBlock(0, 0),
 		driverModel.NewLDataReq(0, nil,
 			driverModel.NewLDataFrameDataExt(false, 6, 0,
-				driverModel.NewKnxAddress(0, 0, 0), destinationAddressData, 5,
-				false, true, counter, nil, &apci, &extendedApci,
-				nil, data, true, 3, false, false)))
+				driverModel.NewKnxAddress(0, 0, 0),
+                destinationAddressData,
+				driverModel.NewApduDataContainer(driverModel.NewApduDataOther(
+				    // TODO: The counter should be incremented per KNX individual address
+				    driverModel.NewApduDataExtPropertyValueRead(uint8(objectId), uint8(propertyId), 1, 1)), 0, true, 1),
+				 true, true,  driverModel.CEMIPriority_SYSTEM, false, false)))
 
 	result := make(chan readPropertyResult)
 	err = m.connection.SendRequest(
@@ -339,11 +325,14 @@ func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPl
 				return false
 			}
 			dataFrameExt := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
-			if dataFrameExt != nil && dataFrameExt.Apci != nil {
-				if *dataFrameExt.Apci != driverModel.APCI_OTHER_PDU {
+			if dataFrameExt != nil && dataFrameExt.Apdu != nil {
+                otherPdu := driverModel.CastApduDataOther(*dataFrameExt.Apdu)
+                if otherPdu == nil {
 					return false
 				}
-				if *dataFrameExt.ExtendedApci != driverModel.ExtendedAPCI_PROPERTY_VALUE_RESPONSE_PDU {
+
+                propertyValueResponse := driverModel.CastApduDataExtPropertyValueResponse(otherPdu.ExtendedApdu)
+                if propertyValueResponse == nil {
 					return false
 				}
 				if *dataFrameExt.SourceAddress != *destinationAddress {
@@ -352,21 +341,12 @@ func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPl
 				if *Int8ArrayToKnxAddress(dataFrameExt.DestinationAddress) != *m.connection.ClientKnxAddress {
 					return false
 				}
-				if dataFrameExt.DataLength < 5 {
-					return false
-				}
-				if *dataFrameExt.Apci == driverModel.APCI_OTHER_PDU &&
-					*dataFrameExt.ExtendedApci == driverModel.ExtendedAPCI_PROPERTY_VALUE_RESPONSE_PDU &&
-					*dataFrameExt.SourceAddress == *destinationAddress &&
-					*Int8ArrayToKnxAddress(dataFrameExt.DestinationAddress) == *m.connection.ClientKnxAddress &&
-					dataFrameExt.DataLength >= 5 {
-					readBuffer := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(dataFrameExt.Data))
-					curObjectId, _ := readBuffer.ReadUint8(8)
-					curPropertyId, _ := readBuffer.ReadUint8(8)
-					if curObjectId == uint8(objectId) && curPropertyId == uint8(propertyId) {
-						return true
-					}
-				}
+                readBuffer := utils.NewReadBuffer(propertyValueResponse.Data)
+                curObjectId, _ := readBuffer.ReadUint8(8)
+                curPropertyId, _ := readBuffer.ReadUint8(8)
+                if curObjectId == uint8(objectId) && curPropertyId == uint8(propertyId) {
+                    return true
+                }
 			}
 			return false
 		},
@@ -374,13 +354,15 @@ func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPl
 			tunnelingRequest := driverModel.CastTunnelingRequest(message)
 			lDataInd := driverModel.CastLDataInd(tunnelingRequest.Cemi)
 			dataFrameExt := driverModel.CastLDataFrameDataExt(lDataInd.DataFrame)
+            otherPdu := driverModel.CastApduDataOther(*dataFrameExt.Apdu)
+            propertyValueResponse := driverModel.CastApduDataExtPropertyValueResponse(otherPdu.ExtendedApdu)
 
-			readBuffer := utils.NewReadBuffer(utils.Int8ArrayToUint8Array(dataFrameExt.Data))
+			readBuffer := utils.NewReadBuffer(propertyValueResponse.Data)
 			// Skip the object id and property id as we already checked them
 			_, _ = readBuffer.ReadUint8(8)
 			_, _ = readBuffer.ReadUint8(8)
 
-			count, _ := readBuffer.ReadUint8(4)
+			propertyCount, _ := readBuffer.ReadUint8(4)
 			_ /*index*/, _ = readBuffer.ReadUint16(12)
 
 			// If the return is a count of 0, then we can't access this property (Doesn't exist or not allowed to)
@@ -388,14 +370,11 @@ func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPl
 			// as this can be understood as "found no property we have access to"
 			// ("03_03_07 Application Layer v01.06.02 AS" Page 52)
 			var propResult readPropertyResult
-			if count == 0 {
+			if propertyCount == 0 {
 				propResult = readPropertyResult{
 					responseCode: apiModel.PlcResponseCode_NOT_FOUND,
 				}
 			} else {
-				// Read the data payload.
-				dataLength := dataFrameExt.DataLength - 5
-
 				// Depending on the object id and property id, parse the remaining data accordingly.
 				property := driverModel.KnxInterfaceObjectProperty_PID_UNKNOWN
 				for i := driverModel.KnxInterfaceObjectProperty_PID_UNKNOWN; i < driverModel.KnxInterfaceObjectProperty_PID_SUNBLIND_SENSOR_BASIC_ENABLE_TOGGLE_MODE; i++ {
@@ -408,24 +387,22 @@ func (m KnxNetIpReader) readDeviceProperty(field KnxNetIpDevicePropertyAddressPl
 
 				// Parse the payload according to the specified datatype
 				dataType := property.PropertyDataType()
-				plcValue := readwrite.ParsePropertyDataType(*readBuffer, dataType, dataLength)
+				plcValue := readwrite.ParsePropertyDataType(*readBuffer, dataType, dataType.SizeInBytes())
 				propResult = readPropertyResult{
 					plcValue:     plcValue,
 					responseCode: apiModel.PlcResponseCode_OK,
 				}
 			}
 
-			// Send back an ACK
-			controlType := driverModel.ControlType_ACK
-			_ = m.connection.Send(
-				driverModel.NewTunnelingRequest(
-					driverModel.NewTunnelingRequestDataBlock(0, 0),
-					driverModel.NewLDataReq(0, nil,
-						driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
-							driverModel.NewKnxAddress(0, 0, 0), destinationAddressData,
-							uint8(0), true, true, dataFrameExt.Counter, &controlType, nil,
-							nil, nil, nil, true, driverModel.CEMIPriority_SYSTEM,
-							false, false))))
+            // Send back an ACK
+            _ = m.connection.Send(
+                driverModel.NewTunnelingRequest(
+                    driverModel.NewTunnelingRequestDataBlock(0, 0),
+                    driverModel.NewLDataReq(0, nil,
+                        driverModel.NewLDataFrameDataExt(false, 6, uint8(0),
+                            driverModel.NewKnxAddress(0, 0, 0), destinationAddressData,
+                            driverModel.NewApduControlContainer(driverModel.NewApduControlAck(), 0, false, 0),
+                            true, true, driverModel.CEMIPriority_SYSTEM, false, false))))
 
 			result <- propResult
 			return nil
diff --git a/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go b/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go
index 856a408..0a630f9 100644
--- a/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go
+++ b/plc4go/internal/plc4go/knxnetip/KnxNetIpSubscriber.go
@@ -79,20 +79,25 @@ func (m *KnxNetIpSubscriber) Unsubscribe(unsubscriptionRequest apiModel.PlcUnsub
  */
 func (m *KnxNetIpSubscriber) handleValueChange(lDataFrame *driverModel.LDataFrame, changed bool) {
 	var destinationAddress []int8
-	var dataFirstByte *int8
-	var data []int8
+    var apdu *driverModel.Apdu
 	switch lDataFrame.Child.(type) {
 	case *driverModel.LDataFrameData:
 		dataFrame := driverModel.CastLDataFrameData(lDataFrame)
 		destinationAddress = dataFrame.DestinationAddress
-		dataFirstByte = dataFrame.DataFirstByte
-		data = dataFrame.Data
+        apdu = dataFrame.Apdu
 	case *driverModel.LDataFrameDataExt:
 		dataFrame := driverModel.CastLDataFrameDataExt(lDataFrame)
 		destinationAddress = dataFrame.DestinationAddress
-		dataFirstByte = dataFrame.DataFirstByte
-		data = dataFrame.Data
+        apdu = dataFrame.Apdu
 	}
+    container := driverModel.CastApduDataContainer(apdu)
+    if container == nil {
+        return
+    }
+    groupValueWrite := driverModel.CastApduDataGroupValueWrite(container.DataApdu)
+    if groupValueWrite == nil {
+        return
+    }
 
 	if destinationAddress != nil {
 		// Decode the group-address according to the settings in the driver
@@ -122,27 +127,25 @@ func (m *KnxNetIpSubscriber) handleValueChange(lDataFrame *driverModel.LDataFram
 				subscriptionType := subscriptionRequest.GetType(fieldName)
 				// If it matches, take the datatype of each matching field and try to decode the payload
 				if field.matches(groupAddress) {
-					// If this is a CHANGE_OF_STATE field, filter out the events where the value actually hasn't changed.
+                    // If this is a CHANGE_OF_STATE field, filter out the events where the value actually hasn't changed.
 					if subscriptionType == internalModel.SUBSCRIPTION_CHANGE_OF_STATE && changed {
-						if dataFirstByte != nil {
-							var payload []uint8
-							payload = append(payload, uint8(*dataFirstByte))
-							payload = append(payload, utils.Int8ArrayToByteArray(data)...)
-							rb := utils.NewReadBuffer(payload)
-							plcValue, err := driverModel.KnxDatapointParse(rb, field.GetTypeName())
-							fields[fieldName] = field
-							types[fieldName] = subscriptionRequest.GetType(fieldName)
-							intervals[fieldName] = subscriptionRequest.GetInterval(fieldName)
-							addresses[fieldName] = destinationAddress
-							if err == nil {
-								responseCodes[fieldName] = apiModel.PlcResponseCode_OK
-								plcValues[fieldName] = plcValue
-							} else {
-								// TODO: Do a little more here ...
-								responseCodes[fieldName] = apiModel.PlcResponseCode_INTERNAL_ERROR
-								plcValues[fieldName] = nil
-							}
-						}
+                        var payload []int8
+                        payload = append(payload, groupValueWrite.DataFirstByte)
+                        payload = append(payload, groupValueWrite.Data...)
+                        rb := utils.NewReadBuffer(utils.Int8ArrayToByteArray(payload))
+                        plcValue, err := driverModel.KnxDatapointParse(rb, field.GetTypeName())
+                        fields[fieldName] = field
+                        types[fieldName] = subscriptionRequest.GetType(fieldName)
+                        intervals[fieldName] = subscriptionRequest.GetInterval(fieldName)
+                        addresses[fieldName] = destinationAddress
+                        if err == nil {
+                            responseCodes[fieldName] = apiModel.PlcResponseCode_OK
+                            plcValues[fieldName] = plcValue
+                        } else {
+                            // TODO: Do a little more here ...
+                            responseCodes[fieldName] = apiModel.PlcResponseCode_INTERNAL_ERROR
+                            plcValues[fieldName] = nil
+                        }
 					}
 				}
 			}
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go b/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go
index cea565b..d1ddcd9 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/ParserHelper.go
@@ -19,71 +19,91 @@
 package readwrite
 
 import (
-	"errors"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite/model"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite/model"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 )
 
 type KnxnetipParserHelper struct {
 }
 
 func (m KnxnetipParserHelper) Parse(typeName string, arguments []string, io *utils.ReadBuffer) (spi.Message, error) {
-	switch typeName {
-	case "HPAIControlEndpoint":
-		return model.HPAIControlEndpointParse(io)
-	case "TunnelingResponseDataBlock":
-		return model.TunnelingResponseDataBlockParse(io)
-	case "DeviceConfigurationAckDataBlock":
-		return model.DeviceConfigurationAckDataBlockParse(io)
-	case "ConnectionRequestInformation":
-		return model.ConnectionRequestInformationParse(io)
-	case "HPAIDiscoveryEndpoint":
-		return model.HPAIDiscoveryEndpointParse(io)
-	case "ProjectInstallationIdentifier":
-		return model.ProjectInstallationIdentifierParse(io)
-	case "ServiceId":
-		return model.ServiceIdParse(io)
-	case "HPAIDataEndpoint":
-		return model.HPAIDataEndpointParse(io)
-	case "RelativeTimestamp":
-		return model.RelativeTimestampParse(io)
-	case "CEMI":
-		size, err := utils.StrToUint8(arguments[0])
-		if err != nil {
-			return nil, err
-		}
-		return model.CEMIParse(io, size)
-	case "KnxNetIpMessage":
-		return model.KnxNetIpMessageParse(io)
-	case "DeviceStatus":
-		return model.DeviceStatusParse(io)
-	case "IPAddress":
-		return model.IPAddressParse(io)
-	case "CEMIAdditionalInformation":
-		return model.CEMIAdditionalInformationParse(io)
-	case "KnxAddress":
-		return model.KnxAddressParse(io)
-	case "ConnectionResponseDataBlock":
-		return model.ConnectionResponseDataBlockParse(io)
-	case "TunnelingRequestDataBlock":
-		return model.TunnelingRequestDataBlockParse(io)
-	case "DIBDeviceInfo":
-		return model.DIBDeviceInfoParse(io)
-	case "DeviceConfigurationRequestDataBlock":
-		return model.DeviceConfigurationRequestDataBlockParse(io)
-	case "DIBSuppSvcFamilies":
-		return model.DIBSuppSvcFamiliesParse(io)
-	case "LDataFrame":
-		return model.LDataFrameParse(io)
-	case "KnxGroupAddress":
-		numLevels, err := utils.StrToUint8(arguments[0])
-		if err != nil {
-			return nil, err
-		}
-		return model.KnxGroupAddressParse(io, numLevels)
-	case "MACAddress":
-		return model.MACAddressParse(io)
-	}
-	return nil, errors.New("Unsupported type " + typeName)
+    switch typeName {
+    case "HPAIControlEndpoint":
+        return model.HPAIControlEndpointParse(io)
+    case "TunnelingResponseDataBlock":
+        return model.TunnelingResponseDataBlockParse(io)
+    case "DeviceDescriptorType2":
+        return model.DeviceDescriptorType2Parse(io)
+    case "ChannelInformation":
+        return model.ChannelInformationParse(io)
+    case "DeviceConfigurationAckDataBlock":
+        return model.DeviceConfigurationAckDataBlockParse(io)
+    case "ConnectionRequestInformation":
+        return model.ConnectionRequestInformationParse(io)
+    case "Apdu":
+        return model.ApduParse(io)
+    case "HPAIDiscoveryEndpoint":
+        return model.HPAIDiscoveryEndpointParse(io)
+    case "ProjectInstallationIdentifier":
+        return model.ProjectInstallationIdentifierParse(io)
+    case "ServiceId":
+        return model.ServiceIdParse(io)
+    case "HPAIDataEndpoint":
+        return model.HPAIDataEndpointParse(io)
+    case "RelativeTimestamp":
+        return model.RelativeTimestampParse(io)
+    case "CEMI":
+        size, err := utils.StrToUint8(arguments[0])
+        if err != nil {
+            return nil, err
+        }
+        return model.CEMIParse(io, size)
+    case "KnxNetIpMessage":
+        return model.KnxNetIpMessageParse(io)
+    case "DeviceStatus":
+        return model.DeviceStatusParse(io)
+    case "IPAddress":
+        return model.IPAddressParse(io)
+    case "CEMIAdditionalInformation":
+        return model.CEMIAdditionalInformationParse(io)
+    case "KnxAddress":
+        return model.KnxAddressParse(io)
+    case "ConnectionResponseDataBlock":
+        return model.ConnectionResponseDataBlockParse(io)
+    case "TunnelingRequestDataBlock":
+        return model.TunnelingRequestDataBlockParse(io)
+    case "DIBDeviceInfo":
+        return model.DIBDeviceInfoParse(io)
+    case "DeviceConfigurationRequestDataBlock":
+        return model.DeviceConfigurationRequestDataBlockParse(io)
+    case "DIBSuppSvcFamilies":
+        return model.DIBSuppSvcFamiliesParse(io)
+    case "LDataFrame":
+        return model.LDataFrameParse(io)
+    case "ApduDataExt":
+        length, err := utils.StrToUint8(arguments[0])
+        if err != nil {
+            return nil, err
+        }
+        return model.ApduDataExtParse(io, length)
+    case "ApduControl":
+        return model.ApduControlParse(io)
+    case "KnxGroupAddress":
+        numLevels, err := utils.StrToUint8(arguments[0])
+        if err != nil {
+            return nil, err
+        }
+        return model.KnxGroupAddressParse(io, numLevels)
+    case "MACAddress":
+        return model.MACAddressParse(io)
+    case "ApduData":
+        dataLength, err := utils.StrToUint8(arguments[0])
+        if err != nil {
+            return nil, err
+        }
+        return model.ApduDataParse(io, dataLength)
+    }
+    return nil, errors.New("Unsupported type " + typeName)
 }
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go
index 29003ae..95ca62e 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/XmlParserHelper.go
@@ -19,178 +19,220 @@
 package readwrite
 
 import (
-	"encoding/xml"
-	"errors"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite/model"
-	"github.com/apache/plc4x/plc4go/internal/plc4go/spi"
+    "encoding/xml"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/knxnetip/readwrite/model"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi"
 )
 
 type KnxnetipXmlParserHelper struct {
 }
 
 func (m KnxnetipXmlParserHelper) Parse(typeName string, xmlString string) (spi.Message, error) {
-	switch typeName {
-	case "HPAIControlEndpoint":
-		var obj *model.HPAIControlEndpoint
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "TunnelingResponseDataBlock":
-		var obj *model.TunnelingResponseDataBlock
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "DeviceConfigurationAckDataBlock":
-		var obj *model.DeviceConfigurationAckDataBlock
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "ConnectionRequestInformation":
-		var obj *model.ConnectionRequestInformation
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "HPAIDiscoveryEndpoint":
-		var obj *model.HPAIDiscoveryEndpoint
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "ProjectInstallationIdentifier":
-		var obj *model.ProjectInstallationIdentifier
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "ServiceId":
-		var obj *model.ServiceId
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "HPAIDataEndpoint":
-		var obj *model.HPAIDataEndpoint
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "RelativeTimestamp":
-		var obj *model.RelativeTimestamp
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "CEMI":
-		var obj *model.CEMI
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "KnxNetIpMessage":
-		var obj *model.KnxNetIpMessage
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "DeviceStatus":
-		var obj *model.DeviceStatus
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "IPAddress":
-		var obj *model.IPAddress
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "CEMIAdditionalInformation":
-		var obj *model.CEMIAdditionalInformation
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "KnxAddress":
-		var obj *model.KnxAddress
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "ConnectionResponseDataBlock":
-		var obj *model.ConnectionResponseDataBlock
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "TunnelingRequestDataBlock":
-		var obj *model.TunnelingRequestDataBlock
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "DIBDeviceInfo":
-		var obj *model.DIBDeviceInfo
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "DeviceConfigurationRequestDataBlock":
-		var obj *model.DeviceConfigurationRequestDataBlock
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "DIBSuppSvcFamilies":
-		var obj *model.DIBSuppSvcFamilies
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "LDataFrame":
-		var obj *model.LDataFrame
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "KnxGroupAddress":
-		var obj *model.KnxGroupAddress
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	case "MACAddress":
-		var obj *model.MACAddress
-		err := xml.Unmarshal([]byte(xmlString), &obj)
-		if err != nil {
-			return nil, errors.New("error unmarshalling xml: " + err.Error())
-		}
-		return obj, nil
-	}
-	return nil, errors.New("Unsupported type " + typeName)
+    switch typeName {
+    case "HPAIControlEndpoint":
+        var obj *model.HPAIControlEndpoint
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "TunnelingResponseDataBlock":
+        var obj *model.TunnelingResponseDataBlock
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "DeviceDescriptorType2":
+        var obj *model.DeviceDescriptorType2
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ChannelInformation":
+        var obj *model.ChannelInformation
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "DeviceConfigurationAckDataBlock":
+        var obj *model.DeviceConfigurationAckDataBlock
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ConnectionRequestInformation":
+        var obj *model.ConnectionRequestInformation
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "Apdu":
+        var obj *model.Apdu
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "HPAIDiscoveryEndpoint":
+        var obj *model.HPAIDiscoveryEndpoint
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ProjectInstallationIdentifier":
+        var obj *model.ProjectInstallationIdentifier
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ServiceId":
+        var obj *model.ServiceId
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "HPAIDataEndpoint":
+        var obj *model.HPAIDataEndpoint
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "RelativeTimestamp":
+        var obj *model.RelativeTimestamp
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "CEMI":
+        var obj *model.CEMI
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "KnxNetIpMessage":
+        var obj *model.KnxNetIpMessage
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "DeviceStatus":
+        var obj *model.DeviceStatus
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "IPAddress":
+        var obj *model.IPAddress
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "CEMIAdditionalInformation":
+        var obj *model.CEMIAdditionalInformation
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "KnxAddress":
+        var obj *model.KnxAddress
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ConnectionResponseDataBlock":
+        var obj *model.ConnectionResponseDataBlock
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "TunnelingRequestDataBlock":
+        var obj *model.TunnelingRequestDataBlock
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "DIBDeviceInfo":
+        var obj *model.DIBDeviceInfo
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "DeviceConfigurationRequestDataBlock":
+        var obj *model.DeviceConfigurationRequestDataBlock
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "DIBSuppSvcFamilies":
+        var obj *model.DIBSuppSvcFamilies
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "LDataFrame":
+        var obj *model.LDataFrame
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ApduDataExt":
+        var obj *model.ApduDataExt
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ApduControl":
+        var obj *model.ApduControl
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "KnxGroupAddress":
+        var obj *model.KnxGroupAddress
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "MACAddress":
+        var obj *model.MACAddress
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    case "ApduData":
+        var obj *model.ApduData
+        err := xml.Unmarshal([]byte(xmlString), &obj)
+        if err != nil {
+            return nil, errors.New("error unmarshalling xml: " + err.Error())
+        }
+        return obj, nil
+    }
+    return nil, errors.New("Unsupported type " + typeName)
 }
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
deleted file mode 100644
index 4023f52..0000000
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
+++ /dev/null
@@ -1,193 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-package model
-
-import (
-    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
-)
-
-type APCI uint8
-
-type IAPCI interface {
-    Serialize(io utils.WriteBuffer) error
-}
-
-const(
-    APCI_GROUP_VALUE_READ_PDU APCI = 0x0
-    APCI_GROUP_VALUE_RESPONSE_PDU APCI = 0x1
-    APCI_GROUP_VALUE_WRITE_PDU APCI = 0x2
-    APCI_INDIVIDUAL_ADDRESS_WRITE_PDU APCI = 0x3
-    APCI_INDIVIDUAL_ADDRESS_READ_PDU APCI = 0x4
-    APCI_INDIVIDUAL_ADDRESS_RESPONSE_PDU APCI = 0x5
-    APCI_ADC_READ_PDU APCI = 0x6
-    APCI_ADC_RESPONSE_PDU APCI = 0x7
-    APCI_MEMORY_READ_PDU APCI = 0x8
-    APCI_MEMORY_RESPONSE_PDU APCI = 0x9
-    APCI_MEMORY_WRITE_PDU APCI = 0xA
-    APCI_USER_MESSAGE_PDU APCI = 0xB
-    APCI_DEVICE_DESCRIPTOR_READ_PDU APCI = 0xC
-    APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU APCI = 0xD
-    APCI_RESTART_PDU APCI = 0xE
-    APCI_OTHER_PDU APCI = 0xF
-)
-
-func APCIByValue(value uint8) APCI {
-    switch value {
-        case 0x0:
-            return APCI_GROUP_VALUE_READ_PDU
-        case 0x1:
-            return APCI_GROUP_VALUE_RESPONSE_PDU
-        case 0x2:
-            return APCI_GROUP_VALUE_WRITE_PDU
-        case 0x3:
-            return APCI_INDIVIDUAL_ADDRESS_WRITE_PDU
-        case 0x4:
-            return APCI_INDIVIDUAL_ADDRESS_READ_PDU
-        case 0x5:
-            return APCI_INDIVIDUAL_ADDRESS_RESPONSE_PDU
-        case 0x6:
-            return APCI_ADC_READ_PDU
-        case 0x7:
-            return APCI_ADC_RESPONSE_PDU
-        case 0x8:
-            return APCI_MEMORY_READ_PDU
-        case 0x9:
-            return APCI_MEMORY_RESPONSE_PDU
-        case 0xA:
-            return APCI_MEMORY_WRITE_PDU
-        case 0xB:
-            return APCI_USER_MESSAGE_PDU
-        case 0xC:
-            return APCI_DEVICE_DESCRIPTOR_READ_PDU
-        case 0xD:
-            return APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU
-        case 0xE:
-            return APCI_RESTART_PDU
-        case 0xF:
-            return APCI_OTHER_PDU
-    }
-    return 0
-}
-
-func APCIByName(value string) APCI {
-    switch value {
-    case "GROUP_VALUE_READ_PDU":
-        return APCI_GROUP_VALUE_READ_PDU
-    case "GROUP_VALUE_RESPONSE_PDU":
-        return APCI_GROUP_VALUE_RESPONSE_PDU
-    case "GROUP_VALUE_WRITE_PDU":
-        return APCI_GROUP_VALUE_WRITE_PDU
-    case "INDIVIDUAL_ADDRESS_WRITE_PDU":
-        return APCI_INDIVIDUAL_ADDRESS_WRITE_PDU
-    case "INDIVIDUAL_ADDRESS_READ_PDU":
-        return APCI_INDIVIDUAL_ADDRESS_READ_PDU
-    case "INDIVIDUAL_ADDRESS_RESPONSE_PDU":
-        return APCI_INDIVIDUAL_ADDRESS_RESPONSE_PDU
-    case "ADC_READ_PDU":
-        return APCI_ADC_READ_PDU
-    case "ADC_RESPONSE_PDU":
-        return APCI_ADC_RESPONSE_PDU
-    case "MEMORY_READ_PDU":
-        return APCI_MEMORY_READ_PDU
-    case "MEMORY_RESPONSE_PDU":
-        return APCI_MEMORY_RESPONSE_PDU
-    case "MEMORY_WRITE_PDU":
-        return APCI_MEMORY_WRITE_PDU
-    case "USER_MESSAGE_PDU":
-        return APCI_USER_MESSAGE_PDU
-    case "DEVICE_DESCRIPTOR_READ_PDU":
-        return APCI_DEVICE_DESCRIPTOR_READ_PDU
-    case "DEVICE_DESCRIPTOR_RESPONSE_PDU":
-        return APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU
-    case "RESTART_PDU":
-        return APCI_RESTART_PDU
-    case "OTHER_PDU":
-        return APCI_OTHER_PDU
-    }
-    return 0
-}
-
-func CastAPCI(structType interface{}) APCI {
-    castFunc := func(typ interface{}) APCI {
-        if sAPCI, ok := typ.(APCI); ok {
-            return sAPCI
-        }
-        return 0
-    }
-    return castFunc(structType)
-}
-
-func (m APCI) LengthInBits() uint16 {
-    return 4
-}
-
-func (m APCI) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
-}
-
-func APCIParse(io *utils.ReadBuffer) (APCI, error) {
-    val, err := io.ReadUint8(4)
-    if err != nil {
-        return 0, nil
-    }
-    return APCIByValue(val), nil
-}
-
-func (e APCI) Serialize(io utils.WriteBuffer) error {
-    err := io.WriteUint8(4, uint8(e))
-    return err
-}
-
-func (e APCI) String() string {
-    switch e {
-    case APCI_GROUP_VALUE_READ_PDU:
-        return "GROUP_VALUE_READ_PDU"
-    case APCI_GROUP_VALUE_RESPONSE_PDU:
-        return "GROUP_VALUE_RESPONSE_PDU"
-    case APCI_GROUP_VALUE_WRITE_PDU:
-        return "GROUP_VALUE_WRITE_PDU"
-    case APCI_INDIVIDUAL_ADDRESS_WRITE_PDU:
-        return "INDIVIDUAL_ADDRESS_WRITE_PDU"
-    case APCI_INDIVIDUAL_ADDRESS_READ_PDU:
-        return "INDIVIDUAL_ADDRESS_READ_PDU"
-    case APCI_INDIVIDUAL_ADDRESS_RESPONSE_PDU:
-        return "INDIVIDUAL_ADDRESS_RESPONSE_PDU"
-    case APCI_ADC_READ_PDU:
-        return "ADC_READ_PDU"
-    case APCI_ADC_RESPONSE_PDU:
-        return "ADC_RESPONSE_PDU"
-    case APCI_MEMORY_READ_PDU:
-        return "MEMORY_READ_PDU"
-    case APCI_MEMORY_RESPONSE_PDU:
-        return "MEMORY_RESPONSE_PDU"
-    case APCI_MEMORY_WRITE_PDU:
-        return "MEMORY_WRITE_PDU"
-    case APCI_USER_MESSAGE_PDU:
-        return "USER_MESSAGE_PDU"
-    case APCI_DEVICE_DESCRIPTOR_READ_PDU:
-        return "DEVICE_DESCRIPTOR_READ_PDU"
-    case APCI_DEVICE_DESCRIPTOR_RESPONSE_PDU:
-        return "DEVICE_DESCRIPTOR_RESPONSE_PDU"
-    case APCI_RESTART_PDU:
-        return "RESTART_PDU"
-    case APCI_OTHER_PDU:
-        return "OTHER_PDU"
-    }
-    return ""
-}
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/Apdu.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/Apdu.go
new file mode 100644
index 0000000..9bee363
--- /dev/null
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/Apdu.go
@@ -0,0 +1,286 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package model
+
+import (
+    "encoding/xml"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "io"
+    "reflect"
+    "strings"
+)
+
+// The data-structure of this message
+type Apdu struct {
+    DataLength uint8
+    Numbered bool
+    Counter uint8
+    Child IApduChild
+    IApdu
+    IApduParent
+}
+
+// The corresponding interface
+type IApdu interface {
+    Control() uint8
+    LengthInBytes() uint16
+    LengthInBits() uint16
+    Serialize(io utils.WriteBuffer) error
+    xml.Marshaler
+}
+
+type IApduParent interface {
+    SerializeParent(io utils.WriteBuffer, child IApdu, serializeChildFunction func() error) error
+    GetTypeName() string
+}
+
+type IApduChild interface {
+    Serialize(io utils.WriteBuffer) error
+    InitializeParent(parent *Apdu, dataLength uint8, numbered bool, counter uint8)
+    GetTypeName() string
+    IApdu
+}
+
+func NewApdu(dataLength uint8, numbered bool, counter uint8) *Apdu {
+    return &Apdu{DataLength: dataLength, Numbered: numbered, Counter: counter}
+}
+
+func CastApdu(structType interface{}) *Apdu {
+    castFunc := func(typ interface{}) *Apdu {
+        if casted, ok := typ.(Apdu); ok {
+            return &casted
+        }
+        if casted, ok := typ.(*Apdu); ok {
+            return casted
+        }
+        return nil
+    }
+    return castFunc(structType)
+}
+
+func (m *Apdu) GetTypeName() string {
+    return "Apdu"
+}
+
+func (m *Apdu) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
+
+    // Simple field (dataLength)
+    lengthInBits += 8
+
+    // Discriminator Field (control)
+    lengthInBits += 1
+
+    // Simple field (numbered)
+    lengthInBits += 1
+
+    // Simple field (counter)
+    lengthInBits += 4
+
+    // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
+
+    return lengthInBits
+}
+
+func (m *Apdu) LengthInBytes() uint16 {
+    return m.LengthInBits() / 8
+}
+
+func ApduParse(io *utils.ReadBuffer) (*Apdu, error) {
+
+    // Simple Field (dataLength)
+    dataLength, _dataLengthErr := io.ReadUint8(8)
+    if _dataLengthErr != nil {
+        return nil, errors.New("Error parsing 'dataLength' field " + _dataLengthErr.Error())
+    }
+
+    // Discriminator Field (control) (Used as input to a switch field)
+    control, _controlErr := io.ReadUint8(1)
+    if _controlErr != nil {
+        return nil, errors.New("Error parsing 'control' field " + _controlErr.Error())
+    }
+
+    // Simple Field (numbered)
+    numbered, _numberedErr := io.ReadBit()
+    if _numberedErr != nil {
+        return nil, errors.New("Error parsing 'numbered' field " + _numberedErr.Error())
+    }
+
+    // Simple Field (counter)
+    counter, _counterErr := io.ReadUint8(4)
+    if _counterErr != nil {
+        return nil, errors.New("Error parsing 'counter' field " + _counterErr.Error())
+    }
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    var _parent *Apdu
+    var typeSwitchError error
+    switch {
+    case control == 1:
+        _parent, typeSwitchError = ApduControlContainerParse(io)
+    case control == 0:
+        _parent, typeSwitchError = ApduDataContainerParse(io, dataLength)
+    }
+    if typeSwitchError != nil {
+        return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
+    }
+
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent, dataLength, numbered, counter)
+    return _parent, nil
+}
+
+func (m *Apdu) Serialize(io utils.WriteBuffer) error {
+    return m.Child.Serialize(io)
+}
+
+func (m *Apdu) SerializeParent(io utils.WriteBuffer, child IApdu, serializeChildFunction func() error) error {
+
+    // Simple Field (dataLength)
+    dataLength := uint8(m.DataLength)
+    _dataLengthErr := io.WriteUint8(8, (dataLength))
+    if _dataLengthErr != nil {
+        return errors.New("Error serializing 'dataLength' field " + _dataLengthErr.Error())
+    }
+
+    // Discriminator Field (control) (Used as input to a switch field)
+    control := uint8(child.Control())
+    _controlErr := io.WriteUint8(1, (control))
+    if _controlErr != nil {
+        return errors.New("Error serializing 'control' field " + _controlErr.Error())
+    }
+
+    // Simple Field (numbered)
+    numbered := bool(m.Numbered)
+    _numberedErr := io.WriteBit((numbered))
+    if _numberedErr != nil {
+        return errors.New("Error serializing 'numbered' field " + _numberedErr.Error())
+    }
+
+    // Simple Field (counter)
+    counter := uint8(m.Counter)
+    _counterErr := io.WriteUint8(4, (counter))
+    if _counterErr != nil {
+        return errors.New("Error serializing 'counter' field " + _counterErr.Error())
+    }
+
+    // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+    _typeSwitchErr := serializeChildFunction()
+    if _typeSwitchErr != nil {
+        return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
+    }
+
+    return nil
+}
+
+func (m *Apdu) 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.StartElement:
+            tok := token.(xml.StartElement)
+            switch tok.Name.Local {
+            case "dataLength":
+                var data uint8
+                if err := d.DecodeElement(&data, &tok); err != nil {
+                    return err
+                }
+                m.DataLength = data
+            case "numbered":
+                var data bool
+                if err := d.DecodeElement(&data, &tok); err != nil {
+                    return err
+                }
+                m.Numbered = data
+            case "counter":
+                var data uint8
+                if err := d.DecodeElement(&data, &tok); err != nil {
+                    return err
+                }
+                m.Counter = data
+            default:
+                switch start.Attr[0].Value {
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduControlContainer":
+                        var dt *ApduControlContainer
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduControlContainer)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataContainer":
+                        var dt *ApduDataContainer
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataContainer)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                }
+            }
+        }
+    }
+}
+
+func (m *Apdu) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    className := reflect.TypeOf(m.Child).String()
+    className = "org.apache.plc4x.java.knxnetip.readwrite." + className[strings.LastIndex(className, ".") + 1:]
+    if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
+            {Name: xml.Name{Local: "className"}, Value: className},
+        }}); err != nil {
+        return err
+    }
+    if err := e.EncodeElement(m.DataLength, xml.StartElement{Name: xml.Name{Local: "dataLength"}}); err != nil {
+        return err
+    }
+    if err := e.EncodeElement(m.Numbered, xml.StartElement{Name: xml.Name{Local: "numbered"}}); err != nil {
+        return err
+    }
+    if err := e.EncodeElement(m.Counter, xml.StartElement{Name: xml.Name{Local: "counter"}}); err != nil {
+        return err
+    }
+    marshaller, ok := m.Child.(xml.Marshaler)
+    if !ok {
+        return errors.New("child is not castable to Marshaler")
+    }
+    marshaller.MarshalXML(e, start)
+    if err := e.EncodeToken(xml.EndElement{Name: start.Name}); err != nil {
+        return err
+    }
+    return nil
+}
+
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControl.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControl.go
new file mode 100644
index 0000000..ae4ddc1
--- /dev/null
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControl.go
@@ -0,0 +1,236 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package model
+
+import (
+    "encoding/xml"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "io"
+    "reflect"
+    "strings"
+)
+
+// The data-structure of this message
+type ApduControl struct {
+    Child IApduControlChild
+    IApduControl
+    IApduControlParent
+}
+
+// The corresponding interface
+type IApduControl interface {
+    ControlType() uint8
+    LengthInBytes() uint16
+    LengthInBits() uint16
+    Serialize(io utils.WriteBuffer) error
+    xml.Marshaler
+}
+
+type IApduControlParent interface {
+    SerializeParent(io utils.WriteBuffer, child IApduControl, serializeChildFunction func() error) error
+    GetTypeName() string
+}
+
+type IApduControlChild interface {
+    Serialize(io utils.WriteBuffer) error
+    InitializeParent(parent *ApduControl)
+    GetTypeName() string
+    IApduControl
+}
+
+func NewApduControl() *ApduControl {
+    return &ApduControl{}
+}
+
+func CastApduControl(structType interface{}) *ApduControl {
+    castFunc := func(typ interface{}) *ApduControl {
+        if casted, ok := typ.(ApduControl); ok {
+            return &casted
+        }
+        if casted, ok := typ.(*ApduControl); ok {
+            return casted
+        }
+        return nil
+    }
+    return castFunc(structType)
+}
+
+func (m *ApduControl) GetTypeName() string {
+    return "ApduControl"
+}
+
+func (m *ApduControl) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
+
+    // Discriminator Field (controlType)
+    lengthInBits += 2
+
+    // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
+
+    return lengthInBits
+}
+
+func (m *ApduControl) LengthInBytes() uint16 {
+    return m.LengthInBits() / 8
+}
+
+func ApduControlParse(io *utils.ReadBuffer) (*ApduControl, error) {
+
+    // Discriminator Field (controlType) (Used as input to a switch field)
+    controlType, _controlTypeErr := io.ReadUint8(2)
+    if _controlTypeErr != nil {
+        return nil, errors.New("Error parsing 'controlType' field " + _controlTypeErr.Error())
+    }
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    var _parent *ApduControl
+    var typeSwitchError error
+    switch {
+    case controlType == 0x0:
+        _parent, typeSwitchError = ApduControlConnectParse(io)
+    case controlType == 0x1:
+        _parent, typeSwitchError = ApduControlDisconnectParse(io)
+    case controlType == 0x2:
+        _parent, typeSwitchError = ApduControlAckParse(io)
+    case controlType == 0x3:
+        _parent, typeSwitchError = ApduControlNackParse(io)
+    }
+    if typeSwitchError != nil {
+        return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
+    }
+
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent)
+    return _parent, nil
+}
+
+func (m *ApduControl) Serialize(io utils.WriteBuffer) error {
+    return m.Child.Serialize(io)
+}
+
+func (m *ApduControl) SerializeParent(io utils.WriteBuffer, child IApduControl, serializeChildFunction func() error) error {
+
+    // Discriminator Field (controlType) (Used as input to a switch field)
+    controlType := uint8(child.ControlType())
+    _controlTypeErr := io.WriteUint8(2, (controlType))
+    if _controlTypeErr != nil {
+        return errors.New("Error serializing 'controlType' field " + _controlTypeErr.Error())
+    }
+
+    // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+    _typeSwitchErr := serializeChildFunction()
+    if _typeSwitchErr != nil {
+        return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
+    }
+
+    return nil
+}
+
+func (m *ApduControl) 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.StartElement:
+            tok := token.(xml.StartElement)
+            switch tok.Name.Local {
+            default:
+                switch start.Attr[0].Value {
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduControlConnect":
+                        var dt *ApduControlConnect
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduControlConnect)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduControlDisconnect":
+                        var dt *ApduControlDisconnect
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduControlDisconnect)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduControlAck":
+                        var dt *ApduControlAck
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduControlAck)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduControlNack":
+                        var dt *ApduControlNack
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduControlNack)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                }
+            }
+        }
+    }
+}
+
+func (m *ApduControl) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    className := reflect.TypeOf(m.Child).String()
+    className = "org.apache.plc4x.java.knxnetip.readwrite." + className[strings.LastIndex(className, ".") + 1:]
+    if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
+            {Name: xml.Name{Local: "className"}, Value: className},
+        }}); err != nil {
+        return err
+    }
+    marshaller, ok := m.Child.(xml.Marshaler)
+    if !ok {
+        return errors.New("child is not castable to Marshaler")
+    }
+    marshaller.MarshalXML(e, start)
+    if err := e.EncodeToken(xml.EndElement{Name: start.Name}); err != nil {
+        return err
+    }
+    return nil
+}
+
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlAck.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlAck.go
index 1bd9767..4050ddd 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlAck.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduControlAck struct {
+    Parent *ApduControl
+    IApduControlAck
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduControlAck interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduControlAck) ControlType() uint8 {
+    return 0x2
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduControlAck) InitializeParent(parent *ApduControl) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduControlAck() *ApduControl {
+    child := &ApduControlAck{
+        Parent: NewApduControl(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduControlAck(structType interface{}) *ApduControlAck {
+    castFunc := func(typ interface{}) *ApduControlAck {
+        if casted, ok := typ.(ApduControlAck); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduControlAck); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduControl); ok {
+            return CastApduControlAck(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduControl); ok {
+            return CastApduControlAck(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduControlAck) GetTypeName() string {
+    return "ApduControlAck"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduControlAck) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduControlAck) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduControlAckParse(io *utils.ReadBuffer) (*ApduControl, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduControlAck{
+        Parent: &ApduControl{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduControlAck) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduControlAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduControlAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlConnect.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlConnect.go
index 1bd9767..ebefe60 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlConnect.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduControlConnect struct {
+    Parent *ApduControl
+    IApduControlConnect
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduControlConnect interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduControlConnect) ControlType() uint8 {
+    return 0x0
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduControlConnect) InitializeParent(parent *ApduControl) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduControlConnect() *ApduControl {
+    child := &ApduControlConnect{
+        Parent: NewApduControl(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduControlConnect(structType interface{}) *ApduControlConnect {
+    castFunc := func(typ interface{}) *ApduControlConnect {
+        if casted, ok := typ.(ApduControlConnect); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduControlConnect); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduControl); ok {
+            return CastApduControlConnect(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduControl); ok {
+            return CastApduControlConnect(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduControlConnect) GetTypeName() string {
+    return "ApduControlConnect"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduControlConnect) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduControlConnect) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduControlConnectParse(io *utils.ReadBuffer) (*ApduControl, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduControlConnect{
+        Parent: &ApduControl{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduControlConnect) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduControlConnect) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduControlConnect) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlContainer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlContainer.go
new file mode 100644
index 0000000..008fd70
--- /dev/null
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlContainer.go
@@ -0,0 +1,166 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package model
+
+import (
+    "encoding/xml"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "io"
+)
+
+// The data-structure of this message
+type ApduControlContainer struct {
+    ControlApdu *ApduControl
+    Parent *Apdu
+    IApduControlContainer
+}
+
+// The corresponding interface
+type IApduControlContainer interface {
+    LengthInBytes() uint16
+    LengthInBits() uint16
+    Serialize(io utils.WriteBuffer) error
+    xml.Marshaler
+}
+
+///////////////////////////////////////////////////////////
+// Accessors for discriminator values.
+///////////////////////////////////////////////////////////
+func (m *ApduControlContainer) Control() uint8 {
+    return 1
+}
+
+
+func (m *ApduControlContainer) InitializeParent(parent *Apdu, dataLength uint8, numbered bool, counter uint8) {
+    m.Parent.DataLength = dataLength
+    m.Parent.Numbered = numbered
+    m.Parent.Counter = counter
+}
+
+func NewApduControlContainer(controlApdu *ApduControl, dataLength uint8, numbered bool, counter uint8) *Apdu {
+    child := &ApduControlContainer{
+        ControlApdu: controlApdu,
+        Parent: NewApdu(dataLength, numbered, counter),
+    }
+    child.Parent.Child = child
+    return child.Parent
+}
+
+func CastApduControlContainer(structType interface{}) *ApduControlContainer {
+    castFunc := func(typ interface{}) *ApduControlContainer {
+        if casted, ok := typ.(ApduControlContainer); ok {
+            return &casted
+        }
+        if casted, ok := typ.(*ApduControlContainer); ok {
+            return casted
+        }
+        if casted, ok := typ.(Apdu); ok {
+            return CastApduControlContainer(casted.Child)
+        }
+        if casted, ok := typ.(*Apdu); ok {
+            return CastApduControlContainer(casted.Child)
+        }
+        return nil
+    }
+    return castFunc(structType)
+}
+
+func (m *ApduControlContainer) GetTypeName() string {
+    return "ApduControlContainer"
+}
+
+func (m *ApduControlContainer) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
+
+    // Simple field (controlApdu)
+    lengthInBits += m.ControlApdu.LengthInBits()
+
+    return lengthInBits
+}
+
+func (m *ApduControlContainer) LengthInBytes() uint16 {
+    return m.LengthInBits() / 8
+}
+
+func ApduControlContainerParse(io *utils.ReadBuffer) (*Apdu, error) {
+
+    // Simple Field (controlApdu)
+    controlApdu, _controlApduErr := ApduControlParse(io)
+    if _controlApduErr != nil {
+        return nil, errors.New("Error parsing 'controlApdu' field " + _controlApduErr.Error())
+    }
+
+    // Create a partially initialized instance
+    _child := &ApduControlContainer{
+        ControlApdu: controlApdu,
+        Parent: &Apdu{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
+}
+
+func (m *ApduControlContainer) Serialize(io utils.WriteBuffer) error {
+    ser := func() error {
+
+    // Simple Field (controlApdu)
+    _controlApduErr := m.ControlApdu.Serialize(io)
+    if _controlApduErr != nil {
+        return errors.New("Error serializing 'controlApdu' field " + _controlApduErr.Error())
+    }
+
+        return nil
+    }
+    return m.Parent.SerializeParent(io, m, ser)
+}
+
+func (m *ApduControlContainer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+    var token xml.Token
+    var err error
+    token = start
+    for {
+        switch token.(type) {
+        case xml.StartElement:
+            tok := token.(xml.StartElement)
+            switch tok.Name.Local {
+            case "controlApdu":
+                var dt *ApduControl
+                if err := d.DecodeElement(&dt, &tok); err != nil {
+                    return err
+                }
+                m.ControlApdu = dt
+            }
+        }
+        token, err = d.Token()
+        if err != nil {
+            if err == io.EOF {
+                return nil
+            }
+            return err
+        }
+    }
+}
+
+func (m *ApduControlContainer) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    if err := e.EncodeElement(m.ControlApdu, xml.StartElement{Name: xml.Name{Local: "controlApdu"}}); err != nil {
+        return err
+    }
+    return nil
+}
+
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlDisconnect.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlDisconnect.go
index 1bd9767..f677940 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlDisconnect.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduControlDisconnect struct {
+    Parent *ApduControl
+    IApduControlDisconnect
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduControlDisconnect interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduControlDisconnect) ControlType() uint8 {
+    return 0x1
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduControlDisconnect) InitializeParent(parent *ApduControl) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduControlDisconnect() *ApduControl {
+    child := &ApduControlDisconnect{
+        Parent: NewApduControl(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduControlDisconnect(structType interface{}) *ApduControlDisconnect {
+    castFunc := func(typ interface{}) *ApduControlDisconnect {
+        if casted, ok := typ.(ApduControlDisconnect); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduControlDisconnect); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduControl); ok {
+            return CastApduControlDisconnect(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduControl); ok {
+            return CastApduControlDisconnect(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduControlDisconnect) GetTypeName() string {
+    return "ApduControlDisconnect"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduControlDisconnect) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduControlDisconnect) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduControlDisconnectParse(io *utils.ReadBuffer) (*ApduControl, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduControlDisconnect{
+        Parent: &ApduControl{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduControlDisconnect) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduControlDisconnect) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduControlDisconnect) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlNack.go
similarity index 56%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlNack.go
index 1bd9767..c09c2e6 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduControlNack.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduControlNack struct {
+    Parent *ApduControl
+    IApduControlNack
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduControlNack interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduControlNack) ControlType() uint8 {
+    return 0x3
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduControlNack) InitializeParent(parent *ApduControl) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduControlNack() *ApduControl {
+    child := &ApduControlNack{
+        Parent: NewApduControl(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduControlNack(structType interface{}) *ApduControlNack {
+    castFunc := func(typ interface{}) *ApduControlNack {
+        if casted, ok := typ.(ApduControlNack); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduControlNack); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduControl); ok {
+            return CastApduControlNack(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduControl); ok {
+            return CastApduControlNack(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduControlNack) GetTypeName() string {
+    return "ApduControlNack"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduControlNack) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduControlNack) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduControlNackParse(io *utils.ReadBuffer) (*ApduControl, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduControlNack{
+        Parent: &ApduControl{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduControlNack) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduControlNack) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduControlNack) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go
new file mode 100644
index 0000000..c0df68f
--- /dev/null
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduData.go
@@ -0,0 +1,404 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package model
+
+import (
+    "encoding/xml"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "io"
+    "reflect"
+    "strings"
+)
+
+// The data-structure of this message
+type ApduData struct {
+    Child IApduDataChild
+    IApduData
+    IApduDataParent
+}
+
+// The corresponding interface
+type IApduData interface {
+    ApciType() uint8
+    LengthInBytes() uint16
+    LengthInBits() uint16
+    Serialize(io utils.WriteBuffer) error
+    xml.Marshaler
+}
+
+type IApduDataParent interface {
+    SerializeParent(io utils.WriteBuffer, child IApduData, serializeChildFunction func() error) error
+    GetTypeName() string
+}
+
+type IApduDataChild interface {
+    Serialize(io utils.WriteBuffer) error
+    InitializeParent(parent *ApduData)
+    GetTypeName() string
+    IApduData
+}
+
+func NewApduData() *ApduData {
+    return &ApduData{}
+}
+
+func CastApduData(structType interface{}) *ApduData {
+    castFunc := func(typ interface{}) *ApduData {
+        if casted, ok := typ.(ApduData); ok {
+            return &casted
+        }
+        if casted, ok := typ.(*ApduData); ok {
+            return casted
+        }
+        return nil
+    }
+    return castFunc(structType)
+}
+
+func (m *ApduData) GetTypeName() string {
+    return "ApduData"
+}
+
+func (m *ApduData) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
+
+    // Discriminator Field (apciType)
+    lengthInBits += 4
+
+    // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
+
+    return lengthInBits
+}
+
+func (m *ApduData) LengthInBytes() uint16 {
+    return m.LengthInBits() / 8
+}
+
+func ApduDataParse(io *utils.ReadBuffer, dataLength uint8) (*ApduData, error) {
+
+    // Discriminator Field (apciType) (Used as input to a switch field)
+    apciType, _apciTypeErr := io.ReadUint8(4)
+    if _apciTypeErr != nil {
+        return nil, errors.New("Error parsing 'apciType' field " + _apciTypeErr.Error())
+    }
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    var _parent *ApduData
+    var typeSwitchError error
+    switch {
+    case apciType == 0x0:
+        _parent, typeSwitchError = ApduDataGroupValueReadParse(io)
+    case apciType == 0x1:
+        _parent, typeSwitchError = ApduDataGroupValueResponseParse(io)
+    case apciType == 0x2:
+        _parent, typeSwitchError = ApduDataGroupValueWriteParse(io, dataLength)
+    case apciType == 0x3:
+        _parent, typeSwitchError = ApduDataIndividualAddressWriteParse(io)
+    case apciType == 0x4:
+        _parent, typeSwitchError = ApduDataIndividualAddressReadParse(io)
+    case apciType == 0x5:
+        _parent, typeSwitchError = ApduDataIndividualAddressResponseParse(io)
+    case apciType == 0x6:
+        _parent, typeSwitchError = ApduDataAdcReadParse(io)
+    case apciType == 0x7:
+        _parent, typeSwitchError = ApduDataAdcResponseParse(io)
+    case apciType == 0x8:
+        _parent, typeSwitchError = ApduDataMemoryReadParse(io)
+    case apciType == 0x9:
+        _parent, typeSwitchError = ApduDataMemoryResponseParse(io)
+    case apciType == 0xA:
+        _parent, typeSwitchError = ApduDataMemoryWriteParse(io)
+    case apciType == 0xB:
+        _parent, typeSwitchError = ApduDataUserMessageParse(io)
+    case apciType == 0xC:
+        _parent, typeSwitchError = ApduDataDeviceDescriptorReadParse(io)
+    case apciType == 0xD:
+        _parent, typeSwitchError = ApduDataDeviceDescriptorResponseParse(io)
+    case apciType == 0xE:
+        _parent, typeSwitchError = ApduDataRestartParse(io)
+    case apciType == 0xF:
+        _parent, typeSwitchError = ApduDataOtherParse(io, dataLength)
+    }
+    if typeSwitchError != nil {
+        return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
+    }
+
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent)
+    return _parent, nil
+}
+
+func (m *ApduData) Serialize(io utils.WriteBuffer) error {
+    return m.Child.Serialize(io)
+}
+
+func (m *ApduData) SerializeParent(io utils.WriteBuffer, child IApduData, serializeChildFunction func() error) error {
+
+    // Discriminator Field (apciType) (Used as input to a switch field)
+    apciType := uint8(child.ApciType())
+    _apciTypeErr := io.WriteUint8(4, (apciType))
+    if _apciTypeErr != nil {
+        return errors.New("Error serializing 'apciType' field " + _apciTypeErr.Error())
+    }
+
+    // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+    _typeSwitchErr := serializeChildFunction()
+    if _typeSwitchErr != nil {
+        return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
+    }
+
+    return nil
+}
+
+func (m *ApduData) 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.StartElement:
+            tok := token.(xml.StartElement)
+            switch tok.Name.Local {
+            default:
+                switch start.Attr[0].Value {
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataGroupValueRead":
+                        var dt *ApduDataGroupValueRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataGroupValueRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataGroupValueResponse":
+                        var dt *ApduDataGroupValueResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataGroupValueResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataGroupValueWrite":
+                        var dt *ApduDataGroupValueWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataGroupValueWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataIndividualAddressWrite":
+                        var dt *ApduDataIndividualAddressWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataIndividualAddressWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataIndividualAddressRead":
+                        var dt *ApduDataIndividualAddressRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataIndividualAddressRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataIndividualAddressResponse":
+                        var dt *ApduDataIndividualAddressResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataIndividualAddressResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataAdcRead":
+                        var dt *ApduDataAdcRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataAdcRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataAdcResponse":
+                        var dt *ApduDataAdcResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataAdcResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataMemoryRead":
+                        var dt *ApduDataMemoryRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataMemoryRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataMemoryResponse":
+                        var dt *ApduDataMemoryResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataMemoryResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataMemoryWrite":
+                        var dt *ApduDataMemoryWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataMemoryWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataUserMessage":
+                        var dt *ApduDataUserMessage
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataUserMessage)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataDeviceDescriptorRead":
+                        var dt *ApduDataDeviceDescriptorRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataDeviceDescriptorRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataDeviceDescriptorResponse":
+                        var dt *ApduDataDeviceDescriptorResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataDeviceDescriptorResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataRestart":
+                        var dt *ApduDataRestart
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataRestart)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataOther":
+                        var dt *ApduDataOther
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataOther)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                }
+            }
+        }
+    }
+}
+
+func (m *ApduData) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    className := reflect.TypeOf(m.Child).String()
+    className = "org.apache.plc4x.java.knxnetip.readwrite." + className[strings.LastIndex(className, ".") + 1:]
+    if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
+            {Name: xml.Name{Local: "className"}, Value: className},
+        }}); err != nil {
+        return err
+    }
+    marshaller, ok := m.Child.(xml.Marshaler)
+    if !ok {
+        return errors.New("child is not castable to Marshaler")
+    }
+    marshaller.MarshalXML(e, start)
+    if err := e.EncodeToken(xml.EndElement{Name: start.Name}); err != nil {
+        return err
+    }
+    return nil
+}
+
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataAdcRead.go
similarity index 56%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataAdcRead.go
index 1bd9767..1d8a91e 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataAdcRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataAdcRead struct {
+    Parent *ApduData
+    IApduDataAdcRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataAdcRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataAdcRead) ApciType() uint8 {
+    return 0x6
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataAdcRead) InitializeParent(parent *ApduData) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataAdcRead() *ApduData {
+    child := &ApduDataAdcRead{
+        Parent: NewApduData(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataAdcRead(structType interface{}) *ApduDataAdcRead {
+    castFunc := func(typ interface{}) *ApduDataAdcRead {
+        if casted, ok := typ.(ApduDataAdcRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataAdcRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduData); ok {
+            return CastApduDataAdcRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduData); ok {
+            return CastApduDataAdcRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataAdcRead) GetTypeName() string {
+    return "ApduDataAdcRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataAdcRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataAdcRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataAdcReadParse(io *utils.ReadBuffer) (*ApduData, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataAdcRead{
+        Parent: &ApduData{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataAdcRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataAdcRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataAdcRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataAdcResponse.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataAdcResponse.go
index 1bd9767..4375180 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataAdcResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataAdcResponse struct {
+    Parent *ApduData
+    IApduDataAdcResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataAdcResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataAdcResponse) ApciType() uint8 {
+    return 0x7
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataAdcResponse) InitializeParent(parent *ApduData) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataAdcResponse() *ApduData {
+    child := &ApduDataAdcResponse{
+        Parent: NewApduData(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataAdcResponse(structType interface{}) *ApduDataAdcResponse {
+    castFunc := func(typ interface{}) *ApduDataAdcResponse {
+        if casted, ok := typ.(ApduDataAdcResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataAdcResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduData); ok {
+            return CastApduDataAdcResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduData); ok {
+            return CastApduDataAdcResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataAdcResponse) GetTypeName() string {
+    return "ApduDataAdcResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataAdcResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataAdcResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataAdcResponseParse(io *utils.ReadBuffer) (*ApduData, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataAdcResponse{
+        Parent: &ApduData{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataAdcResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataAdcResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataAdcResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataContainer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataContainer.go
new file mode 100644
index 0000000..a866208
--- /dev/null
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataContainer.go
@@ -0,0 +1,166 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package model
+
+import (
+    "encoding/xml"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "io"
+)
+
+// The data-structure of this message
+type ApduDataContainer struct {
+    DataApdu *ApduData
+    Parent *Apdu
+    IApduDataContainer
+}
+
+// The corresponding interface
+type IApduDataContainer interface {
+    LengthInBytes() uint16
+    LengthInBits() uint16
+    Serialize(io utils.WriteBuffer) error
+    xml.Marshaler
+}
+
+///////////////////////////////////////////////////////////
+// Accessors for discriminator values.
+///////////////////////////////////////////////////////////
+func (m *ApduDataContainer) Control() uint8 {
+    return 0
+}
+
+
+func (m *ApduDataContainer) InitializeParent(parent *Apdu, dataLength uint8, numbered bool, counter uint8) {
+    m.Parent.DataLength = dataLength
+    m.Parent.Numbered = numbered
+    m.Parent.Counter = counter
+}
+
+func NewApduDataContainer(dataApdu *ApduData, dataLength uint8, numbered bool, counter uint8) *Apdu {
+    child := &ApduDataContainer{
+        DataApdu: dataApdu,
+        Parent: NewApdu(dataLength, numbered, counter),
+    }
+    child.Parent.Child = child
+    return child.Parent
+}
+
+func CastApduDataContainer(structType interface{}) *ApduDataContainer {
+    castFunc := func(typ interface{}) *ApduDataContainer {
+        if casted, ok := typ.(ApduDataContainer); ok {
+            return &casted
+        }
+        if casted, ok := typ.(*ApduDataContainer); ok {
+            return casted
+        }
+        if casted, ok := typ.(Apdu); ok {
+            return CastApduDataContainer(casted.Child)
+        }
+        if casted, ok := typ.(*Apdu); ok {
+            return CastApduDataContainer(casted.Child)
+        }
+        return nil
+    }
+    return castFunc(structType)
+}
+
+func (m *ApduDataContainer) GetTypeName() string {
+    return "ApduDataContainer"
+}
+
+func (m *ApduDataContainer) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
+
+    // Simple field (dataApdu)
+    lengthInBits += m.DataApdu.LengthInBits()
+
+    return lengthInBits
+}
+
+func (m *ApduDataContainer) LengthInBytes() uint16 {
+    return m.LengthInBits() / 8
+}
+
+func ApduDataContainerParse(io *utils.ReadBuffer, dataLength uint8) (*Apdu, error) {
+
+    // Simple Field (dataApdu)
+    dataApdu, _dataApduErr := ApduDataParse(io, dataLength)
+    if _dataApduErr != nil {
+        return nil, errors.New("Error parsing 'dataApdu' field " + _dataApduErr.Error())
+    }
+
+    // Create a partially initialized instance
+    _child := &ApduDataContainer{
+        DataApdu: dataApdu,
+        Parent: &Apdu{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
+}
+
+func (m *ApduDataContainer) Serialize(io utils.WriteBuffer) error {
+    ser := func() error {
+
+    // Simple Field (dataApdu)
+    _dataApduErr := m.DataApdu.Serialize(io)
+    if _dataApduErr != nil {
+        return errors.New("Error serializing 'dataApdu' field " + _dataApduErr.Error())
+    }
+
+        return nil
+    }
+    return m.Parent.SerializeParent(io, m, ser)
+}
+
+func (m *ApduDataContainer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+    var token xml.Token
+    var err error
+    token = start
+    for {
+        switch token.(type) {
+        case xml.StartElement:
+            tok := token.(xml.StartElement)
+            switch tok.Name.Local {
+            case "dataApdu":
+                var dt *ApduData
+                if err := d.DecodeElement(&dt, &tok); err != nil {
+                    return err
+                }
+                m.DataApdu = dt
+            }
+        }
+        token, err = d.Token()
+        if err != nil {
+            if err == io.EOF {
+                return nil
+            }
+            return err
+        }
+    }
+}
+
+func (m *ApduDataContainer) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    if err := e.EncodeElement(m.DataApdu, xml.StartElement{Name: xml.Name{Local: "dataApdu"}}); err != nil {
+        return err
+    }
+    return nil
+}
+
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go
index 1bd9767..8fc976e 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataDeviceDescriptorRead struct {
+    Parent *ApduData
+    IApduDataDeviceDescriptorRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataDeviceDescriptorRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataDeviceDescriptorRead) ApciType() uint8 {
+    return 0xC
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataDeviceDescriptorRead) InitializeParent(parent *ApduData) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataDeviceDescriptorRead() *ApduData {
+    child := &ApduDataDeviceDescriptorRead{
+        Parent: NewApduData(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataDeviceDescriptorRead(structType interface{}) *ApduDataDeviceDescriptorRead {
+    castFunc := func(typ interface{}) *ApduDataDeviceDescriptorRead {
+        if casted, ok := typ.(ApduDataDeviceDescriptorRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataDeviceDescriptorRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduData); ok {
+            return CastApduDataDeviceDescriptorRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduData); ok {
+            return CastApduDataDeviceDescriptorRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataDeviceDescriptorRead) GetTypeName() string {
+    return "ApduDataDeviceDescriptorRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataDeviceDescriptorRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataDeviceDescriptorRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataDeviceDescriptorReadParse(io *utils.ReadBuffer) (*ApduData, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataDeviceDescriptorRead{
+        Parent: &ApduData{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataDeviceDescriptorRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataDeviceDescriptorRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataDeviceDescriptorRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
index 1bd9767..f694429 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataDeviceDescriptorResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataDeviceDescriptorResponse struct {
+    Parent *ApduData
+    IApduDataDeviceDescriptorResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataDeviceDescriptorResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataDeviceDescriptorResponse) ApciType() uint8 {
+    return 0xD
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataDeviceDescriptorResponse) InitializeParent(parent *ApduData) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataDeviceDescriptorResponse() *ApduData {
+    child := &ApduDataDeviceDescriptorResponse{
+        Parent: NewApduData(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataDeviceDescriptorResponse(structType interface{}) *ApduDataDeviceDescriptorResponse {
+    castFunc := func(typ interface{}) *ApduDataDeviceDescriptorResponse {
+        if casted, ok := typ.(ApduDataDeviceDescriptorResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataDeviceDescriptorResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduData); ok {
+            return CastApduDataDeviceDescriptorResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduData); ok {
+            return CastApduDataDeviceDescriptorResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataDeviceDescriptorResponse) GetTypeName() string {
+    return "ApduDataDeviceDescriptorResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataDeviceDescriptorResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataDeviceDescriptorResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataDeviceDescriptorResponseParse(io *utils.ReadBuffer) (*ApduData, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataDeviceDescriptorResponse{
+        Parent: &ApduData{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataDeviceDescriptorResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataDeviceDescriptorResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataDeviceDescriptorResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go
new file mode 100644
index 0000000..bd3821e
--- /dev/null
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExt.go
@@ -0,0 +1,754 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package model
+
+import (
+    "encoding/xml"
+    "errors"
+    "github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
+    "io"
+    "reflect"
+    "strings"
+)
+
+// The data-structure of this message
+type ApduDataExt struct {
+    Child IApduDataExtChild
+    IApduDataExt
+    IApduDataExtParent
+}
+
+// The corresponding interface
+type IApduDataExt interface {
+    ExtApciType() uint8
+    LengthInBytes() uint16
+    LengthInBits() uint16
+    Serialize(io utils.WriteBuffer) error
+    xml.Marshaler
+}
+
+type IApduDataExtParent interface {
+    SerializeParent(io utils.WriteBuffer, child IApduDataExt, serializeChildFunction func() error) error
+    GetTypeName() string
+}
+
+type IApduDataExtChild interface {
+    Serialize(io utils.WriteBuffer) error
+    InitializeParent(parent *ApduDataExt)
+    GetTypeName() string
+    IApduDataExt
+}
+
+func NewApduDataExt() *ApduDataExt {
+    return &ApduDataExt{}
+}
+
+func CastApduDataExt(structType interface{}) *ApduDataExt {
+    castFunc := func(typ interface{}) *ApduDataExt {
+        if casted, ok := typ.(ApduDataExt); ok {
+            return &casted
+        }
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return casted
+        }
+        return nil
+    }
+    return castFunc(structType)
+}
+
+func (m *ApduDataExt) GetTypeName() string {
+    return "ApduDataExt"
+}
+
+func (m *ApduDataExt) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
+
+    // Discriminator Field (extApciType)
+    lengthInBits += 8
+
+    // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
+
+    return lengthInBits
+}
+
+func (m *ApduDataExt) LengthInBytes() uint16 {
+    return m.LengthInBits() / 8
+}
+
+func ApduDataExtParse(io *utils.ReadBuffer, length uint8) (*ApduDataExt, error) {
+
+    // Discriminator Field (extApciType) (Used as input to a switch field)
+    extApciType, _extApciTypeErr := io.ReadUint8(8)
+    if _extApciTypeErr != nil {
+        return nil, errors.New("Error parsing 'extApciType' field " + _extApciTypeErr.Error())
+    }
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    var _parent *ApduDataExt
+    var typeSwitchError error
+    switch {
+    case extApciType == 0x00:
+        _parent, typeSwitchError = ApduDataExtOpenRoutingTableRequestParse(io)
+    case extApciType == 0x01:
+        _parent, typeSwitchError = ApduDataExtReadRoutingTableRequestParse(io)
+    case extApciType == 0x02:
+        _parent, typeSwitchError = ApduDataExtReadRoutingTableResponseParse(io)
+    case extApciType == 0x03:
+        _parent, typeSwitchError = ApduDataExtWriteRoutingTableRequestParse(io)
+    case extApciType == 0x08:
+        _parent, typeSwitchError = ApduDataExtReadRouterMemoryRequestParse(io)
+    case extApciType == 0x09:
+        _parent, typeSwitchError = ApduDataExtReadRouterMemoryResponseParse(io)
+    case extApciType == 0x0A:
+        _parent, typeSwitchError = ApduDataExtWriteRouterMemoryRequestParse(io)
+    case extApciType == 0x0D:
+        _parent, typeSwitchError = ApduDataExtReadRouterStatusRequestParse(io)
+    case extApciType == 0x0E:
+        _parent, typeSwitchError = ApduDataExtReadRouterStatusResponseParse(io)
+    case extApciType == 0x0F:
+        _parent, typeSwitchError = ApduDataExtWriteRouterStatusRequestParse(io)
+    case extApciType == 0x10:
+        _parent, typeSwitchError = ApduDataExtMemoryBitWriteParse(io)
+    case extApciType == 0x11:
+        _parent, typeSwitchError = ApduDataExtAuthorizeRequestParse(io)
+    case extApciType == 0x12:
+        _parent, typeSwitchError = ApduDataExtAuthorizeResponseParse(io)
+    case extApciType == 0x13:
+        _parent, typeSwitchError = ApduDataExtKeyWriteParse(io)
+    case extApciType == 0x14:
+        _parent, typeSwitchError = ApduDataExtKeyResponseParse(io)
+    case extApciType == 0x15:
+        _parent, typeSwitchError = ApduDataExtPropertyValueReadParse(io)
+    case extApciType == 0x16:
+        _parent, typeSwitchError = ApduDataExtPropertyValueResponseParse(io, length)
+    case extApciType == 0x17:
+        _parent, typeSwitchError = ApduDataExtPropertyValueWriteParse(io)
+    case extApciType == 0x18:
+        _parent, typeSwitchError = ApduDataExtPropertyDescriptionReadParse(io)
+    case extApciType == 0x19:
+        _parent, typeSwitchError = ApduDataExtPropertyDescriptionResponseParse(io)
+    case extApciType == 0x1A:
+        _parent, typeSwitchError = ApduDataExtNetworkParameterReadParse(io)
+    case extApciType == 0x1B:
+        _parent, typeSwitchError = ApduDataExtNetworkParameterResponseParse(io)
+    case extApciType == 0x1C:
+        _parent, typeSwitchError = ApduDataExtIndividualAddressSerialNumberReadParse(io)
+    case extApciType == 0x1D:
+        _parent, typeSwitchError = ApduDataExtIndividualAddressSerialNumberResponseParse(io)
+    case extApciType == 0x1E:
+        _parent, typeSwitchError = ApduDataExtIndividualAddressSerialNumberWriteParse(io)
+    case extApciType == 0x20:
+        _parent, typeSwitchError = ApduDataExtDomainAddressWriteParse(io)
+    case extApciType == 0x21:
+        _parent, typeSwitchError = ApduDataExtDomainAddressReadParse(io)
+    case extApciType == 0x22:
+        _parent, typeSwitchError = ApduDataExtDomainAddressResponseParse(io)
+    case extApciType == 0x23:
+        _parent, typeSwitchError = ApduDataExtDomainAddressSelectiveReadParse(io)
+    case extApciType == 0x24:
+        _parent, typeSwitchError = ApduDataExtNetworkParameterWriteParse(io)
+    case extApciType == 0x25:
+        _parent, typeSwitchError = ApduDataExtLinkReadParse(io)
+    case extApciType == 0x26:
+        _parent, typeSwitchError = ApduDataExtLinkResponseParse(io)
+    case extApciType == 0x27:
+        _parent, typeSwitchError = ApduDataExtLinkWriteParse(io)
+    case extApciType == 0x28:
+        _parent, typeSwitchError = ApduDataExtGroupPropertyValueReadParse(io)
+    case extApciType == 0x29:
+        _parent, typeSwitchError = ApduDataExtGroupPropertyValueResponseParse(io)
+    case extApciType == 0x2A:
+        _parent, typeSwitchError = ApduDataExtGroupPropertyValueWriteParse(io)
+    case extApciType == 0x2B:
+        _parent, typeSwitchError = ApduDataExtGroupPropertyValueInfoReportParse(io)
+    case extApciType == 0x2C:
+        _parent, typeSwitchError = ApduDataExtDomainAddressSerialNumberReadParse(io)
+    case extApciType == 0x2D:
+        _parent, typeSwitchError = ApduDataExtDomainAddressSerialNumberResponseParse(io)
+    case extApciType == 0x2E:
+        _parent, typeSwitchError = ApduDataExtDomainAddressSerialNumberWriteParse(io)
+    case extApciType == 0x30:
+        _parent, typeSwitchError = ApduDataExtFileStreamInfoReportParse(io)
+    }
+    if typeSwitchError != nil {
+        return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
+    }
+
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent)
+    return _parent, nil
+}
+
+func (m *ApduDataExt) Serialize(io utils.WriteBuffer) error {
+    return m.Child.Serialize(io)
+}
+
+func (m *ApduDataExt) SerializeParent(io utils.WriteBuffer, child IApduDataExt, serializeChildFunction func() error) error {
+
+    // Discriminator Field (extApciType) (Used as input to a switch field)
+    extApciType := uint8(child.ExtApciType())
+    _extApciTypeErr := io.WriteUint8(8, (extApciType))
+    if _extApciTypeErr != nil {
+        return errors.New("Error serializing 'extApciType' field " + _extApciTypeErr.Error())
+    }
+
+    // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+    _typeSwitchErr := serializeChildFunction()
+    if _typeSwitchErr != nil {
+        return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
+    }
+
+    return nil
+}
+
+func (m *ApduDataExt) 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.StartElement:
+            tok := token.(xml.StartElement)
+            switch tok.Name.Local {
+            default:
+                switch start.Attr[0].Value {
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtOpenRoutingTableRequest":
+                        var dt *ApduDataExtOpenRoutingTableRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtOpenRoutingTableRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtReadRoutingTableRequest":
+                        var dt *ApduDataExtReadRoutingTableRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtReadRoutingTableRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtReadRoutingTableResponse":
+                        var dt *ApduDataExtReadRoutingTableResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtReadRoutingTableResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtWriteRoutingTableRequest":
+                        var dt *ApduDataExtWriteRoutingTableRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtWriteRoutingTableRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtReadRouterMemoryRequest":
+                        var dt *ApduDataExtReadRouterMemoryRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtReadRouterMemoryRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtReadRouterMemoryResponse":
+                        var dt *ApduDataExtReadRouterMemoryResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtReadRouterMemoryResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtWriteRouterMemoryRequest":
+                        var dt *ApduDataExtWriteRouterMemoryRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtWriteRouterMemoryRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtReadRouterStatusRequest":
+                        var dt *ApduDataExtReadRouterStatusRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtReadRouterStatusRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtReadRouterStatusResponse":
+                        var dt *ApduDataExtReadRouterStatusResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtReadRouterStatusResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtWriteRouterStatusRequest":
+                        var dt *ApduDataExtWriteRouterStatusRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtWriteRouterStatusRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtMemoryBitWrite":
+                        var dt *ApduDataExtMemoryBitWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtMemoryBitWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtAuthorizeRequest":
+                        var dt *ApduDataExtAuthorizeRequest
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtAuthorizeRequest)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtAuthorizeResponse":
+                        var dt *ApduDataExtAuthorizeResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtAuthorizeResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtKeyWrite":
+                        var dt *ApduDataExtKeyWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtKeyWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtKeyResponse":
+                        var dt *ApduDataExtKeyResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtKeyResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtPropertyValueRead":
+                        var dt *ApduDataExtPropertyValueRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtPropertyValueRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtPropertyValueResponse":
+                        var dt *ApduDataExtPropertyValueResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtPropertyValueResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtPropertyValueWrite":
+                        var dt *ApduDataExtPropertyValueWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtPropertyValueWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtPropertyDescriptionRead":
+                        var dt *ApduDataExtPropertyDescriptionRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtPropertyDescriptionRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtPropertyDescriptionResponse":
+                        var dt *ApduDataExtPropertyDescriptionResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtPropertyDescriptionResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtNetworkParameterRead":
+                        var dt *ApduDataExtNetworkParameterRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtNetworkParameterRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtNetworkParameterResponse":
+                        var dt *ApduDataExtNetworkParameterResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtNetworkParameterResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtIndividualAddressSerialNumberRead":
+                        var dt *ApduDataExtIndividualAddressSerialNumberRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtIndividualAddressSerialNumberRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtIndividualAddressSerialNumberResponse":
+                        var dt *ApduDataExtIndividualAddressSerialNumberResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtIndividualAddressSerialNumberResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtIndividualAddressSerialNumberWrite":
+                        var dt *ApduDataExtIndividualAddressSerialNumberWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtIndividualAddressSerialNumberWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtDomainAddressWrite":
+                        var dt *ApduDataExtDomainAddressWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtDomainAddressWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtDomainAddressRead":
+                        var dt *ApduDataExtDomainAddressRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtDomainAddressRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtDomainAddressResponse":
+                        var dt *ApduDataExtDomainAddressResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtDomainAddressResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtDomainAddressSelectiveRead":
+                        var dt *ApduDataExtDomainAddressSelectiveRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtDomainAddressSelectiveRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtNetworkParameterWrite":
+                        var dt *ApduDataExtNetworkParameterWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtNetworkParameterWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtLinkRead":
+                        var dt *ApduDataExtLinkRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtLinkRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtLinkResponse":
+                        var dt *ApduDataExtLinkResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtLinkResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtLinkWrite":
+                        var dt *ApduDataExtLinkWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtLinkWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtGroupPropertyValueRead":
+                        var dt *ApduDataExtGroupPropertyValueRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtGroupPropertyValueRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtGroupPropertyValueResponse":
+                        var dt *ApduDataExtGroupPropertyValueResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtGroupPropertyValueResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtGroupPropertyValueWrite":
+                        var dt *ApduDataExtGroupPropertyValueWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtGroupPropertyValueWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtGroupPropertyValueInfoReport":
+                        var dt *ApduDataExtGroupPropertyValueInfoReport
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtGroupPropertyValueInfoReport)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtDomainAddressSerialNumberRead":
+                        var dt *ApduDataExtDomainAddressSerialNumberRead
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtDomainAddressSerialNumberRead)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtDomainAddressSerialNumberResponse":
+                        var dt *ApduDataExtDomainAddressSerialNumberResponse
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtDomainAddressSerialNumberResponse)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtDomainAddressSerialNumberWrite":
+                        var dt *ApduDataExtDomainAddressSerialNumberWrite
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtDomainAddressSerialNumberWrite)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                    case "org.apache.plc4x.java.knxnetip.readwrite.ApduDataExtFileStreamInfoReport":
+                        var dt *ApduDataExtFileStreamInfoReport
+                        if m.Child != nil {
+                            dt = m.Child.(*ApduDataExtFileStreamInfoReport)
+                        }
+                        if err := d.DecodeElement(&dt, &tok); err != nil {
+                            return err
+                        }
+                        if m.Child == nil {
+                            dt.Parent = m
+                            m.Child = dt
+                        }
+                }
+            }
+        }
+    }
+}
+
+func (m *ApduDataExt) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+    className := reflect.TypeOf(m.Child).String()
+    className = "org.apache.plc4x.java.knxnetip.readwrite." + className[strings.LastIndex(className, ".") + 1:]
+    if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
+            {Name: xml.Name{Local: "className"}, Value: className},
+        }}); err != nil {
+        return err
+    }
+    marshaller, ok := m.Child.(xml.Marshaler)
+    if !ok {
+        return errors.New("child is not castable to Marshaler")
+    }
+    marshaller.MarshalXML(e, start)
+    if err := e.EncodeToken(xml.EndElement{Name: start.Name}); err != nil {
+        return err
+    }
+    return nil
+}
+
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeRequest.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeRequest.go
index 1bd9767..faef9a0 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeRequest.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtAuthorizeRequest struct {
+    Parent *ApduDataExt
+    IApduDataExtAuthorizeRequest
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtAuthorizeRequest interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtAuthorizeRequest) ExtApciType() uint8 {
+    return 0x11
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtAuthorizeRequest) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtAuthorizeRequest() *ApduDataExt {
+    child := &ApduDataExtAuthorizeRequest{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtAuthorizeRequest(structType interface{}) *ApduDataExtAuthorizeRequest {
+    castFunc := func(typ interface{}) *ApduDataExtAuthorizeRequest {
+        if casted, ok := typ.(ApduDataExtAuthorizeRequest); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtAuthorizeRequest); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtAuthorizeRequest(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtAuthorizeRequest(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtAuthorizeRequest) GetTypeName() string {
+    return "ApduDataExtAuthorizeRequest"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtAuthorizeRequest) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtAuthorizeRequest) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtAuthorizeRequestParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtAuthorizeRequest{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtAuthorizeRequest) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtAuthorizeRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtAuthorizeRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeResponse.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeResponse.go
index 1bd9767..c52de66 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtAuthorizeResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtAuthorizeResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtAuthorizeResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtAuthorizeResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtAuthorizeResponse) ExtApciType() uint8 {
+    return 0x12
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtAuthorizeResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtAuthorizeResponse() *ApduDataExt {
+    child := &ApduDataExtAuthorizeResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtAuthorizeResponse(structType interface{}) *ApduDataExtAuthorizeResponse {
+    castFunc := func(typ interface{}) *ApduDataExtAuthorizeResponse {
+        if casted, ok := typ.(ApduDataExtAuthorizeResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtAuthorizeResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtAuthorizeResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtAuthorizeResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtAuthorizeResponse) GetTypeName() string {
+    return "ApduDataExtAuthorizeResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtAuthorizeResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtAuthorizeResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtAuthorizeResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtAuthorizeResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtAuthorizeResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtAuthorizeResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtAuthorizeResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressRead.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressRead.go
index 1bd9767..f248dcf 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtDomainAddressRead struct {
+    Parent *ApduDataExt
+    IApduDataExtDomainAddressRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtDomainAddressRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtDomainAddressRead) ExtApciType() uint8 {
+    return 0x21
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtDomainAddressRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtDomainAddressRead() *ApduDataExt {
+    child := &ApduDataExtDomainAddressRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtDomainAddressRead(structType interface{}) *ApduDataExtDomainAddressRead {
+    castFunc := func(typ interface{}) *ApduDataExtDomainAddressRead {
+        if casted, ok := typ.(ApduDataExtDomainAddressRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtDomainAddressRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtDomainAddressRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtDomainAddressRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtDomainAddressRead) GetTypeName() string {
+    return "ApduDataExtDomainAddressRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtDomainAddressRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtDomainAddressRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtDomainAddressReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtDomainAddressRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtDomainAddressRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressResponse.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressResponse.go
index 1bd9767..4357fd8 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtDomainAddressResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtDomainAddressResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtDomainAddressResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtDomainAddressResponse) ExtApciType() uint8 {
+    return 0x22
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtDomainAddressResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtDomainAddressResponse() *ApduDataExt {
+    child := &ApduDataExtDomainAddressResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtDomainAddressResponse(structType interface{}) *ApduDataExtDomainAddressResponse {
+    castFunc := func(typ interface{}) *ApduDataExtDomainAddressResponse {
+        if casted, ok := typ.(ApduDataExtDomainAddressResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtDomainAddressResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtDomainAddressResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtDomainAddressResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtDomainAddressResponse) GetTypeName() string {
+    return "ApduDataExtDomainAddressResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtDomainAddressResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtDomainAddressResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtDomainAddressResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtDomainAddressResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtDomainAddressResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSelectiveRead.go
similarity index 54%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSelectiveRead.go
index 1bd9767..5349217 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSelectiveRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtDomainAddressSelectiveRead struct {
+    Parent *ApduDataExt
+    IApduDataExtDomainAddressSelectiveRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtDomainAddressSelectiveRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtDomainAddressSelectiveRead) ExtApciType() uint8 {
+    return 0x23
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtDomainAddressSelectiveRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtDomainAddressSelectiveRead() *ApduDataExt {
+    child := &ApduDataExtDomainAddressSelectiveRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtDomainAddressSelectiveRead(structType interface{}) *ApduDataExtDomainAddressSelectiveRead {
+    castFunc := func(typ interface{}) *ApduDataExtDomainAddressSelectiveRead {
+        if casted, ok := typ.(ApduDataExtDomainAddressSelectiveRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtDomainAddressSelectiveRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSelectiveRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSelectiveRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtDomainAddressSelectiveRead) GetTypeName() string {
+    return "ApduDataExtDomainAddressSelectiveRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtDomainAddressSelectiveRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtDomainAddressSelectiveRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtDomainAddressSelectiveReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtDomainAddressSelectiveRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtDomainAddressSelectiveRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSelectiveRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSelectiveRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberRead.go
similarity index 53%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberRead.go
index 1bd9767..e3e3e8a 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtDomainAddressSerialNumberRead struct {
+    Parent *ApduDataExt
+    IApduDataExtDomainAddressSerialNumberRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtDomainAddressSerialNumberRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtDomainAddressSerialNumberRead) ExtApciType() uint8 {
+    return 0x2C
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtDomainAddressSerialNumberRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtDomainAddressSerialNumberRead() *ApduDataExt {
+    child := &ApduDataExtDomainAddressSerialNumberRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtDomainAddressSerialNumberRead(structType interface{}) *ApduDataExtDomainAddressSerialNumberRead {
+    castFunc := func(typ interface{}) *ApduDataExtDomainAddressSerialNumberRead {
+        if casted, ok := typ.(ApduDataExtDomainAddressSerialNumberRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtDomainAddressSerialNumberRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSerialNumberRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSerialNumberRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtDomainAddressSerialNumberRead) GetTypeName() string {
+    return "ApduDataExtDomainAddressSerialNumberRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtDomainAddressSerialNumberRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtDomainAddressSerialNumberRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtDomainAddressSerialNumberReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtDomainAddressSerialNumberRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtDomainAddressSerialNumberRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSerialNumberRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSerialNumberRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberResponse.go
similarity index 52%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberResponse.go
index 1bd9767..b8b14a5 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtDomainAddressSerialNumberResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtDomainAddressSerialNumberResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtDomainAddressSerialNumberResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtDomainAddressSerialNumberResponse) ExtApciType() uint8 {
+    return 0x2D
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtDomainAddressSerialNumberResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtDomainAddressSerialNumberResponse() *ApduDataExt {
+    child := &ApduDataExtDomainAddressSerialNumberResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtDomainAddressSerialNumberResponse(structType interface{}) *ApduDataExtDomainAddressSerialNumberResponse {
+    castFunc := func(typ interface{}) *ApduDataExtDomainAddressSerialNumberResponse {
+        if casted, ok := typ.(ApduDataExtDomainAddressSerialNumberResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtDomainAddressSerialNumberResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSerialNumberResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSerialNumberResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtDomainAddressSerialNumberResponse) GetTypeName() string {
+    return "ApduDataExtDomainAddressSerialNumberResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtDomainAddressSerialNumberResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtDomainAddressSerialNumberResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtDomainAddressSerialNumberResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtDomainAddressSerialNumberResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtDomainAddressSerialNumberResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSerialNumberResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSerialNumberResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberWrite.go
similarity index 53%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberWrite.go
index 1bd9767..d1eed24 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressSerialNumberWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtDomainAddressSerialNumberWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtDomainAddressSerialNumberWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtDomainAddressSerialNumberWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtDomainAddressSerialNumberWrite) ExtApciType() uint8 {
+    return 0x2E
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtDomainAddressSerialNumberWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtDomainAddressSerialNumberWrite() *ApduDataExt {
+    child := &ApduDataExtDomainAddressSerialNumberWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtDomainAddressSerialNumberWrite(structType interface{}) *ApduDataExtDomainAddressSerialNumberWrite {
+    castFunc := func(typ interface{}) *ApduDataExtDomainAddressSerialNumberWrite {
+        if casted, ok := typ.(ApduDataExtDomainAddressSerialNumberWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtDomainAddressSerialNumberWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSerialNumberWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtDomainAddressSerialNumberWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtDomainAddressSerialNumberWrite) GetTypeName() string {
+    return "ApduDataExtDomainAddressSerialNumberWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtDomainAddressSerialNumberWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtDomainAddressSerialNumberWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtDomainAddressSerialNumberWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtDomainAddressSerialNumberWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtDomainAddressSerialNumberWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSerialNumberWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressSerialNumberWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressWrite.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressWrite.go
index 1bd9767..fbdc846 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtDomainAddressWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtDomainAddressWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtDomainAddressWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtDomainAddressWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtDomainAddressWrite) ExtApciType() uint8 {
+    return 0x20
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtDomainAddressWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtDomainAddressWrite() *ApduDataExt {
+    child := &ApduDataExtDomainAddressWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtDomainAddressWrite(structType interface{}) *ApduDataExtDomainAddressWrite {
+    castFunc := func(typ interface{}) *ApduDataExtDomainAddressWrite {
+        if casted, ok := typ.(ApduDataExtDomainAddressWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtDomainAddressWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtDomainAddressWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtDomainAddressWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtDomainAddressWrite) GetTypeName() string {
+    return "ApduDataExtDomainAddressWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtDomainAddressWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtDomainAddressWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtDomainAddressWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtDomainAddressWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtDomainAddressWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtDomainAddressWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtFileStreamInfoReport.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtFileStreamInfoReport.go
index 1bd9767..51ede0f 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtFileStreamInfoReport.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtFileStreamInfoReport struct {
+    Parent *ApduDataExt
+    IApduDataExtFileStreamInfoReport
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtFileStreamInfoReport interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtFileStreamInfoReport) ExtApciType() uint8 {
+    return 0x30
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtFileStreamInfoReport) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtFileStreamInfoReport() *ApduDataExt {
+    child := &ApduDataExtFileStreamInfoReport{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtFileStreamInfoReport(structType interface{}) *ApduDataExtFileStreamInfoReport {
+    castFunc := func(typ interface{}) *ApduDataExtFileStreamInfoReport {
+        if casted, ok := typ.(ApduDataExtFileStreamInfoReport); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtFileStreamInfoReport); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtFileStreamInfoReport(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtFileStreamInfoReport(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtFileStreamInfoReport) GetTypeName() string {
+    return "ApduDataExtFileStreamInfoReport"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtFileStreamInfoReport) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtFileStreamInfoReport) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtFileStreamInfoReportParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtFileStreamInfoReport{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtFileStreamInfoReport) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtFileStreamInfoReport) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtFileStreamInfoReport) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueInfoReport.go
similarity index 54%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueInfoReport.go
index 1bd9767..b331dc0 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueInfoReport.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtGroupPropertyValueInfoReport struct {
+    Parent *ApduDataExt
+    IApduDataExtGroupPropertyValueInfoReport
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtGroupPropertyValueInfoReport interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtGroupPropertyValueInfoReport) ExtApciType() uint8 {
+    return 0x2B
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtGroupPropertyValueInfoReport) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtGroupPropertyValueInfoReport() *ApduDataExt {
+    child := &ApduDataExtGroupPropertyValueInfoReport{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtGroupPropertyValueInfoReport(structType interface{}) *ApduDataExtGroupPropertyValueInfoReport {
+    castFunc := func(typ interface{}) *ApduDataExtGroupPropertyValueInfoReport {
+        if casted, ok := typ.(ApduDataExtGroupPropertyValueInfoReport); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtGroupPropertyValueInfoReport); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueInfoReport(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueInfoReport(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtGroupPropertyValueInfoReport) GetTypeName() string {
+    return "ApduDataExtGroupPropertyValueInfoReport"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtGroupPropertyValueInfoReport) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtGroupPropertyValueInfoReport) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtGroupPropertyValueInfoReportParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtGroupPropertyValueInfoReport{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtGroupPropertyValueInfoReport) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueInfoReport) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueInfoReport) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueRead.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueRead.go
index 1bd9767..b2c5678 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtGroupPropertyValueRead struct {
+    Parent *ApduDataExt
+    IApduDataExtGroupPropertyValueRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtGroupPropertyValueRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtGroupPropertyValueRead) ExtApciType() uint8 {
+    return 0x28
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtGroupPropertyValueRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtGroupPropertyValueRead() *ApduDataExt {
+    child := &ApduDataExtGroupPropertyValueRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtGroupPropertyValueRead(structType interface{}) *ApduDataExtGroupPropertyValueRead {
+    castFunc := func(typ interface{}) *ApduDataExtGroupPropertyValueRead {
+        if casted, ok := typ.(ApduDataExtGroupPropertyValueRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtGroupPropertyValueRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtGroupPropertyValueRead) GetTypeName() string {
+    return "ApduDataExtGroupPropertyValueRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtGroupPropertyValueRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtGroupPropertyValueRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtGroupPropertyValueReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtGroupPropertyValueRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtGroupPropertyValueRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueResponse.go
similarity index 54%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueResponse.go
index 1bd9767..9a13bf4 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtGroupPropertyValueResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtGroupPropertyValueResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtGroupPropertyValueResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtGroupPropertyValueResponse) ExtApciType() uint8 {
+    return 0x29
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtGroupPropertyValueResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtGroupPropertyValueResponse() *ApduDataExt {
+    child := &ApduDataExtGroupPropertyValueResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtGroupPropertyValueResponse(structType interface{}) *ApduDataExtGroupPropertyValueResponse {
+    castFunc := func(typ interface{}) *ApduDataExtGroupPropertyValueResponse {
+        if casted, ok := typ.(ApduDataExtGroupPropertyValueResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtGroupPropertyValueResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtGroupPropertyValueResponse) GetTypeName() string {
+    return "ApduDataExtGroupPropertyValueResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtGroupPropertyValueResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtGroupPropertyValueResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtGroupPropertyValueResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtGroupPropertyValueResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtGroupPropertyValueResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueWrite.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueWrite.go
index 1bd9767..4bb507a 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtGroupPropertyValueWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtGroupPropertyValueWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtGroupPropertyValueWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtGroupPropertyValueWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtGroupPropertyValueWrite) ExtApciType() uint8 {
+    return 0x2A
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtGroupPropertyValueWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtGroupPropertyValueWrite() *ApduDataExt {
+    child := &ApduDataExtGroupPropertyValueWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtGroupPropertyValueWrite(structType interface{}) *ApduDataExtGroupPropertyValueWrite {
+    castFunc := func(typ interface{}) *ApduDataExtGroupPropertyValueWrite {
+        if casted, ok := typ.(ApduDataExtGroupPropertyValueWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtGroupPropertyValueWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtGroupPropertyValueWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtGroupPropertyValueWrite) GetTypeName() string {
+    return "ApduDataExtGroupPropertyValueWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtGroupPropertyValueWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtGroupPropertyValueWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtGroupPropertyValueWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtGroupPropertyValueWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtGroupPropertyValueWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtGroupPropertyValueWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberRead.go
similarity index 52%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberRead.go
index 1bd9767..31f00f1 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtIndividualAddressSerialNumberRead struct {
+    Parent *ApduDataExt
+    IApduDataExtIndividualAddressSerialNumberRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtIndividualAddressSerialNumberRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtIndividualAddressSerialNumberRead) ExtApciType() uint8 {
+    return 0x1C
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtIndividualAddressSerialNumberRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtIndividualAddressSerialNumberRead() *ApduDataExt {
+    child := &ApduDataExtIndividualAddressSerialNumberRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtIndividualAddressSerialNumberRead(structType interface{}) *ApduDataExtIndividualAddressSerialNumberRead {
+    castFunc := func(typ interface{}) *ApduDataExtIndividualAddressSerialNumberRead {
+        if casted, ok := typ.(ApduDataExtIndividualAddressSerialNumberRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtIndividualAddressSerialNumberRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtIndividualAddressSerialNumberRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtIndividualAddressSerialNumberRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtIndividualAddressSerialNumberRead) GetTypeName() string {
+    return "ApduDataExtIndividualAddressSerialNumberRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtIndividualAddressSerialNumberRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtIndividualAddressSerialNumberRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtIndividualAddressSerialNumberReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtIndividualAddressSerialNumberRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtIndividualAddressSerialNumberRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtIndividualAddressSerialNumberRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtIndividualAddressSerialNumberRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberResponse.go
similarity index 51%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberResponse.go
index 1bd9767..e343022 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtIndividualAddressSerialNumberResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtIndividualAddressSerialNumberResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtIndividualAddressSerialNumberResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) ExtApciType() uint8 {
+    return 0x1D
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtIndividualAddressSerialNumberResponse() *ApduDataExt {
+    child := &ApduDataExtIndividualAddressSerialNumberResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtIndividualAddressSerialNumberResponse(structType interface{}) *ApduDataExtIndividualAddressSerialNumberResponse {
+    castFunc := func(typ interface{}) *ApduDataExtIndividualAddressSerialNumberResponse {
+        if casted, ok := typ.(ApduDataExtIndividualAddressSerialNumberResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtIndividualAddressSerialNumberResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtIndividualAddressSerialNumberResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtIndividualAddressSerialNumberResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) GetTypeName() string {
+    return "ApduDataExtIndividualAddressSerialNumberResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtIndividualAddressSerialNumberResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtIndividualAddressSerialNumberResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtIndividualAddressSerialNumberResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberWrite.go
similarity index 52%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberWrite.go
index 1bd9767..3ce963b 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtIndividualAddressSerialNumberWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtIndividualAddressSerialNumberWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtIndividualAddressSerialNumberWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtIndividualAddressSerialNumberWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) ExtApciType() uint8 {
+    return 0x1E
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtIndividualAddressSerialNumberWrite() *ApduDataExt {
+    child := &ApduDataExtIndividualAddressSerialNumberWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtIndividualAddressSerialNumberWrite(structType interface{}) *ApduDataExtIndividualAddressSerialNumberWrite {
+    castFunc := func(typ interface{}) *ApduDataExtIndividualAddressSerialNumberWrite {
+        if casted, ok := typ.(ApduDataExtIndividualAddressSerialNumberWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtIndividualAddressSerialNumberWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtIndividualAddressSerialNumberWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtIndividualAddressSerialNumberWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) GetTypeName() string {
+    return "ApduDataExtIndividualAddressSerialNumberWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtIndividualAddressSerialNumberWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtIndividualAddressSerialNumberWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtIndividualAddressSerialNumberWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtKeyResponse.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtKeyResponse.go
index 1bd9767..66a1a18 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtKeyResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtKeyResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtKeyResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtKeyResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtKeyResponse) ExtApciType() uint8 {
+    return 0x14
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtKeyResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtKeyResponse() *ApduDataExt {
+    child := &ApduDataExtKeyResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtKeyResponse(structType interface{}) *ApduDataExtKeyResponse {
+    castFunc := func(typ interface{}) *ApduDataExtKeyResponse {
+        if casted, ok := typ.(ApduDataExtKeyResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtKeyResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtKeyResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtKeyResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtKeyResponse) GetTypeName() string {
+    return "ApduDataExtKeyResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtKeyResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtKeyResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtKeyResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtKeyResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtKeyResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtKeyResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtKeyResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtKeyWrite.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtKeyWrite.go
index 1bd9767..c8bfab1 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtKeyWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtKeyWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtKeyWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtKeyWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtKeyWrite) ExtApciType() uint8 {
+    return 0x13
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtKeyWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtKeyWrite() *ApduDataExt {
+    child := &ApduDataExtKeyWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtKeyWrite(structType interface{}) *ApduDataExtKeyWrite {
+    castFunc := func(typ interface{}) *ApduDataExtKeyWrite {
+        if casted, ok := typ.(ApduDataExtKeyWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtKeyWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtKeyWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtKeyWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtKeyWrite) GetTypeName() string {
+    return "ApduDataExtKeyWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtKeyWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtKeyWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtKeyWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtKeyWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtKeyWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtKeyWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtKeyWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkRead.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkRead.go
index 1bd9767..037bfb1 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtLinkRead struct {
+    Parent *ApduDataExt
+    IApduDataExtLinkRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtLinkRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtLinkRead) ExtApciType() uint8 {
+    return 0x25
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtLinkRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtLinkRead() *ApduDataExt {
+    child := &ApduDataExtLinkRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtLinkRead(structType interface{}) *ApduDataExtLinkRead {
+    castFunc := func(typ interface{}) *ApduDataExtLinkRead {
+        if casted, ok := typ.(ApduDataExtLinkRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtLinkRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtLinkRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtLinkRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtLinkRead) GetTypeName() string {
+    return "ApduDataExtLinkRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtLinkRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtLinkRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtLinkReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtLinkRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtLinkRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtLinkRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtLinkRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkResponse.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkResponse.go
index 1bd9767..7109c8e 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtLinkResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtLinkResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtLinkResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtLinkResponse) ExtApciType() uint8 {
+    return 0x26
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtLinkResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtLinkResponse() *ApduDataExt {
+    child := &ApduDataExtLinkResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtLinkResponse(structType interface{}) *ApduDataExtLinkResponse {
+    castFunc := func(typ interface{}) *ApduDataExtLinkResponse {
+        if casted, ok := typ.(ApduDataExtLinkResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtLinkResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtLinkResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtLinkResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtLinkResponse) GetTypeName() string {
+    return "ApduDataExtLinkResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtLinkResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtLinkResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtLinkResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtLinkResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtLinkResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtLinkResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtLinkResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkWrite.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkWrite.go
index 1bd9767..d45ef83 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtLinkWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtLinkWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtLinkWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtLinkWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtLinkWrite) ExtApciType() uint8 {
+    return 0x27
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtLinkWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtLinkWrite() *ApduDataExt {
+    child := &ApduDataExtLinkWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtLinkWrite(structType interface{}) *ApduDataExtLinkWrite {
+    castFunc := func(typ interface{}) *ApduDataExtLinkWrite {
+        if casted, ok := typ.(ApduDataExtLinkWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtLinkWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtLinkWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtLinkWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtLinkWrite) GetTypeName() string {
+    return "ApduDataExtLinkWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtLinkWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtLinkWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtLinkWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtLinkWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtLinkWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtLinkWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtLinkWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtMemoryBitWrite.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtMemoryBitWrite.go
index 1bd9767..609804d 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtMemoryBitWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtMemoryBitWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtMemoryBitWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtMemoryBitWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtMemoryBitWrite) ExtApciType() uint8 {
+    return 0x10
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtMemoryBitWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtMemoryBitWrite() *ApduDataExt {
+    child := &ApduDataExtMemoryBitWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtMemoryBitWrite(structType interface{}) *ApduDataExtMemoryBitWrite {
+    castFunc := func(typ interface{}) *ApduDataExtMemoryBitWrite {
+        if casted, ok := typ.(ApduDataExtMemoryBitWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtMemoryBitWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtMemoryBitWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtMemoryBitWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtMemoryBitWrite) GetTypeName() string {
+    return "ApduDataExtMemoryBitWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtMemoryBitWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtMemoryBitWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtMemoryBitWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtMemoryBitWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtMemoryBitWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtMemoryBitWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtMemoryBitWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterRead.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterRead.go
index 1bd9767..9c6454b 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtNetworkParameterRead struct {
+    Parent *ApduDataExt
+    IApduDataExtNetworkParameterRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtNetworkParameterRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtNetworkParameterRead) ExtApciType() uint8 {
+    return 0x1A
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtNetworkParameterRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtNetworkParameterRead() *ApduDataExt {
+    child := &ApduDataExtNetworkParameterRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtNetworkParameterRead(structType interface{}) *ApduDataExtNetworkParameterRead {
+    castFunc := func(typ interface{}) *ApduDataExtNetworkParameterRead {
+        if casted, ok := typ.(ApduDataExtNetworkParameterRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtNetworkParameterRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtNetworkParameterRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtNetworkParameterRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtNetworkParameterRead) GetTypeName() string {
+    return "ApduDataExtNetworkParameterRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtNetworkParameterRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtNetworkParameterRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtNetworkParameterReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtNetworkParameterRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtNetworkParameterRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtNetworkParameterRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtNetworkParameterRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterResponse.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterResponse.go
index 1bd9767..9912164 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtNetworkParameterResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtNetworkParameterResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtNetworkParameterResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtNetworkParameterResponse) ExtApciType() uint8 {
+    return 0x1B
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtNetworkParameterResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtNetworkParameterResponse() *ApduDataExt {
+    child := &ApduDataExtNetworkParameterResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtNetworkParameterResponse(structType interface{}) *ApduDataExtNetworkParameterResponse {
+    castFunc := func(typ interface{}) *ApduDataExtNetworkParameterResponse {
+        if casted, ok := typ.(ApduDataExtNetworkParameterResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtNetworkParameterResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtNetworkParameterResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtNetworkParameterResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtNetworkParameterResponse) GetTypeName() string {
+    return "ApduDataExtNetworkParameterResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtNetworkParameterResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtNetworkParameterResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtNetworkParameterResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtNetworkParameterResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtNetworkParameterResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtNetworkParameterResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtNetworkParameterResponse) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterWrite.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterWrite.go
index 1bd9767..6b0ff24 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtNetworkParameterWrite.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtNetworkParameterWrite struct {
+    Parent *ApduDataExt
+    IApduDataExtNetworkParameterWrite
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtNetworkParameterWrite interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtNetworkParameterWrite) ExtApciType() uint8 {
+    return 0x24
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtNetworkParameterWrite) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtNetworkParameterWrite() *ApduDataExt {
+    child := &ApduDataExtNetworkParameterWrite{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtNetworkParameterWrite(structType interface{}) *ApduDataExtNetworkParameterWrite {
+    castFunc := func(typ interface{}) *ApduDataExtNetworkParameterWrite {
+        if casted, ok := typ.(ApduDataExtNetworkParameterWrite); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtNetworkParameterWrite); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtNetworkParameterWrite(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtNetworkParameterWrite(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtNetworkParameterWrite) GetTypeName() string {
+    return "ApduDataExtNetworkParameterWrite"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtNetworkParameterWrite) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtNetworkParameterWrite) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtNetworkParameterWriteParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtNetworkParameterWrite{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtNetworkParameterWrite) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtNetworkParameterWrite) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtNetworkParameterWrite) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtOpenRoutingTableRequest.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtOpenRoutingTableRequest.go
index 1bd9767..37aa4b9 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtOpenRoutingTableRequest.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtOpenRoutingTableRequest struct {
+    Parent *ApduDataExt
+    IApduDataExtOpenRoutingTableRequest
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtOpenRoutingTableRequest interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtOpenRoutingTableRequest) ExtApciType() uint8 {
+    return 0x00
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtOpenRoutingTableRequest) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtOpenRoutingTableRequest() *ApduDataExt {
+    child := &ApduDataExtOpenRoutingTableRequest{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtOpenRoutingTableRequest(structType interface{}) *ApduDataExtOpenRoutingTableRequest {
+    castFunc := func(typ interface{}) *ApduDataExtOpenRoutingTableRequest {
+        if casted, ok := typ.(ApduDataExtOpenRoutingTableRequest); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtOpenRoutingTableRequest); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtOpenRoutingTableRequest(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtOpenRoutingTableRequest(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtOpenRoutingTableRequest) GetTypeName() string {
+    return "ApduDataExtOpenRoutingTableRequest"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtOpenRoutingTableRequest) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtOpenRoutingTableRequest) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtOpenRoutingTableRequestParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtOpenRoutingTableRequest{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtOpenRoutingTableRequest) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtOpenRoutingTableRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtOpenRoutingTableRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyDescriptionRead.go
similarity index 55%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyDescriptionRead.go
index 1bd9767..130eb4f 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyDescriptionRead.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtPropertyDescriptionRead struct {
+    Parent *ApduDataExt
+    IApduDataExtPropertyDescriptionRead
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtPropertyDescriptionRead interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtPropertyDescriptionRead) ExtApciType() uint8 {
+    return 0x18
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtPropertyDescriptionRead) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtPropertyDescriptionRead() *ApduDataExt {
+    child := &ApduDataExtPropertyDescriptionRead{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtPropertyDescriptionRead(structType interface{}) *ApduDataExtPropertyDescriptionRead {
+    castFunc := func(typ interface{}) *ApduDataExtPropertyDescriptionRead {
+        if casted, ok := typ.(ApduDataExtPropertyDescriptionRead); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtPropertyDescriptionRead); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtPropertyDescriptionRead(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtPropertyDescriptionRead(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtPropertyDescriptionRead) GetTypeName() string {
+    return "ApduDataExtPropertyDescriptionRead"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtPropertyDescriptionRead) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtPropertyDescriptionRead) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtPropertyDescriptionReadParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtPropertyDescriptionRead{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtPropertyDescriptionRead) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtPropertyDescriptionRead) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
     var err error
     token = start
@@ -141,7 +129,7 @@ func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m *LDataFrameAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *ApduDataExtPropertyDescriptionRead) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     return nil
 }
 
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyDescriptionResponse.go
similarity index 54%
copy from plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
copy to plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyDescriptionResponse.go
index 1bd9767..af9fb3b 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/LDataFrameAck.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/ApduDataExtPropertyDescriptionResponse.go
@@ -25,13 +25,13 @@ import (
 )
 
 // The data-structure of this message
-type LDataFrameAck struct {
-    Parent *LDataFrame
-    ILDataFrameAck
+type ApduDataExtPropertyDescriptionResponse struct {
+    Parent *ApduDataExt
+    IApduDataExtPropertyDescriptionResponse
 }
 
 // The corresponding interface
-type ILDataFrameAck interface {
+type IApduDataExtPropertyDescriptionResponse interface {
     LengthInBytes() uint16
     LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
@@ -41,78 +41,66 @@ type ILDataFrameAck interface {
 ///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
 ///////////////////////////////////////////////////////////
-func (m *LDataFrameAck) NotAckFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) ExtendedFrame() bool {
-    return false
-}
-
-func (m *LDataFrameAck) Polling() bool {
-    return false
+func (m *ApduDataExtPropertyDescriptionResponse) ExtApciType() uint8 {
+    return 0x19
 }
 
 
-func (m *LDataFrameAck) InitializeParent(parent *LDataFrame, repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) {
-    m.Parent.Repeated = repeated
-    m.Parent.Priority = priority
-    m.Parent.AcknowledgeRequested = acknowledgeRequested
-    m.Parent.ErrorFlag = errorFlag
+func (m *ApduDataExtPropertyDescriptionResponse) InitializeParent(parent *ApduDataExt) {
 }
 
-func NewLDataFrameAck(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) *LDataFrame {
-    child := &LDataFrameAck{
-        Parent: NewLDataFrame(repeated, priority, acknowledgeRequested, errorFlag),
+func NewApduDataExtPropertyDescriptionResponse() *ApduDataExt {
+    child := &ApduDataExtPropertyDescriptionResponse{
+        Parent: NewApduDataExt(),
     }
     child.Parent.Child = child
     return child.Parent
 }
 
-func CastLDataFrameAck(structType interface{}) *LDataFrameAck {
-    castFunc := func(typ interface{}) *LDataFrameAck {
-        if casted, ok := typ.(LDataFrameAck); ok {
+func CastApduDataExtPropertyDescriptionResponse(structType interface{}) *ApduDataExtPropertyDescriptionResponse {
+    castFunc := func(typ interface{}) *ApduDataExtPropertyDescriptionResponse {
+        if casted, ok := typ.(ApduDataExtPropertyDescriptionResponse); ok {
             return &casted
         }
-        if casted, ok := typ.(*LDataFrameAck); ok {
+        if casted, ok := typ.(*ApduDataExtPropertyDescriptionResponse); ok {
             return casted
         }
-        if casted, ok := typ.(LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(ApduDataExt); ok {
+            return CastApduDataExtPropertyDescriptionResponse(casted.Child)
         }
-        if casted, ok := typ.(*LDataFrame); ok {
-            return CastLDataFrameAck(casted.Child)
+        if casted, ok := typ.(*ApduDataExt); ok {
+            return CastApduDataExtPropertyDescriptionResponse(casted.Child)
         }
         return nil
     }
     return castFunc(structType)
 }
 
-func (m *LDataFrameAck) GetTypeName() string {
-    return "LDataFrameAck"
+func (m *ApduDataExtPropertyDescriptionResponse) GetTypeName() string {
+    return "ApduDataExtPropertyDescriptionResponse"
 }
 
-func (m *LDataFrameAck) LengthInBits() uint16 {
+func (m *ApduDataExtPropertyDescriptionResponse) LengthInBits() uint16 {
     lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m *LDataFrameAck) LengthInBytes() uint16 {
+func (m *ApduDataExtPropertyDescriptionResponse) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func LDataFrameAckParse(io *utils.ReadBuffer) (*LDataFrame, error) {
+func ApduDataExtPropertyDescriptionResponseParse(io *utils.ReadBuffer) (*ApduDataExt, error) {
 
     // Create a partially initialized instance
-    _child := &LDataFrameAck{
-        Parent: &LDataFrame{},
+    _child := &ApduDataExtPropertyDescriptionResponse{
+        Parent: &ApduDataExt{},
     }
     _child.Parent.Child = _child
     return _child.Parent, nil
 }
 
-func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
+func (m *ApduDataExtPropertyDescriptionResponse) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
@@ -120,7 +108,7 @@ func (m *LDataFrameAck) Serialize(io utils.WriteBuffer) error {
     return m.Parent.SerializeParent(io, m, ser)
 }
 
-func (m *LDataFrameAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
+func (m *ApduDataExtPropertyDescriptionResponse) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     var token xml.Token
... 26989 lines suppressed ...