You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/01/17 10:41:56 UTC

[plc4x] branch develop updated (b3b9ecd -> f6b5502)

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

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


    from b3b9ecd  test(plc4j/bacnet): workaround for failing test
     new bd71859  refactor(bacnet): small optimizations
     new f6b5502  refactor(bacnet): move bac net header parsing to a common BACnetTagHeader type

The 2 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:
 .../readwrite/model/BACnetApplicationTag.go        | 220 +++------------------
 .../model/BACnetApplicationTagBitString.go         |  13 +-
 .../readwrite/model/BACnetApplicationTagBoolean.go |  13 +-
 .../model/BACnetApplicationTagCharacterString.go   |  13 +-
 .../readwrite/model/BACnetApplicationTagDate.go    |  13 +-
 .../readwrite/model/BACnetApplicationTagDouble.go  |  13 +-
 .../model/BACnetApplicationTagEnumerated.go        |  13 +-
 .../readwrite/model/BACnetApplicationTagNull.go    |  13 +-
 .../model/BACnetApplicationTagObjectIdentifier.go  |  13 +-
 .../model/BACnetApplicationTagOctetString.go       |  13 +-
 .../readwrite/model/BACnetApplicationTagReal.go    |  13 +-
 .../model/BACnetApplicationTagSignedInteger.go     |  13 +-
 .../readwrite/model/BACnetApplicationTagTime.go    |  13 +-
 .../model/BACnetApplicationTagUnsignedInteger.go   |  13 +-
 .../bacnetip/readwrite/model/BACnetClosingTag.go   |  18 +-
 .../bacnetip/readwrite/model/BACnetContextTag.go   | 193 ++++--------------
 .../readwrite/model/BACnetContextTagBitString.go   |  18 +-
 .../readwrite/model/BACnetContextTagBoolean.go     |  18 +-
 .../model/BACnetContextTagCharacterString.go       |  18 +-
 .../readwrite/model/BACnetContextTagDate.go        |  18 +-
 .../readwrite/model/BACnetContextTagDeviceState.go |  18 +-
 .../readwrite/model/BACnetContextTagDouble.go      |  18 +-
 .../readwrite/model/BACnetContextTagEmpty.go       |  18 +-
 .../readwrite/model/BACnetContextTagEnumerated.go  |  18 +-
 .../readwrite/model/BACnetContextTagEventState.go  |  18 +-
 .../readwrite/model/BACnetContextTagEventType.go   |  18 +-
 .../readwrite/model/BACnetContextTagNotifyType.go  |  18 +-
 .../model/BACnetContextTagObjectIdentifier.go      |  18 +-
 .../readwrite/model/BACnetContextTagOctetString.go |  18 +-
 .../model/BACnetContextTagPropertyIdentifier.go    |  18 +-
 .../readwrite/model/BACnetContextTagReal.go        |  18 +-
 .../model/BACnetContextTagSignedInteger.go         |  18 +-
 .../readwrite/model/BACnetContextTagTime.go        |  18 +-
 .../model/BACnetContextTagUnsignedInteger.go       |  18 +-
 .../bacnetip/readwrite/model/BACnetOpeningTag.go   |  18 +-
 .../bacnetip/protocol/BacNetIpProtocolLogic.java   |   2 +-
 .../resources/protocols/bacnetip/bacnetip.mspec    |  53 +++--
 37 files changed, 308 insertions(+), 689 deletions(-)

[plc4x] 02/02: refactor(bacnet): move bac net header parsing to a common BACnetTagHeader type

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

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

commit f6b550207f2130cb7509a68ec953b63a723cf7a6
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jan 17 11:36:03 2022 +0100

    refactor(bacnet): move bac net header parsing to a common BACnetTagHeader type
---
 .../readwrite/model/BACnetApplicationTag.go        | 220 +++------------------
 .../model/BACnetApplicationTagBitString.go         |  13 +-
 .../readwrite/model/BACnetApplicationTagBoolean.go |  13 +-
 .../model/BACnetApplicationTagCharacterString.go   |  13 +-
 .../readwrite/model/BACnetApplicationTagDate.go    |  13 +-
 .../readwrite/model/BACnetApplicationTagDouble.go  |  13 +-
 .../model/BACnetApplicationTagEnumerated.go        |  13 +-
 .../readwrite/model/BACnetApplicationTagNull.go    |  13 +-
 .../model/BACnetApplicationTagObjectIdentifier.go  |  13 +-
 .../model/BACnetApplicationTagOctetString.go       |  13 +-
 .../readwrite/model/BACnetApplicationTagReal.go    |  13 +-
 .../model/BACnetApplicationTagSignedInteger.go     |  13 +-
 .../readwrite/model/BACnetApplicationTagTime.go    |  13 +-
 .../model/BACnetApplicationTagUnsignedInteger.go   |  13 +-
 .../bacnetip/readwrite/model/BACnetClosingTag.go   |  18 +-
 .../bacnetip/readwrite/model/BACnetContextTag.go   | 193 ++++--------------
 .../readwrite/model/BACnetContextTagBitString.go   |  18 +-
 .../readwrite/model/BACnetContextTagBoolean.go     |  18 +-
 .../model/BACnetContextTagCharacterString.go       |  18 +-
 .../readwrite/model/BACnetContextTagDate.go        |  18 +-
 .../readwrite/model/BACnetContextTagDeviceState.go |  18 +-
 .../readwrite/model/BACnetContextTagDouble.go      |  18 +-
 .../readwrite/model/BACnetContextTagEmpty.go       |  18 +-
 .../readwrite/model/BACnetContextTagEnumerated.go  |  18 +-
 .../readwrite/model/BACnetContextTagEventState.go  |  18 +-
 .../readwrite/model/BACnetContextTagEventType.go   |  18 +-
 .../readwrite/model/BACnetContextTagNotifyType.go  |  18 +-
 .../model/BACnetContextTagObjectIdentifier.go      |  18 +-
 .../readwrite/model/BACnetContextTagOctetString.go |  18 +-
 .../model/BACnetContextTagPropertyIdentifier.go    |  18 +-
 .../readwrite/model/BACnetContextTagReal.go        |  18 +-
 .../model/BACnetContextTagSignedInteger.go         |  18 +-
 .../readwrite/model/BACnetContextTagTime.go        |  18 +-
 .../model/BACnetContextTagUnsignedInteger.go       |  18 +-
 .../bacnetip/readwrite/model/BACnetOpeningTag.go   |  18 +-
 .../bacnetip/protocol/BacNetIpProtocolLogic.java   |   2 +-
 .../resources/protocols/bacnetip/bacnetip.mspec    |  41 ++--
 37 files changed, 301 insertions(+), 684 deletions(-)

diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
index 9c077eb..2f816f7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTag.go
@@ -28,18 +28,10 @@ import (
 
 // The data-structure of this message
 type BACnetApplicationTag struct {
-	TagClass                 TagClass
-	LengthValueType          uint8
-	ExtTagNumber             *uint8
-	ExtLength                *uint8
-	ExtExtLength             *uint16
-	ExtExtExtLength          *uint32
-	ActualTagNumber          uint8
-	IsBoolean                bool
-	IsConstructed            bool
-	IsPrimitiveAndNotBoolean bool
-	ActualLength             uint32
-	Child                    IBACnetApplicationTagChild
+	Header       *BACnetTagHeader
+	TagNumber    uint8
+	ActualLength uint32
+	Child        IBACnetApplicationTagChild
 }
 
 // The corresponding interface
@@ -57,13 +49,13 @@ type IBACnetApplicationTagParent interface {
 
 type IBACnetApplicationTagChild interface {
 	Serialize(writeBuffer utils.WriteBuffer) error
-	InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32)
+	InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32)
 	GetTypeName() string
 	IBACnetApplicationTag
 }
 
-func NewBACnetApplicationTag(tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
-	return &BACnetApplicationTag{TagClass: tagClass, LengthValueType: lengthValueType, ExtTagNumber: extTagNumber, ExtLength: extLength, ExtExtLength: extExtLength, ExtExtExtLength: extExtExtLength, ActualTagNumber: actualTagNumber, IsBoolean: isBoolean, IsConstructed: isConstructed, IsPrimitiveAndNotBoolean: isPrimitiveAndNotBoolean, ActualLength: actualLength}
+func NewBACnetApplicationTag(header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
+	return &BACnetApplicationTag{Header: header, TagNumber: tagNumber, ActualLength: actualLength}
 }
 
 func CastBACnetApplicationTag(structType interface{}) *BACnetApplicationTag {
@@ -93,42 +85,14 @@ func (m *BACnetApplicationTag) LengthInBitsConditional(lastItem bool) uint16 {
 
 func (m *BACnetApplicationTag) ParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
-	// Discriminator Field (tagNumber)
-	lengthInBits += 4
 
-	// Simple field (lengthValueType)
-	lengthInBits += 3
-
-	// Optional Field (extTagNumber)
-	if m.ExtTagNumber != nil {
-		lengthInBits += 8
-	}
-
-	// A virtual field doesn't have any in- or output.
+	// Simple field (header)
+	lengthInBits += m.Header.LengthInBits()
 
 	// A virtual field doesn't have any in- or output.
 
 	// A virtual field doesn't have any in- or output.
 
-	// A virtual field doesn't have any in- or output.
-
-	// Optional Field (extLength)
-	if m.ExtLength != nil {
-		lengthInBits += 8
-	}
-
-	// Optional Field (extExtLength)
-	if m.ExtExtLength != nil {
-		lengthInBits += 16
-	}
-
-	// Optional Field (extExtExtLength)
-	if m.ExtExtExtLength != nil {
-		lengthInBits += 32
-	}
-
-	// A virtual field doesn't have any in- or output.
-
 	return lengthInBits
 }
 
@@ -141,90 +105,25 @@ func BACnetApplicationTagParse(readBuffer utils.ReadBuffer) (*BACnetApplicationT
 		return nil, pullErr
 	}
 
-	// Discriminator Field (tagNumber) (Used as input to a switch field)
-	tagNumber, _tagNumberErr := readBuffer.ReadUint8("tagNumber", 4)
-	if _tagNumberErr != nil {
-		return nil, errors.Wrap(_tagNumberErr, "Error parsing 'tagNumber' field")
-	}
-
-	// Assert Field (tagClass) (Can be skipped, if a given expression evaluates to false)
-	tagClass, _err := TagClassParse(readBuffer)
-	if _err != nil {
-		return nil, errors.Wrap(_err, "Error parsing 'tagClass' field")
-	}
-	if tagClass != TagClass_APPLICATION_TAGS {
-		return nil, utils.ParseAssertError
+	// Simple Field (header)
+	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
+		return nil, pullErr
 	}
-
-	// Simple Field (lengthValueType)
-	_lengthValueType, _lengthValueTypeErr := readBuffer.ReadUint8("lengthValueType", 3)
-	if _lengthValueTypeErr != nil {
-		return nil, errors.Wrap(_lengthValueTypeErr, "Error parsing 'lengthValueType' field")
+	_header, _headerErr := BACnetTagHeaderParse(readBuffer)
+	if _headerErr != nil {
+		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field")
 	}
-	lengthValueType := _lengthValueType
-
-	// Optional Field (extTagNumber) (Can be skipped, if a given expression evaluates to false)
-	var extTagNumber *uint8 = nil
-	if bool((tagNumber) == (15)) {
-		_val, _err := readBuffer.ReadUint8("extTagNumber", 8)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extTagNumber' field")
-		}
-		extTagNumber = &_val
+	header := CastBACnetTagHeader(_header)
+	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
+		return nil, closeErr
 	}
 
 	// Virtual field
-	_actualTagNumber := utils.InlineIf(bool((tagNumber) < (15)), func() interface{} { return uint8(tagNumber) }, func() interface{} { return uint8((*extTagNumber)) }).(uint8)
-	actualTagNumber := uint8(_actualTagNumber)
-
-	// Virtual field
-	_isBoolean := bool(bool((tagNumber) == (1))) && bool(bool((tagClass) == (TagClass_APPLICATION_TAGS)))
-	isBoolean := bool(_isBoolean)
-
-	// Virtual field
-	_isConstructed := bool(bool((tagClass) == (TagClass_CONTEXT_SPECIFIC_TAGS))) && bool(bool((lengthValueType) == (6)))
-	isConstructed := bool(_isConstructed)
-
-	// Virtual field
-	_isPrimitiveAndNotBoolean := bool(!(isConstructed)) && bool(!(isBoolean))
-	isPrimitiveAndNotBoolean := bool(_isPrimitiveAndNotBoolean)
-
-	// Optional Field (extLength) (Can be skipped, if a given expression evaluates to false)
-	var extLength *uint8 = nil
-	if bool(isPrimitiveAndNotBoolean) && bool(bool((lengthValueType) == (5))) {
-		_val, _err := readBuffer.ReadUint8("extLength", 8)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extLength' field")
-		}
-		extLength = &_val
-	}
-
-	// Optional Field (extExtLength) (Can be skipped, if a given expression evaluates to false)
-	var extExtLength *uint16 = nil
-	if bool(bool(isPrimitiveAndNotBoolean) && bool(bool((lengthValueType) == (5)))) && bool(bool((*extLength) == (254))) {
-		_val, _err := readBuffer.ReadUint16("extExtLength", 16)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extExtLength' field")
-		}
-		extExtLength = &_val
-	}
-
-	// Optional Field (extExtExtLength) (Can be skipped, if a given expression evaluates to false)
-	var extExtExtLength *uint32 = nil
-	if bool(bool(isPrimitiveAndNotBoolean) && bool(bool((lengthValueType) == (5)))) && bool(bool((*extLength) == (255))) {
-		_val, _err := readBuffer.ReadUint32("extExtExtLength", 32)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extExtExtLength' field")
-		}
-		extExtExtLength = &_val
-	}
+	_tagNumber := header.TagNumber
+	tagNumber := uint8(_tagNumber)
 
 	// Virtual field
-	_actualLength := utils.InlineIf(bool(bool((lengthValueType) == (5))) && bool(bool((*extLength) == (255))), func() interface{} { return uint32((*extExtExtLength)) }, func() interface{} {
-		return uint32(uint32(utils.InlineIf(bool(bool((lengthValueType) == (5))) && bool(bool((*extLength) == (254))), func() interface{} { return uint32((*extExtLength)) }, func() interface{} {
-			return uint32(uint32(utils.InlineIf(bool((lengthValueType) == (5)), func() interface{} { return uint32((*extLength)) }, func() interface{} { return uint32(lengthValueType) }).(uint32)))
-		}).(uint32)))
-	}).(uint32)
+	_actualLength := header.ActualLength
 	actualLength := uint32(_actualLength)
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
@@ -270,7 +169,7 @@ func BACnetApplicationTagParse(readBuffer utils.ReadBuffer) (*BACnetApplicationT
 	}
 
 	// Finish initializing
-	_parent.Child.InitializeParent(_parent, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength)
+	_parent.Child.InitializeParent(_parent, header, tagNumber, actualLength)
 	return _parent, nil
 }
 
@@ -283,75 +182,20 @@ func (m *BACnetApplicationTag) SerializeParent(writeBuffer utils.WriteBuffer, ch
 		return pushErr
 	}
 
-	// Discriminator Field (tagNumber) (Used as input to a switch field)
-	tagNumber := uint8(child.TagNumber())
-	_tagNumberErr := writeBuffer.WriteUint8("tagNumber", 4, (tagNumber))
-
-	if _tagNumberErr != nil {
-		return errors.Wrap(_tagNumberErr, "Error serializing 'tagNumber' field")
-	}
-
-	// Simple Field (lengthValueType)
-	lengthValueType := uint8(m.LengthValueType)
-	_lengthValueTypeErr := writeBuffer.WriteUint8("lengthValueType", 3, (lengthValueType))
-	if _lengthValueTypeErr != nil {
-		return errors.Wrap(_lengthValueTypeErr, "Error serializing 'lengthValueType' field")
-	}
-
-	// Optional Field (extTagNumber) (Can be skipped, if the value is null)
-	var extTagNumber *uint8 = nil
-	if m.ExtTagNumber != nil {
-		extTagNumber = m.ExtTagNumber
-		_extTagNumberErr := writeBuffer.WriteUint8("extTagNumber", 8, *(extTagNumber))
-		if _extTagNumberErr != nil {
-			return errors.Wrap(_extTagNumberErr, "Error serializing 'extTagNumber' field")
-		}
-	}
-	// Virtual field
-	if _actualTagNumberErr := writeBuffer.WriteVirtual("actualTagNumber", m.ActualTagNumber); _actualTagNumberErr != nil {
-		return errors.Wrap(_actualTagNumberErr, "Error serializing 'actualTagNumber' field")
+	// Simple Field (header)
+	if pushErr := writeBuffer.PushContext("header"); pushErr != nil {
+		return pushErr
 	}
-	// Virtual field
-	if _isBooleanErr := writeBuffer.WriteVirtual("isBoolean", m.IsBoolean); _isBooleanErr != nil {
-		return errors.Wrap(_isBooleanErr, "Error serializing 'isBoolean' field")
+	_headerErr := m.Header.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("header"); popErr != nil {
+		return popErr
 	}
-	// Virtual field
-	if _isConstructedErr := writeBuffer.WriteVirtual("isConstructed", m.IsConstructed); _isConstructedErr != nil {
-		return errors.Wrap(_isConstructedErr, "Error serializing 'isConstructed' field")
+	if _headerErr != nil {
+		return errors.Wrap(_headerErr, "Error serializing 'header' field")
 	}
 	// Virtual field
-	if _isPrimitiveAndNotBooleanErr := writeBuffer.WriteVirtual("isPrimitiveAndNotBoolean", m.IsPrimitiveAndNotBoolean); _isPrimitiveAndNotBooleanErr != nil {
-		return errors.Wrap(_isPrimitiveAndNotBooleanErr, "Error serializing 'isPrimitiveAndNotBoolean' field")
-	}
-
-	// Optional Field (extLength) (Can be skipped, if the value is null)
-	var extLength *uint8 = nil
-	if m.ExtLength != nil {
-		extLength = m.ExtLength
-		_extLengthErr := writeBuffer.WriteUint8("extLength", 8, *(extLength))
-		if _extLengthErr != nil {
-			return errors.Wrap(_extLengthErr, "Error serializing 'extLength' field")
-		}
-	}
-
-	// Optional Field (extExtLength) (Can be skipped, if the value is null)
-	var extExtLength *uint16 = nil
-	if m.ExtExtLength != nil {
-		extExtLength = m.ExtExtLength
-		_extExtLengthErr := writeBuffer.WriteUint16("extExtLength", 16, *(extExtLength))
-		if _extExtLengthErr != nil {
-			return errors.Wrap(_extExtLengthErr, "Error serializing 'extExtLength' field")
-		}
-	}
-
-	// Optional Field (extExtExtLength) (Can be skipped, if the value is null)
-	var extExtExtLength *uint32 = nil
-	if m.ExtExtExtLength != nil {
-		extExtExtLength = m.ExtExtExtLength
-		_extExtExtLengthErr := writeBuffer.WriteUint32("extExtExtLength", 32, *(extExtExtLength))
-		if _extExtExtLengthErr != nil {
-			return errors.Wrap(_extExtExtLengthErr, "Error serializing 'extExtExtLength' field")
-		}
+	if _tagNumberErr := writeBuffer.WriteVirtual("tagNumber", m.TagNumber); _tagNumberErr != nil {
+		return errors.Wrap(_tagNumberErr, "Error serializing 'tagNumber' field")
 	}
 	// Virtual field
 	if _actualLengthErr := writeBuffer.WriteVirtual("actualLength", m.ActualLength); _actualLengthErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBitString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBitString.go
index 63ca2da..d01f718 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBitString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBitString.go
@@ -48,21 +48,16 @@ func (m *BACnetApplicationTagBitString) TagNumber() uint8 {
 	return 0x8
 }
 
-func (m *BACnetApplicationTagBitString) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagBitString) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagBitString(unusedBits uint8, data []bool, unused []bool, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagBitString(unusedBits uint8, data []bool, unused []bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagBitString{
 		UnusedBits:           unusedBits,
 		Data:                 data,
 		Unused:               unused,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go
index 25fe89e..c4c67e0 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go
@@ -48,21 +48,16 @@ func (m *BACnetApplicationTagBoolean) TagNumber() uint8 {
 	return 0x1
 }
 
-func (m *BACnetApplicationTagBoolean) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagBoolean) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagBoolean(value bool, isTrue bool, isFalse bool, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagBoolean(value bool, isTrue bool, isFalse bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagBoolean{
 		Value:                value,
 		IsTrue:               isTrue,
 		IsFalse:              isFalse,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go
index 7a5117d..e2ea095 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go
@@ -48,21 +48,16 @@ func (m *BACnetApplicationTagCharacterString) TagNumber() uint8 {
 	return 0x7
 }
 
-func (m *BACnetApplicationTagCharacterString) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagCharacterString) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagCharacterString(encoding BACnetCharacterEncoding, value string, actualLengthInBit uint16, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagCharacterString(encoding BACnetCharacterEncoding, value string, actualLengthInBit uint16, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagCharacterString{
 		Encoding:             encoding,
 		Value:                value,
 		ActualLengthInBit:    actualLengthInBit,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDate.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDate.go
index fcc43b5..faea327 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDate.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDate.go
@@ -60,16 +60,11 @@ func (m *BACnetApplicationTagDate) TagNumber() uint8 {
 	return 0xA
 }
 
-func (m *BACnetApplicationTagDate) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagDate) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagDate(yearMinus1900 int8, month int8, dayOfMonth int8, dayOfWeek int8, wildcard int8, yearIsWildcard bool, year int16, monthIsWildcard bool, oddMonthWildcard bool, evenMonthWildcard bool, dayOfMonthIsWildcard bool, lastDayOfMonthWildcard bool, oddDayOfMonthWildcard bool, evenDayOfMonthWildcard bool, dayOfWeekIsWildcard bool, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagN [...]
+func NewBACnetApplicationTagDate(yearMinus1900 int8, month int8, dayOfMonth int8, dayOfWeek int8, wildcard int8, yearIsWildcard bool, year int16, monthIsWildcard bool, oddMonthWildcard bool, evenMonthWildcard bool, dayOfMonthIsWildcard bool, lastDayOfMonthWildcard bool, oddDayOfMonthWildcard bool, evenDayOfMonthWildcard bool, dayOfWeekIsWildcard bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagDate{
 		YearMinus1900:          yearMinus1900,
 		Month:                  month,
@@ -86,7 +81,7 @@ func NewBACnetApplicationTagDate(yearMinus1900 int8, month int8, dayOfMonth int8
 		OddDayOfMonthWildcard:  oddDayOfMonthWildcard,
 		EvenDayOfMonthWildcard: evenDayOfMonthWildcard,
 		DayOfWeekIsWildcard:    dayOfWeekIsWildcard,
-		BACnetApplicationTag:   NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag:   NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDouble.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDouble.go
index 9fee3aa..dd2a464 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDouble.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagDouble.go
@@ -46,19 +46,14 @@ func (m *BACnetApplicationTagDouble) TagNumber() uint8 {
 	return 0x5
 }
 
-func (m *BACnetApplicationTagDouble) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagDouble) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagDouble(value float64, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagDouble(value float64, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagDouble{
 		Value:                value,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go
index 4db5414..25168ce 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go
@@ -46,19 +46,14 @@ func (m *BACnetApplicationTagEnumerated) TagNumber() uint8 {
 	return 0x9
 }
 
-func (m *BACnetApplicationTagEnumerated) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagEnumerated) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagEnumerated(data []int8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagEnumerated(data []int8, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagEnumerated{
 		Data:                 data,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagNull.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagNull.go
index b21c337..b5c86b7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagNull.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagNull.go
@@ -44,18 +44,13 @@ func (m *BACnetApplicationTagNull) TagNumber() uint8 {
 	return 0x0
 }
 
-func (m *BACnetApplicationTagNull) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagNull) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagNull(tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagNull(header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagNull{
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go
index 8987ab7..74cd742 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go
@@ -49,22 +49,17 @@ func (m *BACnetApplicationTagObjectIdentifier) TagNumber() uint8 {
 	return 0xC
 }
 
-func (m *BACnetApplicationTagObjectIdentifier) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagObjectIdentifier) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagObjectIdentifier(objectType BACnetObjectType, proprietaryValue uint16, instanceNumber uint32, isProprietary bool, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagObjectIdentifier(objectType BACnetObjectType, proprietaryValue uint16, instanceNumber uint32, isProprietary bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagObjectIdentifier{
 		ObjectType:           objectType,
 		ProprietaryValue:     proprietaryValue,
 		InstanceNumber:       instanceNumber,
 		IsProprietary:        isProprietary,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go
index 1b6b2ec..f75d99a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go
@@ -47,20 +47,15 @@ func (m *BACnetApplicationTagOctetString) TagNumber() uint8 {
 	return 0x6
 }
 
-func (m *BACnetApplicationTagOctetString) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagOctetString) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagOctetString(value string, actualLengthInBit uint16, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagOctetString(value string, actualLengthInBit uint16, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagOctetString{
 		Value:                value,
 		ActualLengthInBit:    actualLengthInBit,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagReal.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagReal.go
index 839dece..5b3eb9f 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagReal.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagReal.go
@@ -46,19 +46,14 @@ func (m *BACnetApplicationTagReal) TagNumber() uint8 {
 	return 0x4
 }
 
-func (m *BACnetApplicationTagReal) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagReal) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagReal(value float32, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagReal(value float32, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagReal{
 		Value:                value,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go
index 0fe3899..e848a1d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go
@@ -62,16 +62,11 @@ func (m *BACnetApplicationTagSignedInteger) TagNumber() uint8 {
 	return 0x3
 }
 
-func (m *BACnetApplicationTagSignedInteger) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagSignedInteger) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagSignedInteger(valueInt8 *int8, valueInt16 *int16, valueInt24 *int32, valueInt32 *int32, valueInt40 *int64, valueInt48 *int64, valueInt56 *int64, valueInt64 *int64, isInt8 bool, isInt16 bool, isInt24 bool, isInt32 bool, isInt40 bool, isInt48 bool, isInt56 bool, isInt64 bool, actualValue uint64, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, is [...]
+func NewBACnetApplicationTagSignedInteger(valueInt8 *int8, valueInt16 *int16, valueInt24 *int32, valueInt32 *int32, valueInt40 *int64, valueInt48 *int64, valueInt56 *int64, valueInt64 *int64, isInt8 bool, isInt16 bool, isInt24 bool, isInt32 bool, isInt40 bool, isInt48 bool, isInt56 bool, isInt64 bool, actualValue uint64, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagSignedInteger{
 		ValueInt8:            valueInt8,
 		ValueInt16:           valueInt16,
@@ -90,7 +85,7 @@ func NewBACnetApplicationTagSignedInteger(valueInt8 *int8, valueInt16 *int16, va
 		IsInt56:              isInt56,
 		IsInt64:              isInt64,
 		ActualValue:          actualValue,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagTime.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagTime.go
index 18e8222..8812f31 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagTime.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagTime.go
@@ -54,16 +54,11 @@ func (m *BACnetApplicationTagTime) TagNumber() uint8 {
 	return 0xB
 }
 
-func (m *BACnetApplicationTagTime) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagTime) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagTime(hour int8, minute int8, second int8, fractional int8, wildcard int8, hourIsWildcard bool, minuteIsWildcard bool, secondIsWildcard bool, fractionalIsWildcard bool, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagTime(hour int8, minute int8, second int8, fractional int8, wildcard int8, hourIsWildcard bool, minuteIsWildcard bool, secondIsWildcard bool, fractionalIsWildcard bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagTime{
 		Hour:                 hour,
 		Minute:               minute,
@@ -74,7 +69,7 @@ func NewBACnetApplicationTagTime(hour int8, minute int8, second int8, fractional
 		MinuteIsWildcard:     minuteIsWildcard,
 		SecondIsWildcard:     secondIsWildcard,
 		FractionalIsWildcard: fractionalIsWildcard,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go
index 5914628..43100a4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go
@@ -54,16 +54,11 @@ func (m *BACnetApplicationTagUnsignedInteger) TagNumber() uint8 {
 	return 0x2
 }
 
-func (m *BACnetApplicationTagUnsignedInteger) InitializeParent(parent *BACnetApplicationTag, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) {
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetApplicationTagUnsignedInteger) InitializeParent(parent *BACnetApplicationTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) {
+	m.Header = header
 }
 
-func NewBACnetApplicationTagUnsignedInteger(valueUint8 *uint8, valueUint16 *uint16, valueUint24 *uint32, valueUint32 *uint32, isUint8 bool, isUint16 bool, isUint24 bool, isUint32 bool, actualValue uint32, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, isBoolean bool, isConstructed bool, isPrimitiveAndNotBoolean bool, actualLength uint32) *BACnetApplicationTag {
+func NewBACnetApplicationTagUnsignedInteger(valueUint8 *uint8, valueUint16 *uint16, valueUint24 *uint32, valueUint32 *uint32, isUint8 bool, isUint16 bool, isUint24 bool, isUint32 bool, actualValue uint32, header *BACnetTagHeader, tagNumber uint8, actualLength uint32) *BACnetApplicationTag {
 	child := &BACnetApplicationTagUnsignedInteger{
 		ValueUint8:           valueUint8,
 		ValueUint16:          valueUint16,
@@ -74,7 +69,7 @@ func NewBACnetApplicationTagUnsignedInteger(valueUint8 *uint8, valueUint16 *uint
 		IsUint24:             isUint24,
 		IsUint32:             isUint32,
 		ActualValue:          actualValue,
-		BACnetApplicationTag: NewBACnetApplicationTag(tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, isBoolean, isConstructed, isPrimitiveAndNotBoolean, actualLength),
+		BACnetApplicationTag: NewBACnetApplicationTag(header, tagNumber, actualLength),
 	}
 	child.Child = child
 	return child.BACnetApplicationTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
index eddd94e..72c7ba1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetClosingTag.go
@@ -44,19 +44,17 @@ func (m *BACnetClosingTag) DataType() BACnetDataType {
 	return BACnetDataType_CLOSING_TAG
 }
 
-func (m *BACnetClosingTag) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetClosingTag) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetClosingTag(tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetClosingTag) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetClosingTag(header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetClosingTag{
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
index b17c13d..efb9685 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTag.go
@@ -28,21 +28,17 @@ import (
 
 // The data-structure of this message
 type BACnetContextTag struct {
+	Header          *BACnetTagHeader
 	TagNumber       uint8
-	TagClass        TagClass
-	LengthValueType uint8
-	ExtTagNumber    *uint8
-	ExtLength       *uint8
-	ExtExtLength    *uint16
-	ExtExtExtLength *uint32
-	ActualTagNumber uint8
 	ActualLength    uint32
+	LengthValueType uint8
 	Child           IBACnetContextTagChild
 }
 
 // The corresponding interface
 type IBACnetContextTag interface {
 	DataType() BACnetDataType
+	LengthValueType() uint8
 	LengthInBytes() uint16
 	LengthInBits() uint16
 	Serialize(writeBuffer utils.WriteBuffer) error
@@ -55,13 +51,13 @@ type IBACnetContextTagParent interface {
 
 type IBACnetContextTagChild interface {
 	Serialize(writeBuffer utils.WriteBuffer) error
-	InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32)
+	InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8)
 	GetTypeName() string
 	IBACnetContextTag
 }
 
-func NewBACnetContextTag(tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
-	return &BACnetContextTag{TagNumber: tagNumber, TagClass: tagClass, LengthValueType: lengthValueType, ExtTagNumber: extTagNumber, ExtLength: extLength, ExtExtLength: extExtLength, ExtExtExtLength: extExtExtLength, ActualTagNumber: actualTagNumber, ActualLength: actualLength}
+func NewBACnetContextTag(header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
+	return &BACnetContextTag{Header: header, TagNumber: tagNumber, ActualLength: actualLength, LengthValueType: lengthValueType}
 }
 
 func CastBACnetContextTag(structType interface{}) *BACnetContextTag {
@@ -92,33 +88,12 @@ func (m *BACnetContextTag) LengthInBitsConditional(lastItem bool) uint16 {
 func (m *BACnetContextTag) ParentLengthInBits() uint16 {
 	lengthInBits := uint16(0)
 
-	// Simple field (tagNumber)
-	lengthInBits += 4
-
-	// Simple field (lengthValueType)
-	lengthInBits += 3
-
-	// Optional Field (extTagNumber)
-	if m.ExtTagNumber != nil {
-		lengthInBits += 8
-	}
+	// Simple field (header)
+	lengthInBits += m.Header.LengthInBits()
 
 	// A virtual field doesn't have any in- or output.
 
-	// Optional Field (extLength)
-	if m.ExtLength != nil {
-		lengthInBits += 8
-	}
-
-	// Optional Field (extExtLength)
-	if m.ExtExtLength != nil {
-		lengthInBits += 16
-	}
-
-	// Optional Field (extExtExtLength)
-	if m.ExtExtExtLength != nil {
-		lengthInBits += 32
-	}
+	// A virtual field doesn't have any in- or output.
 
 	// A virtual field doesn't have any in- or output.
 
@@ -134,81 +109,31 @@ func BACnetContextTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 		return nil, pullErr
 	}
 
-	// Simple Field (tagNumber)
-	_tagNumber, _tagNumberErr := readBuffer.ReadUint8("tagNumber", 4)
-	if _tagNumberErr != nil {
-		return nil, errors.Wrap(_tagNumberErr, "Error parsing 'tagNumber' field")
-	}
-	tagNumber := _tagNumber
-
-	// Assert Field (tagClass) (Can be skipped, if a given expression evaluates to false)
-	tagClass, _err := TagClassParse(readBuffer)
-	if _err != nil {
-		return nil, errors.Wrap(_err, "Error parsing 'tagClass' field")
-	}
-	if tagClass != TagClass_CONTEXT_SPECIFIC_TAGS {
-		return nil, utils.ParseAssertError
+	// Simple Field (header)
+	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
+		return nil, pullErr
 	}
-
-	// Simple Field (lengthValueType)
-	_lengthValueType, _lengthValueTypeErr := readBuffer.ReadUint8("lengthValueType", 3)
-	if _lengthValueTypeErr != nil {
-		return nil, errors.Wrap(_lengthValueTypeErr, "Error parsing 'lengthValueType' field")
+	_header, _headerErr := BACnetTagHeaderParse(readBuffer)
+	if _headerErr != nil {
+		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field")
 	}
-	lengthValueType := _lengthValueType
-
-	// Optional Field (extTagNumber) (Can be skipped, if a given expression evaluates to false)
-	var extTagNumber *uint8 = nil
-	if bool((tagNumber) == (15)) {
-		_val, _err := readBuffer.ReadUint8("extTagNumber", 8)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extTagNumber' field")
-		}
-		extTagNumber = &_val
+	header := CastBACnetTagHeader(_header)
+	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
+		return nil, closeErr
 	}
 
 	// Virtual field
-	_actualTagNumber := utils.InlineIf(bool((tagNumber) < (15)), func() interface{} { return uint8(tagNumber) }, func() interface{} { return uint8((*extTagNumber)) }).(uint8)
-	actualTagNumber := uint8(_actualTagNumber)
-
-	// Optional Field (extLength) (Can be skipped, if a given expression evaluates to false)
-	var extLength *uint8 = nil
-	if bool((lengthValueType) == (5)) {
-		_val, _err := readBuffer.ReadUint8("extLength", 8)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extLength' field")
-		}
-		extLength = &_val
-	}
-
-	// Optional Field (extExtLength) (Can be skipped, if a given expression evaluates to false)
-	var extExtLength *uint16 = nil
-	if bool(bool((lengthValueType) == (5))) && bool(bool((*extLength) == (254))) {
-		_val, _err := readBuffer.ReadUint16("extExtLength", 16)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extExtLength' field")
-		}
-		extExtLength = &_val
-	}
-
-	// Optional Field (extExtExtLength) (Can be skipped, if a given expression evaluates to false)
-	var extExtExtLength *uint32 = nil
-	if bool(bool((lengthValueType) == (5))) && bool(bool((*extLength) == (255))) {
-		_val, _err := readBuffer.ReadUint32("extExtExtLength", 32)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'extExtExtLength' field")
-		}
-		extExtExtLength = &_val
-	}
+	_tagNumber := header.TagNumber
+	tagNumber := uint8(_tagNumber)
 
 	// Virtual field
-	_actualLength := utils.InlineIf(bool(bool((lengthValueType) == (5))) && bool(bool((*extLength) == (255))), func() interface{} { return uint32((*extExtExtLength)) }, func() interface{} {
-		return uint32(uint32(utils.InlineIf(bool(bool((lengthValueType) == (5))) && bool(bool((*extLength) == (254))), func() interface{} { return uint32((*extExtLength)) }, func() interface{} {
-			return uint32(uint32(utils.InlineIf(bool((lengthValueType) == (5)), func() interface{} { return uint32((*extLength)) }, func() interface{} { return uint32(lengthValueType) }).(uint32)))
-		}).(uint32)))
-	}).(uint32)
+	_actualLength := header.ActualLength
 	actualLength := uint32(_actualLength)
 
+	// Virtual field
+	_lengthValueType := header.LengthValueType
+	lengthValueType := uint8(_lengthValueType)
+
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var _parent *BACnetContextTag
 	var typeSwitchError error
@@ -266,7 +191,7 @@ func BACnetContextTagParse(readBuffer utils.ReadBuffer, tagNumberArgument uint8,
 	}
 
 	// Finish initializing
-	_parent.Child.InitializeParent(_parent, tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength)
+	_parent.Child.InitializeParent(_parent, header, tagNumber, actualLength, lengthValueType)
 	return _parent, nil
 }
 
@@ -279,67 +204,29 @@ func (m *BACnetContextTag) SerializeParent(writeBuffer utils.WriteBuffer, child
 		return pushErr
 	}
 
-	// Simple Field (tagNumber)
-	tagNumber := uint8(m.TagNumber)
-	_tagNumberErr := writeBuffer.WriteUint8("tagNumber", 4, (tagNumber))
-	if _tagNumberErr != nil {
-		return errors.Wrap(_tagNumberErr, "Error serializing 'tagNumber' field")
+	// Simple Field (header)
+	if pushErr := writeBuffer.PushContext("header"); pushErr != nil {
+		return pushErr
 	}
-
-	// Simple Field (lengthValueType)
-	lengthValueType := uint8(m.LengthValueType)
-	_lengthValueTypeErr := writeBuffer.WriteUint8("lengthValueType", 3, (lengthValueType))
-	if _lengthValueTypeErr != nil {
-		return errors.Wrap(_lengthValueTypeErr, "Error serializing 'lengthValueType' field")
+	_headerErr := m.Header.Serialize(writeBuffer)
+	if popErr := writeBuffer.PopContext("header"); popErr != nil {
+		return popErr
 	}
-
-	// Optional Field (extTagNumber) (Can be skipped, if the value is null)
-	var extTagNumber *uint8 = nil
-	if m.ExtTagNumber != nil {
-		extTagNumber = m.ExtTagNumber
-		_extTagNumberErr := writeBuffer.WriteUint8("extTagNumber", 8, *(extTagNumber))
-		if _extTagNumberErr != nil {
-			return errors.Wrap(_extTagNumberErr, "Error serializing 'extTagNumber' field")
-		}
+	if _headerErr != nil {
+		return errors.Wrap(_headerErr, "Error serializing 'header' field")
 	}
 	// Virtual field
-	if _actualTagNumberErr := writeBuffer.WriteVirtual("actualTagNumber", m.ActualTagNumber); _actualTagNumberErr != nil {
-		return errors.Wrap(_actualTagNumberErr, "Error serializing 'actualTagNumber' field")
-	}
-
-	// Optional Field (extLength) (Can be skipped, if the value is null)
-	var extLength *uint8 = nil
-	if m.ExtLength != nil {
-		extLength = m.ExtLength
-		_extLengthErr := writeBuffer.WriteUint8("extLength", 8, *(extLength))
-		if _extLengthErr != nil {
-			return errors.Wrap(_extLengthErr, "Error serializing 'extLength' field")
-		}
-	}
-
-	// Optional Field (extExtLength) (Can be skipped, if the value is null)
-	var extExtLength *uint16 = nil
-	if m.ExtExtLength != nil {
-		extExtLength = m.ExtExtLength
-		_extExtLengthErr := writeBuffer.WriteUint16("extExtLength", 16, *(extExtLength))
-		if _extExtLengthErr != nil {
-			return errors.Wrap(_extExtLengthErr, "Error serializing 'extExtLength' field")
-		}
-	}
-
-	// Optional Field (extExtExtLength) (Can be skipped, if the value is null)
-	var extExtExtLength *uint32 = nil
-	if m.ExtExtExtLength != nil {
-		extExtExtLength = m.ExtExtExtLength
-		_extExtExtLengthErr := writeBuffer.WriteUint32("extExtExtLength", 32, *(extExtExtLength))
-		if _extExtExtLengthErr != nil {
-			return errors.Wrap(_extExtExtLengthErr, "Error serializing 'extExtExtLength' field")
-		}
+	if _tagNumberErr := writeBuffer.WriteVirtual("tagNumber", m.TagNumber); _tagNumberErr != nil {
+		return errors.Wrap(_tagNumberErr, "Error serializing 'tagNumber' field")
 	}
 	// Virtual field
 	if _actualLengthErr := writeBuffer.WriteVirtual("actualLength", m.ActualLength); _actualLengthErr != nil {
 		return errors.Wrap(_actualLengthErr, "Error serializing 'actualLength' field")
 	}
+	// Virtual field
+	if _lengthValueTypeErr := writeBuffer.WriteVirtual("lengthValueType", m.LengthValueType); _lengthValueTypeErr != nil {
+		return errors.Wrap(_lengthValueTypeErr, "Error serializing 'lengthValueType' field")
+	}
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
 	if _typeSwitchErr := serializeChildFunction(); _typeSwitchErr != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go
index 49514be..0be088c 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBitString.go
@@ -48,22 +48,20 @@ func (m *BACnetContextTagBitString) DataType() BACnetDataType {
 	return BACnetDataType_BIT_STRING
 }
 
-func (m *BACnetContextTagBitString) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagBitString) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagBitString(unusedBits uint8, data []bool, unused []bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagBitString) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagBitString(unusedBits uint8, data []bool, unused []bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagBitString{
 		UnusedBits:       unusedBits,
 		Data:             data,
 		Unused:           unused,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
index 86e3d37..3bb553e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagBoolean.go
@@ -48,22 +48,20 @@ func (m *BACnetContextTagBoolean) DataType() BACnetDataType {
 	return BACnetDataType_BOOLEAN
 }
 
-func (m *BACnetContextTagBoolean) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagBoolean) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagBoolean(value uint8, isTrue bool, isFalse bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagBoolean) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagBoolean(value uint8, isTrue bool, isFalse bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagBoolean{
 		Value:            value,
 		IsTrue:           isTrue,
 		IsFalse:          isFalse,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go
index b569946..eb2b236 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagCharacterString.go
@@ -48,22 +48,20 @@ func (m *BACnetContextTagCharacterString) DataType() BACnetDataType {
 	return BACnetDataType_CHARACTER_STRING
 }
 
-func (m *BACnetContextTagCharacterString) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagCharacterString) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagCharacterString(encoding BACnetCharacterEncoding, value string, actualLengthInBit uint16, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagCharacterString) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagCharacterString(encoding BACnetCharacterEncoding, value string, actualLengthInBit uint16, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagCharacterString{
 		Encoding:          encoding,
 		Value:             value,
 		ActualLengthInBit: actualLengthInBit,
-		BACnetContextTag:  NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag:  NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go
index e116517..80cae42 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDate.go
@@ -59,17 +59,15 @@ func (m *BACnetContextTagDate) DataType() BACnetDataType {
 	return BACnetDataType_DATE
 }
 
-func (m *BACnetContextTagDate) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagDate) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagDate(yearMinus1900 int8, month int8, dayOfMonth int8, dayOfWeek int8, wildcard int8, yearIsWildcard bool, monthIsWildcard bool, oddMonthWildcard bool, evenMonthWildcard bool, dayOfMonthIsWildcard bool, lastDayOfMonthWildcard bool, oddDayOfMonthWildcard bool, evenDayOfMonthWildcard bool, dayOfWeekIsWildcard bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTag [...]
+func (m *BACnetContextTagDate) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagDate(yearMinus1900 int8, month int8, dayOfMonth int8, dayOfWeek int8, wildcard int8, yearIsWildcard bool, monthIsWildcard bool, oddMonthWildcard bool, evenMonthWildcard bool, dayOfMonthIsWildcard bool, lastDayOfMonthWildcard bool, oddDayOfMonthWildcard bool, evenDayOfMonthWildcard bool, dayOfWeekIsWildcard bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagDate{
 		YearMinus1900:          yearMinus1900,
 		Month:                  month,
@@ -85,7 +83,7 @@ func NewBACnetContextTagDate(yearMinus1900 int8, month int8, dayOfMonth int8, da
 		OddDayOfMonthWildcard:  oddDayOfMonthWildcard,
 		EvenDayOfMonthWildcard: evenDayOfMonthWildcard,
 		DayOfWeekIsWildcard:    dayOfWeekIsWildcard,
-		BACnetContextTag:       NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag:       NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
index 2fa1b47..e3319e2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDeviceState.go
@@ -46,20 +46,18 @@ func (m *BACnetContextTagDeviceState) DataType() BACnetDataType {
 	return BACnetDataType_BACNET_DEVICE_STATE
 }
 
-func (m *BACnetContextTagDeviceState) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagDeviceState) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagDeviceState(state BACnetDeviceState, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagDeviceState) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagDeviceState(state BACnetDeviceState, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagDeviceState{
 		State:            state,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
index 9308554..e5fe4d4 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagDouble.go
@@ -46,20 +46,18 @@ func (m *BACnetContextTagDouble) DataType() BACnetDataType {
 	return BACnetDataType_DOUBLE
 }
 
-func (m *BACnetContextTagDouble) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagDouble) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagDouble(value float64, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagDouble) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagDouble(value float64, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagDouble{
 		Value:            value,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEmpty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEmpty.go
index 3d1c7f3..fdd5eda 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEmpty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEmpty.go
@@ -44,19 +44,17 @@ func (m *BACnetContextTagEmpty) DataType() BACnetDataType {
 	return 0
 }
 
-func (m *BACnetContextTagEmpty) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagEmpty) LengthValueType() uint8 {
+	return 0
+}
+
+func (m *BACnetContextTagEmpty) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
 }
 
-func NewBACnetContextTagEmpty(tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func NewBACnetContextTagEmpty(header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagEmpty{
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go
index 1cd1c1c..06e2b0b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEnumerated.go
@@ -46,20 +46,18 @@ func (m *BACnetContextTagEnumerated) DataType() BACnetDataType {
 	return BACnetDataType_ENUMERATED
 }
 
-func (m *BACnetContextTagEnumerated) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagEnumerated) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagEnumerated(data []int8, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagEnumerated) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagEnumerated(data []int8, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagEnumerated{
 		Data:             data,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
index 0af0a06..0795ab1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventState.go
@@ -48,22 +48,20 @@ func (m *BACnetContextTagEventState) DataType() BACnetDataType {
 	return BACnetDataType_EVENT_STATE
 }
 
-func (m *BACnetContextTagEventState) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagEventState) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagEventState(eventState BACnetEventState, proprietaryValue uint32, isProprietary bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagEventState) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagEventState(eventState BACnetEventState, proprietaryValue uint32, isProprietary bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagEventState{
 		EventState:       eventState,
 		ProprietaryValue: proprietaryValue,
 		IsProprietary:    isProprietary,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
index 6d9189b..93d552d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagEventType.go
@@ -48,22 +48,20 @@ func (m *BACnetContextTagEventType) DataType() BACnetDataType {
 	return BACnetDataType_EVENT_TYPE
 }
 
-func (m *BACnetContextTagEventType) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagEventType) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagEventType(eventType BACnetEventType, proprietaryValue uint32, isProprietary bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagEventType) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagEventType(eventType BACnetEventType, proprietaryValue uint32, isProprietary bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagEventType{
 		EventType:        eventType,
 		ProprietaryValue: proprietaryValue,
 		IsProprietary:    isProprietary,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
index 689580b..a3ec067 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagNotifyType.go
@@ -46,20 +46,18 @@ func (m *BACnetContextTagNotifyType) DataType() BACnetDataType {
 	return BACnetDataType_NOTIFY_TYPE
 }
 
-func (m *BACnetContextTagNotifyType) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagNotifyType) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagNotifyType(value BACnetNotifyType, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagNotifyType) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagNotifyType(value BACnetNotifyType, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagNotifyType{
 		Value:            value,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go
index 2ab61df..597ff7e 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagObjectIdentifier.go
@@ -49,23 +49,21 @@ func (m *BACnetContextTagObjectIdentifier) DataType() BACnetDataType {
 	return BACnetDataType_BACNET_OBJECT_IDENTIFIER
 }
 
-func (m *BACnetContextTagObjectIdentifier) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagObjectIdentifier) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagObjectIdentifier(objectType BACnetObjectType, proprietaryValue uint16, instanceNumber uint32, isProprietary bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagObjectIdentifier) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagObjectIdentifier(objectType BACnetObjectType, proprietaryValue uint16, instanceNumber uint32, isProprietary bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagObjectIdentifier{
 		ObjectType:       objectType,
 		ProprietaryValue: proprietaryValue,
 		InstanceNumber:   instanceNumber,
 		IsProprietary:    isProprietary,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
index d2b3acb..471599a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagOctetString.go
@@ -47,21 +47,19 @@ func (m *BACnetContextTagOctetString) DataType() BACnetDataType {
 	return BACnetDataType_OCTET_STRING
 }
 
-func (m *BACnetContextTagOctetString) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagOctetString) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagOctetString(value string, actualLengthInBit uint16, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagOctetString) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagOctetString(value string, actualLengthInBit uint16, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagOctetString{
 		Value:             value,
 		ActualLengthInBit: actualLengthInBit,
-		BACnetContextTag:  NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag:  NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go
index fb9040c..756cf49 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagPropertyIdentifier.go
@@ -48,22 +48,20 @@ func (m *BACnetContextTagPropertyIdentifier) DataType() BACnetDataType {
 	return BACnetDataType_BACNET_PROPERTY_IDENTIFIER
 }
 
-func (m *BACnetContextTagPropertyIdentifier) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagPropertyIdentifier) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagPropertyIdentifier(propertyIdentifier BACnetPropertyIdentifier, proprietaryValue uint32, isProprietary bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagPropertyIdentifier) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagPropertyIdentifier(propertyIdentifier BACnetPropertyIdentifier, proprietaryValue uint32, isProprietary bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagPropertyIdentifier{
 		PropertyIdentifier: propertyIdentifier,
 		ProprietaryValue:   proprietaryValue,
 		IsProprietary:      isProprietary,
-		BACnetContextTag:   NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag:   NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
index be79ede..9a0b949 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagReal.go
@@ -46,20 +46,18 @@ func (m *BACnetContextTagReal) DataType() BACnetDataType {
 	return BACnetDataType_REAL
 }
 
-func (m *BACnetContextTagReal) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagReal) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagReal(value float32, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagReal) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagReal(value float32, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagReal{
 		Value:            value,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go
index 4b0ede4..f45ca34 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagSignedInteger.go
@@ -62,17 +62,15 @@ func (m *BACnetContextTagSignedInteger) DataType() BACnetDataType {
 	return BACnetDataType_SIGNED_INTEGER
 }
 
-func (m *BACnetContextTagSignedInteger) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagSignedInteger) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagSignedInteger(valueInt8 *int8, valueInt16 *int16, valueInt24 *int32, valueInt32 *int32, valueInt40 *int64, valueInt48 *int64, valueInt56 *int64, valueInt64 *int64, isInt8 bool, isInt16 bool, isInt24 bool, isInt32 bool, isInt40 bool, isInt48 bool, isInt56 bool, isInt64 bool, actualValue uint64, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actua [...]
+func (m *BACnetContextTagSignedInteger) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagSignedInteger(valueInt8 *int8, valueInt16 *int16, valueInt24 *int32, valueInt32 *int32, valueInt40 *int64, valueInt48 *int64, valueInt56 *int64, valueInt64 *int64, isInt8 bool, isInt16 bool, isInt24 bool, isInt32 bool, isInt40 bool, isInt48 bool, isInt56 bool, isInt64 bool, actualValue uint64, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagSignedInteger{
 		ValueInt8:        valueInt8,
 		ValueInt16:       valueInt16,
@@ -91,7 +89,7 @@ func NewBACnetContextTagSignedInteger(valueInt8 *int8, valueInt16 *int16, valueI
 		IsInt56:          isInt56,
 		IsInt64:          isInt64,
 		ActualValue:      actualValue,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go
index cf1e138..3d5f7cf 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagTime.go
@@ -54,17 +54,15 @@ func (m *BACnetContextTagTime) DataType() BACnetDataType {
 	return BACnetDataType_TIME
 }
 
-func (m *BACnetContextTagTime) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagTime) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagTime(hour int8, minute int8, second int8, fractional int8, wildcard int8, hourIsWildcard bool, minuteIsWildcard bool, secondIsWildcard bool, fractionalIsWildcard bool, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagTime) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagTime(hour int8, minute int8, second int8, fractional int8, wildcard int8, hourIsWildcard bool, minuteIsWildcard bool, secondIsWildcard bool, fractionalIsWildcard bool, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagTime{
 		Hour:                 hour,
 		Minute:               minute,
@@ -75,7 +73,7 @@ func NewBACnetContextTagTime(hour int8, minute int8, second int8, fractional int
 		MinuteIsWildcard:     minuteIsWildcard,
 		SecondIsWildcard:     secondIsWildcard,
 		FractionalIsWildcard: fractionalIsWildcard,
-		BACnetContextTag:     NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag:     NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go
index e6c4636..097b53d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetContextTagUnsignedInteger.go
@@ -54,17 +54,15 @@ func (m *BACnetContextTagUnsignedInteger) DataType() BACnetDataType {
 	return BACnetDataType_UNSIGNED_INTEGER
 }
 
-func (m *BACnetContextTagUnsignedInteger) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetContextTagUnsignedInteger) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetContextTagUnsignedInteger(valueUint8 *uint8, valueUint16 *uint16, valueUint24 *uint32, valueUint32 *uint32, isUint8 bool, isUint16 bool, isUint24 bool, isUint32 bool, actualValue uint32, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetContextTagUnsignedInteger) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetContextTagUnsignedInteger(valueUint8 *uint8, valueUint16 *uint16, valueUint24 *uint32, valueUint32 *uint32, isUint8 bool, isUint16 bool, isUint24 bool, isUint32 bool, actualValue uint32, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetContextTagUnsignedInteger{
 		ValueUint8:       valueUint8,
 		ValueUint16:      valueUint16,
@@ -75,7 +73,7 @@ func NewBACnetContextTagUnsignedInteger(valueUint8 *uint8, valueUint16 *uint16,
 		IsUint24:         isUint24,
 		IsUint32:         isUint32,
 		ActualValue:      actualValue,
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
index a5ef4f0..e5e8cc5 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetOpeningTag.go
@@ -44,19 +44,17 @@ func (m *BACnetOpeningTag) DataType() BACnetDataType {
 	return BACnetDataType_OPENING_TAG
 }
 
-func (m *BACnetOpeningTag) InitializeParent(parent *BACnetContextTag, tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) {
-	m.TagNumber = tagNumber
-	m.TagClass = tagClass
-	m.LengthValueType = lengthValueType
-	m.ExtTagNumber = extTagNumber
-	m.ExtLength = extLength
-	m.ExtExtLength = extExtLength
-	m.ExtExtExtLength = extExtExtLength
+func (m *BACnetOpeningTag) LengthValueType() uint8 {
+	return 0
 }
 
-func NewBACnetOpeningTag(tagNumber uint8, tagClass TagClass, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, extExtLength *uint16, extExtExtLength *uint32, actualTagNumber uint8, actualLength uint32) *BACnetContextTag {
+func (m *BACnetOpeningTag) InitializeParent(parent *BACnetContextTag, header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) {
+	m.Header = header
+}
+
+func NewBACnetOpeningTag(header *BACnetTagHeader, tagNumber uint8, actualLength uint32, lengthValueType uint8) *BACnetContextTag {
 	child := &BACnetOpeningTag{
-		BACnetContextTag: NewBACnetContextTag(tagNumber, tagClass, lengthValueType, extTagNumber, extLength, extExtLength, extExtExtLength, actualTagNumber, actualLength),
+		BACnetContextTag: NewBACnetContextTag(header, tagNumber, actualLength, lengthValueType),
 	}
 	child.Child = child
 	return child.BACnetContextTag
diff --git a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java
index 2f22131..546c9a4 100644
--- a/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java
+++ b/plc4j/drivers/bacnet/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java
@@ -213,7 +213,7 @@ public class BacNetIpProtocolLogic extends Plc4xProtocolBase<BVLC> implements Ha
                     enrichedPlcValue.put("address", new PlcSTRING(toString(curField)));
 
                     // From the original BACNet tag
-                    enrichedPlcValue.put("tagNumber", IEC61131ValueHandler.of(baCnetTag.getActualTagNumber()));
+                    enrichedPlcValue.put("tagNumber", IEC61131ValueHandler.of(baCnetTag.getTagNumber()));
                     enrichedPlcValue.put("lengthValueType", IEC61131ValueHandler.of(baCnetTag.getActualLength()));
 
                     // Use the information in the edeModel to enrich the information.
diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index d0ef8df..c124b32 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -965,7 +965,7 @@
 ]
 
 [discriminatedType BACnetTagHeader
-    [simple        uint 4   tagNumber                                                                                  ]
+    [simple        uint 4   tagNumber                                                                                 ]
     [simple        TagClass tagClass                                                                                  ]
     [simple        uint 3   lengthValueType                                                                           ]
     [optional      uint 8   extTagNumber    'tagNumber == 15'                                                         ]
@@ -980,19 +980,12 @@
 ]
 
 [discriminatedType BACnetApplicationTag
-    [discriminator uint 4   tagNumber                                                                                 ]
-    [assert        TagClass tagClass        'TagClass.APPLICATION_TAGS'                                               ]
-    [simple        uint 3   lengthValueType                                                                           ]
-    [optional      uint 8   extTagNumber    'tagNumber == 15'                                                         ]
-    [virtual       uint 8   actualTagNumber 'tagNumber < 15 ? tagNumber : extTagNumber'                               ]
-    [virtual       bit      isBoolean       'tagNumber == 1 && tagClass == TagClass.APPLICATION_TAGS'                 ]
-    [virtual       bit      isConstructed   'tagClass == TagClass.CONTEXT_SPECIFIC_TAGS && lengthValueType == 6'      ]
-    [virtual       bit      isPrimitiveAndNotBoolean '!isConstructed && !isBoolean'                                   ]
-    [optional      uint 8   extLength       'isPrimitiveAndNotBoolean && lengthValueType == 5'                        ]
-    [optional      uint 16  extExtLength    'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 254'    ]
-    [optional      uint 32  extExtExtLength 'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 255'    ]
-    [virtual       uint 32  actualLength    'lengthValueType == 5 && extLength == 255 ? extExtExtLength : (lengthValueType == 5 && extLength == 254 ? extExtLength : (lengthValueType == 5 ? extLength : lengthValueType))']
-    [validation                             'tagClass == TagClass.APPLICATION_TAGS'    "should be a application tag"  ]
+    [simple        BACnetTagHeader
+                            header
+    ]
+    [validation    'header.tagClass == TagClass.APPLICATION_TAGS'    "should be a application tag"                    ]
+    [virtual       uint 4   tagNumber     'header.tagNumber'                                                          ]
+    [virtual       uint 32  actualLength  'header.actualLength'                                                       ]
     [typeSwitch tagNumber
         ['0x0' BACnetApplicationTagNull
         ]
@@ -1101,17 +1094,15 @@
 ]
 
 [discriminatedType BACnetContextTag(uint 8 tagNumberArgument, BACnetDataType dataType)
-    [simple        uint 4   tagNumber                                                                         ]
-    [assert        TagClass tagClass            'TagClass.CONTEXT_SPECIFIC_TAGS'                              ]
-    [simple        uint 3   lengthValueType                                                                   ]
-    [optional      uint 8   extTagNumber        'tagNumber == 15'                                             ]
-    [virtual       uint 8   actualTagNumber     'tagNumber < 15 ? tagNumber : extTagNumber'                   ]
-    [optional      uint 8   extLength           'lengthValueType == 5'                                        ]
-    [optional      uint 16  extExtLength        'lengthValueType == 5 && extLength == 254'                    ]
-    [optional      uint 32  extExtExtLength     'lengthValueType == 5 && extLength == 255'                    ]
-    [virtual       uint 32  actualLength        'lengthValueType == 5 && extLength == 255 ? extExtExtLength : (lengthValueType == 5 && extLength == 254 ? extExtLength : (lengthValueType == 5 ? extLength : lengthValueType))']
-    [validation                                 'actualTagNumber == tagNumberArgument'    "tagnumber doesn't match" ]
-    [validation                                 'tagClass == TagClass.CONTEXT_SPECIFIC_TAGS'    "should be a context tag"  ]
+    [simple        BACnetTagHeader
+                            header
+    ]
+    [validation    'header.actualTagNumber == tagNumberArgument'    "tagnumber doesn't match"                         ]
+    [validation    'header.tagClass == TagClass.CONTEXT_SPECIFIC_TAGS'    "should be a context tag"                   ]
+    [virtual       uint 4   tagNumber     'header.tagNumber'                                                          ]
+    [virtual       uint 32  actualLength  'header.actualLength'                                                       ]
+    // Required to detect opening and closing tags.
+    [virtual       uint 3  lengthValueType  'header.lengthValueType'                                                  ]
     [typeSwitch dataType, lengthValueType
         ['BOOLEAN' BACnetContextTagBoolean
             [simple  uint 8 value                          ]

[plc4x] 01/02: refactor(bacnet): small optimizations

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

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

commit bd718596b826ef8591c5795bf2fa3ba20dcd489f
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Jan 17 11:14:15 2022 +0100

    refactor(bacnet): small optimizations
---
 .../resources/protocols/bacnetip/bacnetip.mspec    | 38 ++++++++++++----------
 1 file changed, 20 insertions(+), 18 deletions(-)

diff --git a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
index b97b38c..d0ef8df 100644
--- a/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
+++ b/protocols/bacnetip/src/main/resources/protocols/bacnetip/bacnetip.mspec
@@ -311,7 +311,7 @@
             [simple   BACnetContextTagObjectIdentifier('0', 'BACnetDataType.BACNET_OBJECT_IDENTIFIER')     objectIdentifier    ]
             [simple   BACnetContextTagPropertyIdentifier('1', 'BACnetDataType.BACNET_PROPERTY_IDENTIFIER') propertyIdentifier  ]
             [optional BACnetContextTagUnsignedInteger('2', 'BACnetDataType.UNSIGNED_INTEGER')              arrayIndex          ]
-            [simple   BACnetConstructedData('3', 'objectIdentifier.objectType', 'propertyIdentifier')           propertyValue       ]
+            [simple   BACnetConstructedData('3', 'objectIdentifier.objectType', 'propertyIdentifier')      propertyValue       ]
             [optional BACnetContextTagUnsignedInteger('4', 'BACnetDataType.UNSIGNED_INTEGER')              priority            ]
         ]
         ['0x10' BACnetConfirmedServiceRequestWritePropertyMultiple
@@ -965,7 +965,7 @@
 ]
 
 [discriminatedType BACnetTagHeader
-    [simple        uint 4  tagNumber                                                                                  ]
+    [simple        uint 4   tagNumber                                                                                  ]
     [simple        TagClass tagClass                                                                                  ]
     [simple        uint 3   lengthValueType                                                                           ]
     [optional      uint 8   extTagNumber    'tagNumber == 15'                                                         ]
@@ -992,6 +992,7 @@
     [optional      uint 16  extExtLength    'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 254'    ]
     [optional      uint 32  extExtExtLength 'isPrimitiveAndNotBoolean && lengthValueType == 5 && extLength == 255'    ]
     [virtual       uint 32  actualLength    'lengthValueType == 5 && extLength == 255 ? extExtExtLength : (lengthValueType == 5 && extLength == 254 ? extExtLength : (lengthValueType == 5 ? extLength : lengthValueType))']
+    [validation                             'tagClass == TagClass.APPLICATION_TAGS'    "should be a application tag"  ]
     [typeSwitch tagNumber
         ['0x0' BACnetApplicationTagNull
         ]
@@ -1100,16 +1101,17 @@
 ]
 
 [discriminatedType BACnetContextTag(uint 8 tagNumberArgument, BACnetDataType dataType)
-    [simple        uint 4           tagNumber                                                                         ]
-    [assert        TagClass         tagClass            'TagClass.CONTEXT_SPECIFIC_TAGS'                              ]
-    [simple        uint 3           lengthValueType                                                                   ]
-    [optional      uint 8           extTagNumber        'tagNumber == 15'                                             ]
-    [virtual       uint 8           actualTagNumber     'tagNumber < 15 ? tagNumber : extTagNumber'                   ]
-    [optional      uint 8           extLength           'lengthValueType == 5'                                        ]
-    [optional      uint 16          extExtLength        'lengthValueType == 5 && extLength == 254'                    ]
-    [optional      uint 32          extExtExtLength     'lengthValueType == 5 && extLength == 255'                    ]
-    [virtual       uint 32          actualLength        'lengthValueType == 5 && extLength == 255 ? extExtExtLength : (lengthValueType == 5 && extLength == 254 ? extExtLength : (lengthValueType == 5 ? extLength : lengthValueType))']
-    [validation                                         'actualTagNumber == tagNumberArgument'    "tagnumber doesn't match" ]
+    [simple        uint 4   tagNumber                                                                         ]
+    [assert        TagClass tagClass            'TagClass.CONTEXT_SPECIFIC_TAGS'                              ]
+    [simple        uint 3   lengthValueType                                                                   ]
+    [optional      uint 8   extTagNumber        'tagNumber == 15'                                             ]
+    [virtual       uint 8   actualTagNumber     'tagNumber < 15 ? tagNumber : extTagNumber'                   ]
+    [optional      uint 8   extLength           'lengthValueType == 5'                                        ]
+    [optional      uint 16  extExtLength        'lengthValueType == 5 && extLength == 254'                    ]
+    [optional      uint 32  extExtExtLength     'lengthValueType == 5 && extLength == 255'                    ]
+    [virtual       uint 32  actualLength        'lengthValueType == 5 && extLength == 255 ? extExtExtLength : (lengthValueType == 5 && extLength == 254 ? extExtLength : (lengthValueType == 5 ? extLength : lengthValueType))']
+    [validation                                 'actualTagNumber == tagNumberArgument'    "tagnumber doesn't match" ]
+    [validation                                 'tagClass == TagClass.CONTEXT_SPECIFIC_TAGS'    "should be a context tag"  ]
     [typeSwitch dataType, lengthValueType
         ['BOOLEAN' BACnetContextTagBoolean
             [simple  uint 8 value                          ]
@@ -1297,15 +1299,15 @@
                             peekedTagHeader
     ]
     [virtual    uint 8      peekedTagNumber     'peekedTagHeader.actualTagNumber']
-    [virtual    bit    isApplicationTag    'peekedTagHeader.tagClass == TagClass.APPLICATION_TAGS'         ]
-    [virtual    bit    isConstructedData   '!isApplicationTag && peekedTagHeader.actualLength == 0x6'      ]
-    [virtual    bit    isContextTag        '!isConstructedData && !isApplicationTag'                       ]
+    [virtual    bit         isApplicationTag    'peekedTagHeader.tagClass == TagClass.APPLICATION_TAGS'         ]
+    [virtual    bit         isConstructedData   '!isApplicationTag && peekedTagHeader.actualLength == 0x6'      ]
+    [virtual    bit         isContextTag        '!isConstructedData && !isApplicationTag'                       ]
     [optional   BACnetApplicationTag
-                       applicationTag      'isApplicationTag'                                              ]
+                            applicationTag      'isApplicationTag'                                              ]
     [optional   BACnetContextTag('peekedTagNumber', 'STATIC_CALL("guessDataType", objectType)')
-                       contextTag          'isContextTag'                                                  ]
+                            contextTag          'isContextTag'                                                  ]
     [optional   BACnetConstructedData('peekedTagNumber', 'objectType', 'propertyIdentifier')
-                       constructedData     'isConstructedData'                                             ]
+                            constructedData     'isConstructedData'                                             ]
     [validation 'isApplicationTag || isContextTag || isConstructedData' "BACnetConstructedDataElement could not parse anything"]
 ]