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 2024/08/31 21:24:28 UTC

(plc4x) 15/35: feat(code-gen/go): implicit reader field

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 5ae7d2b298e3a3445e66ded66c1551cd23ac87ed
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Sat Aug 31 01:28:26 2024 +0200

    feat(code-gen/go): implicit reader field
---
 .../templates/go/complex-type-template.go.ftlh     | 11 +++++-----
 .../readwrite/model/CIPEncapsulationPacket.go      |  8 +++-----
 .../ads/discovery/readwrite/model/AdsDiscovery.go  |  8 +++-----
 .../model/AdsDiscoveryBlockFingerprint.go          | 10 ++++-----
 .../readwrite/model/AdsDiscoveryBlockOsData.go     | 10 ++++-----
 .../readwrite/model/AdsDiscoveryBlockVersion.go    | 10 ++++-----
 .../ads/discovery/readwrite/model/AmsString.go     | 10 ++++-----
 .../protocols/ads/readwrite/model/AdsDataType.go   |  4 ++--
 .../readwrite/model/AdsDataTypeTableChildEntry.go  | 24 ++++++++--------------
 .../ads/readwrite/model/AdsDataTypeTableEntry.go   | 24 ++++++++--------------
 .../ads/readwrite/model/AdsReadResponse.go         | 10 ++++-----
 .../ads/readwrite/model/AdsReadWriteRequest.go     |  8 +++-----
 .../ads/readwrite/model/AdsReadWriteResponse.go    | 10 ++++-----
 .../ads/readwrite/model/AdsSymbolTableEntry.go     | 24 ++++++++--------------
 .../ads/readwrite/model/AdsWriteControlRequest.go  | 10 ++++-----
 .../ads/readwrite/model/AdsWriteRequest.go         | 10 ++++-----
 plc4go/protocols/ads/readwrite/model/AmsPacket.go  |  8 +++-----
 .../protocols/ads/readwrite/model/AmsTCPPacket.go  | 11 +++++-----
 .../bacnetip/readwrite/model/BACnetVendorId.go     |  4 ++--
 plc4go/protocols/bacnetip/readwrite/model/BVLC.go  |  8 +++-----
 .../readwrite/model/MaxApduLengthAccepted.go       |  2 +-
 .../readwrite/model/MaxSegmentsAccepted.go         |  2 +-
 .../readwrite/model/AccessControlCommandType.go    |  2 +-
 .../model/AccessControlCommandTypeContainer.go     |  6 +++---
 .../readwrite/model/AirConditioningCommandType.go  |  2 +-
 .../model/AirConditioningCommandTypeContainer.go   |  4 ++--
 .../cbus/readwrite/model/ApplicationIdContainer.go |  4 ++--
 plc4go/protocols/cbus/readwrite/model/Attribute.go |  2 +-
 .../readwrite/model/CALCommandTypeContainer.go     |  4 ++--
 .../model/ClockAndTimekeepingCommandType.go        |  2 +-
 .../ClockAndTimekeepingCommandTypeContainer.go     |  4 ++--
 .../readwrite/model/EnableControlCommandType.go    |  2 +-
 .../model/EnableControlCommandTypeContainer.go     |  4 ++--
 .../readwrite/model/ErrorReportingCommandType.go   |  2 +-
 .../model/ErrorReportingCommandTypeContainer.go    |  4 ++--
 .../readwrite/model/LevelInformationNibblePair.go  |  2 +-
 .../cbus/readwrite/model/LightingCommandType.go    |  2 +-
 .../model/LightingCommandTypeContainer.go          |  4 ++--
 .../cbus/readwrite/model/MeasurementCommandType.go |  2 +-
 .../model/MeasurementCommandTypeContainer.go       |  4 ++--
 .../model/MediaTransportControlCommandType.go      |  2 +-
 .../MediaTransportControlCommandTypeContainer.go   |  4 ++--
 .../cbus/readwrite/model/MeteringCommandType.go    |  2 +-
 .../model/MeteringCommandTypeContainer.go          |  4 ++--
 plc4go/protocols/cbus/readwrite/model/Parameter.go | 12 +++++------
 .../cbus/readwrite/model/ProtectionLevel.go        |  2 +-
 .../protocols/cbus/readwrite/model/RequestType.go  |  2 +-
 .../cbus/readwrite/model/SecurityCommandType.go    |  2 +-
 .../model/SecurityCommandTypeContainer.go          |  4 ++--
 .../cbus/readwrite/model/TelephonyCommandType.go   |  2 +-
 .../model/TelephonyCommandTypeContainer.go         |  4 ++--
 .../model/TemperatureBroadcastCommandType.go       |  2 +-
 .../TemperatureBroadcastCommandTypeContainer.go    |  4 ++--
 .../readwrite/model/TriggerControlCommandType.go   |  2 +-
 .../model/TriggerControlCommandTypeContainer.go    |  4 ++--
 .../readwrite/model/AnsiExtendedSymbolSegment.go   | 10 ++++-----
 .../protocols/eip/readwrite/model/CIPAttributes.go |  8 +++-----
 .../eip/readwrite/model/CIPDataTypeCode.go         |  2 +-
 .../eip/readwrite/model/CipConnectedRequest.go     | 10 ++++-----
 .../readwrite/model/CipConnectionManagerRequest.go |  8 +++-----
 .../model/CipConnectionManagerResponse.go          | 10 ++++-----
 .../protocols/eip/readwrite/model/CipIdentity.go   | 16 ++++++---------
 plc4go/protocols/eip/readwrite/model/CipRRData.go  |  8 +++-----
 .../eip/readwrite/model/CipReadRequest.go          | 10 ++++-----
 .../eip/readwrite/model/CipSecurityInformation.go  |  8 +++-----
 .../eip/readwrite/model/CipUnconnectedRequest.go   | 16 ++++++---------
 .../eip/readwrite/model/CipWriteRequest.go         | 10 ++++-----
 .../eip/readwrite/model/ConnectedDataItem.go       | 10 ++++-----
 .../eip/readwrite/model/EipListIdentityResponse.go |  8 +++-----
 plc4go/protocols/eip/readwrite/model/EipPacket.go  |  8 +++-----
 .../eip/readwrite/model/GetAttributeAllRequest.go  | 10 ++++-----
 .../eip/readwrite/model/ListServicesResponse.go    |  8 +++-----
 .../protocols/eip/readwrite/model/SendUnitData.go  |  8 +++-----
 plc4go/protocols/eip/readwrite/model/Services.go   |  8 +++-----
 .../eip/readwrite/model/ServicesResponse.go        | 10 ++++-----
 .../eip/readwrite/model/UnConnectedDataItem.go     | 10 ++++-----
 .../knxnetip/readwrite/model/AccessLevel.go        |  4 ++--
 .../readwrite/model/ApduDataMemoryResponse.go      | 10 ++++-----
 .../readwrite/model/ComObjectTableAddresses.go     |  2 +-
 .../knxnetip/readwrite/model/ComObjectValueType.go |  2 +-
 .../model/ConnectionRequestInformation.go          |  8 +++-----
 .../readwrite/model/ConnectionResponseDataBlock.go |  8 +++-----
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      | 10 ++++-----
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |  8 +++-----
 .../model/DeviceConfigurationAckDataBlock.go       | 10 ++++-----
 .../model/DeviceConfigurationRequestDataBlock.go   | 10 ++++-----
 .../knxnetip/readwrite/model/DeviceDescriptor.go   |  4 ++--
 .../readwrite/model/HPAIControlEndpoint.go         | 10 ++++-----
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   | 10 ++++-----
 .../readwrite/model/HPAIDiscoveryEndpoint.go       | 10 ++++-----
 .../readwrite/model/KnxDatapointMainType.go        |  6 +++---
 .../knxnetip/readwrite/model/KnxDatapointType.go   |  6 +++---
 .../readwrite/model/KnxInterfaceObjectProperty.go  |  8 ++++----
 .../readwrite/model/KnxInterfaceObjectType.go      |  4 ++--
 .../knxnetip/readwrite/model/KnxManufacturer.go    |  4 ++--
 .../knxnetip/readwrite/model/KnxNetIpMessage.go    | 16 ++++++---------
 .../readwrite/model/KnxPropertyDataType.go         |  6 +++---
 .../knxnetip/readwrite/model/LDataExtended.go      | 10 ++++-----
 .../readwrite/model/SupportedPhysicalMedia.go      |  4 ++--
 .../readwrite/model/TunnelingRequestDataBlock.go   | 10 ++++-----
 .../readwrite/model/TunnelingResponseDataBlock.go  | 10 ++++-----
 .../modbus/readwrite/model/ModbusDataType.go       |  2 +-
 .../model/ModbusDeviceInformationObject.go         | 10 ++++-----
 .../model/ModbusPDUGetComEventLogResponse.go       | 10 ++++-----
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  | 10 ++++-----
 .../ModbusPDUReadDeviceIdentificationResponse.go   |  8 +++-----
 .../model/ModbusPDUReadDiscreteInputsResponse.go   | 10 ++++-----
 .../model/ModbusPDUReadFifoQueueResponse.go        | 16 ++++++---------
 .../model/ModbusPDUReadFileRecordRequest.go        |  8 +++-----
 .../model/ModbusPDUReadFileRecordResponse.go       |  8 +++-----
 .../model/ModbusPDUReadFileRecordResponseItem.go   | 10 ++++-----
 .../model/ModbusPDUReadHoldingRegistersResponse.go | 10 ++++-----
 .../model/ModbusPDUReadInputRegistersResponse.go   | 10 ++++-----
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go | 10 ++++-----
 ...PDUReadWriteMultipleHoldingRegistersResponse.go | 10 ++++-----
 .../model/ModbusPDUReportServerIdResponse.go       | 10 ++++-----
 .../model/ModbusPDUWriteFileRecordRequest.go       |  8 +++-----
 .../model/ModbusPDUWriteFileRecordRequestItem.go   | 10 ++++-----
 .../model/ModbusPDUWriteFileRecordResponse.go      |  8 +++-----
 .../model/ModbusPDUWriteFileRecordResponseItem.go  | 10 ++++-----
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    | 10 ++++-----
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go | 10 ++++-----
 .../modbus/readwrite/model/ModbusTcpADU.go         |  8 +++-----
 .../readwrite/model/DataChangeNotification.go      |  8 +++-----
 .../opcua/readwrite/model/EventNotificationList.go |  8 +++-----
 .../protocols/opcua/readwrite/model/MessagePDU.go  |  8 +++-----
 .../opcua/readwrite/model/OpcuaDataType.go         |  2 +-
 .../opcua/readwrite/model/PascalString.go          | 10 ++++-----
 .../readwrite/model/StatusChangeNotification.go    | 10 ++++-----
 .../opcua/readwrite/model/UserIdentityToken.go     | 10 ++++-----
 plc4go/protocols/s7/readwrite/model/COTPPacket.go  |  8 +++-----
 .../protocols/s7/readwrite/model/COTPParameter.go  |  8 +++-----
 .../protocols/s7/readwrite/model/COTPTpduSize.go   |  2 +-
 .../s7/readwrite/model/DataTransportSize.go        |  2 +-
 plc4go/protocols/s7/readwrite/model/MemoryArea.go  |  2 +-
 plc4go/protocols/s7/readwrite/model/S7Message.go   | 16 ++++++---------
 .../readwrite/model/S7ParameterModeTransition.go   | 10 ++++-----
 .../readwrite/model/S7ParameterReadVarRequest.go   |  8 +++-----
 .../s7/readwrite/model/S7ParameterUserData.go      |  8 +++-----
 .../model/S7ParameterUserDataItemCPUFunctions.go   | 10 ++++-----
 .../readwrite/model/S7ParameterWriteVarRequest.go  |  8 +++-----
 ...ayloadUserDataItemCpuFunctionAlarmAckRequest.go |  8 +++-----
 ...yloadUserDataItemCpuFunctionAlarmAckResponse.go |  8 +++-----
 .../s7/readwrite/model/S7VarPayloadDataItem.go     | 10 ++++-----
 .../model/S7VarRequestParameterItemAddress.go      | 10 ++++-----
 plc4go/protocols/s7/readwrite/model/TPKTPacket.go  |  8 +++-----
 .../protocols/s7/readwrite/model/TransportSize.go  | 22 ++++++++++----------
 .../readwrite/model/SimulatedDataTypeSizes.go      |  2 +-
 148 files changed, 513 insertions(+), 619 deletions(-)

diff --git a/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh b/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
index 065a5a91b9..3be6c052e6 100644
--- a/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
+++ b/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
@@ -889,13 +889,12 @@ func ${type.name}ParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 				<#break>
 			<#case "implicit">
 				<#assign implicitField = field.asImplicitField().orElseThrow()>
-				<#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
+				<#assign typedField = field.asTypedField().orElseThrow()>
+				<#assign namedField = field.asNamedField().orElseThrow()>
 
-	// Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	${implicitField.name}, _${implicitField.name}Err := ${helper.getReadBufferReadMethodCall(implicitField.name, simpleTypeReference, implicitField)}
-	_ = ${implicitField.name}
-	if _${implicitField.name}Err != nil {
-		return nil, errors.Wrap(_${implicitField.name}Err, "Error parsing '${implicitField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
+	${namedField.name},err := Read${field.typeName?cap_first}Field[${helper.getLanguageTypeNameForField(field)}](ctx, "${namedField.name}", ${helper.getDataReaderCall(typedField.type)}${helper.getFieldOptions(typedField, parserArguments)});
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing '${namedField.name}' field"))<@emitImport import="github.com/pkg/errors" />
 	}
 				<#break>
 			<#case "manualArray">
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
index 1241768d90..866d06bfc8 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
@@ -188,11 +188,9 @@ func CIPEncapsulationPacketParseWithBuffer(ctx context.Context, readBuffer utils
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commandType' field"))
 	}
 
-	// Implicit Field (packetLen) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	packetLen, _packetLenErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("packetLen", 16)
-	_ = packetLen
-	if _packetLenErr != nil {
-		return nil, errors.Wrap(_packetLenErr, "Error parsing 'packetLen' field of CIPEncapsulationPacket")
+	packetLen, err := ReadImplicitField[uint16](ctx, "packetLen", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'packetLen' field"))
 	}
 
 	// Simple Field (sessionHandle)
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go
index bdcb99779e..5acc4326e1 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go
@@ -239,11 +239,9 @@ func AdsDiscoveryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 		return nil, errors.Wrap(closeErr, "Error closing for portNumber")
 	}
 
-	// Implicit Field (numBlocks) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numBlocks, _numBlocksErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("numBlocks", 32)
-	_ = numBlocks
-	if _numBlocksErr != nil {
-		return nil, errors.Wrap(_numBlocksErr, "Error parsing 'numBlocks' field of AdsDiscovery")
+	numBlocks, err := ReadImplicitField[uint32](ctx, "numBlocks", ReadUnsignedInt(readBuffer, 32), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numBlocks' field"))
 	}
 
 	blocks, err := ReadCountArrayField[AdsDiscoveryBlock](ctx, "blocks", ReadComplex[AdsDiscoveryBlock](AdsDiscoveryBlockParseWithBuffer, readBuffer), uint64(numBlocks), codegen.WithByteOrder(binary.LittleEndian))
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go
index 37429a2bd3..213ee1232b 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -146,11 +148,9 @@ func AdsDiscoveryBlockFingerprintParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (dataLen) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataLen, _dataLenErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("dataLen", 16)
-	_ = dataLen
-	if _dataLenErr != nil {
-		return nil, errors.Wrap(_dataLenErr, "Error parsing 'dataLen' field of AdsDiscoveryBlockFingerprint")
+	dataLen, err := ReadImplicitField[uint16](ctx, "dataLen", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataLen' field"))
 	}
 
 	data, err := readBuffer.ReadByteArray("data", int(dataLen))
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go
index 37706c4487..d14de1e9fd 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -146,11 +148,9 @@ func AdsDiscoveryBlockOsDataParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (osDataLen) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	osDataLen, _osDataLenErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("osDataLen", 16)
-	_ = osDataLen
-	if _osDataLenErr != nil {
-		return nil, errors.Wrap(_osDataLenErr, "Error parsing 'osDataLen' field of AdsDiscoveryBlockOsData")
+	osDataLen, err := ReadImplicitField[uint16](ctx, "osDataLen", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'osDataLen' field"))
 	}
 
 	osData, err := readBuffer.ReadByteArray("osData", int(osDataLen))
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go
index 7c7b867c20..348598e0e9 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -146,11 +148,9 @@ func AdsDiscoveryBlockVersionParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (versionDataLen) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	versionDataLen, _versionDataLenErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("versionDataLen", 16)
-	_ = versionDataLen
-	if _versionDataLenErr != nil {
-		return nil, errors.Wrap(_versionDataLenErr, "Error parsing 'versionDataLen' field of AdsDiscoveryBlockVersion")
+	versionDataLen, err := ReadImplicitField[uint16](ctx, "versionDataLen", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'versionDataLen' field"))
 	}
 
 	versionData, err := readBuffer.ReadByteArray("versionData", int(versionDataLen))
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go b/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go
index 2800d0a477..771d78d444 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -122,11 +124,9 @@ func AmsStringParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer)
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (strLen) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	strLen, _strLenErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("strLen", 16)
-	_ = strLen
-	if _strLenErr != nil {
-		return nil, errors.Wrap(_strLenErr, "Error parsing 'strLen' field of AmsString")
+	strLen, err := ReadImplicitField[uint16](ctx, "strLen", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'strLen' field"))
 	}
 
 	// Simple Field (text)
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataType.go b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
index 3633ea4abf..afe77580b0 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataType.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
@@ -302,7 +302,7 @@ func (e AdsDataType) NumBytes() uint16 {
 	}
 }
 
-func AdsDataTypeFirstEnumForFieldNumBytes(value uint16) (AdsDataType, bool) {
+func AdsDataTypeFirstEnumForFieldNumBytes(value uint16) (enum AdsDataType, ok bool) {
 	for _, sizeValue := range AdsDataTypeValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -480,7 +480,7 @@ func (e AdsDataType) PlcValueType() PlcValueType {
 	}
 }
 
-func AdsDataTypeFirstEnumForFieldPlcValueType(value PlcValueType) (AdsDataType, bool) {
+func AdsDataTypeFirstEnumForFieldPlcValueType(value PlcValueType) (enum AdsDataType, ok bool) {
 	for _, sizeValue := range AdsDataTypeValues {
 		if sizeValue.PlcValueType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
index 6368094ee3..181ef4ffa9 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
@@ -386,25 +386,19 @@ func AdsDataTypeTableChildEntryParseWithBuffer(ctx context.Context, readBuffer u
 	}
 	flags := _flags
 
-	// Implicit Field (propertyNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	propertyNameLength, _propertyNameLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("propertyNameLength", 16)
-	_ = propertyNameLength
-	if _propertyNameLengthErr != nil {
-		return nil, errors.Wrap(_propertyNameLengthErr, "Error parsing 'propertyNameLength' field of AdsDataTypeTableChildEntry")
+	propertyNameLength, err := ReadImplicitField[uint16](ctx, "propertyNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'propertyNameLength' field"))
 	}
 
-	// Implicit Field (dataTypeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataTypeNameLength, _dataTypeNameLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("dataTypeNameLength", 16)
-	_ = dataTypeNameLength
-	if _dataTypeNameLengthErr != nil {
-		return nil, errors.Wrap(_dataTypeNameLengthErr, "Error parsing 'dataTypeNameLength' field of AdsDataTypeTableChildEntry")
+	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameLength' field"))
 	}
 
-	// Implicit Field (commentLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	commentLength, _commentLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("commentLength", 16)
-	_ = commentLength
-	if _commentLengthErr != nil {
-		return nil, errors.Wrap(_commentLengthErr, "Error parsing 'commentLength' field of AdsDataTypeTableChildEntry")
+	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentLength' field"))
 	}
 
 	// Simple Field (arrayDimensions)
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
index a206787bc4..0d8b05471a 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
@@ -386,25 +386,19 @@ func AdsDataTypeTableEntryParseWithBuffer(ctx context.Context, readBuffer utils.
 	}
 	flags := _flags
 
-	// Implicit Field (dataTypeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataTypeNameLength, _dataTypeNameLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("dataTypeNameLength", 16)
-	_ = dataTypeNameLength
-	if _dataTypeNameLengthErr != nil {
-		return nil, errors.Wrap(_dataTypeNameLengthErr, "Error parsing 'dataTypeNameLength' field of AdsDataTypeTableEntry")
+	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameLength' field"))
 	}
 
-	// Implicit Field (simpleTypeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	simpleTypeNameLength, _simpleTypeNameLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("simpleTypeNameLength", 16)
-	_ = simpleTypeNameLength
-	if _simpleTypeNameLengthErr != nil {
-		return nil, errors.Wrap(_simpleTypeNameLengthErr, "Error parsing 'simpleTypeNameLength' field of AdsDataTypeTableEntry")
+	simpleTypeNameLength, err := ReadImplicitField[uint16](ctx, "simpleTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'simpleTypeNameLength' field"))
 	}
 
-	// Implicit Field (commentLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	commentLength, _commentLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("commentLength", 16)
-	_ = commentLength
-	if _commentLengthErr != nil {
-		return nil, errors.Wrap(_commentLengthErr, "Error parsing 'commentLength' field of AdsDataTypeTableEntry")
+	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentLength' field"))
 	}
 
 	// Simple Field (arrayDimensions)
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
index 441358191a..5c0e4e15ba 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -181,11 +183,9 @@ func AdsReadResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBu
 		return nil, errors.Wrap(closeErr, "Error closing for result")
 	}
 
-	// Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	length, _lengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	_ = length
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsReadResponse")
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 
 	data, err := readBuffer.ReadByteArray("data", int(length))
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
index 918a26a16f..e9e3eeea7f 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
@@ -231,11 +231,9 @@ func AdsReadWriteRequestParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	}
 	readLength := _readLength
 
-	// Implicit Field (writeLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	writeLength, _writeLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("writeLength", 32)
-	_ = writeLength
-	if _writeLengthErr != nil {
-		return nil, errors.Wrap(_writeLengthErr, "Error parsing 'writeLength' field of AdsReadWriteRequest")
+	writeLength, err := ReadImplicitField[uint32](ctx, "writeLength", ReadUnsignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'writeLength' field"))
 	}
 
 	items, err := ReadCountArrayField[AdsMultiRequestItem](ctx, "items", ReadComplex[AdsMultiRequestItem](func(ctx context.Context, buffer utils.ReadBuffer) (AdsMultiRequestItem, error) {
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
index f558f946c8..e63f9216f2 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -181,11 +183,9 @@ func AdsReadWriteResponseParseWithBuffer(ctx context.Context, readBuffer utils.R
 		return nil, errors.Wrap(closeErr, "Error closing for result")
 	}
 
-	// Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	length, _lengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	_ = length
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsReadWriteResponse")
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 
 	data, err := readBuffer.ReadByteArray("data", int(length))
diff --git a/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
index c760d95306..d493a84c12 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
@@ -545,25 +545,19 @@ func AdsSymbolTableEntryParseWithBuffer(ctx context.Context, readBuffer utils.Re
 		}
 	}
 
-	// Implicit Field (nameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	nameLength, _nameLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("nameLength", 16)
-	_ = nameLength
-	if _nameLengthErr != nil {
-		return nil, errors.Wrap(_nameLengthErr, "Error parsing 'nameLength' field of AdsSymbolTableEntry")
+	nameLength, err := ReadImplicitField[uint16](ctx, "nameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'nameLength' field"))
 	}
 
-	// Implicit Field (dataTypeNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataTypeNameLength, _dataTypeNameLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("dataTypeNameLength", 16)
-	_ = dataTypeNameLength
-	if _dataTypeNameLengthErr != nil {
-		return nil, errors.Wrap(_dataTypeNameLengthErr, "Error parsing 'dataTypeNameLength' field of AdsSymbolTableEntry")
+	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameLength' field"))
 	}
 
-	// Implicit Field (commentLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	commentLength, _commentLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("commentLength", 16)
-	_ = commentLength
-	if _commentLengthErr != nil {
-		return nil, errors.Wrap(_commentLengthErr, "Error parsing 'commentLength' field of AdsSymbolTableEntry")
+	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentLength' field"))
 	}
 
 	// Simple Field (name)
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go b/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
index a6d46ff11e..b659bdf706 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -193,11 +195,9 @@ func AdsWriteControlRequestParseWithBuffer(ctx context.Context, readBuffer utils
 	}
 	deviceState := _deviceState
 
-	// Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	length, _lengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	_ = length
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsWriteControlRequest")
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 
 	data, err := readBuffer.ReadByteArray("data", int(length))
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go b/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
index 4e1407bec7..38c99186dd 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -193,11 +195,9 @@ func AdsWriteRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBu
 	}
 	indexOffset := _indexOffset
 
-	// Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	length, _lengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	_ = length
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsWriteRequest")
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 
 	data, err := readBuffer.ReadByteArray("data", int(length))
diff --git a/plc4go/protocols/ads/readwrite/model/AmsPacket.go b/plc4go/protocols/ads/readwrite/model/AmsPacket.go
index 7f9a6cc7e5..4a60a78fb1 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsPacket.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsPacket.go
@@ -395,11 +395,9 @@ func AmsPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer)
 		}
 	}
 
-	// Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	length, _lengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	_ = length
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AmsPacket")
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 
 	// Simple Field (errorCode)
diff --git a/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go b/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go
index 40d59ddf6c..96c395864f 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go
@@ -27,6 +27,9 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	"github.com/apache/plc4x/plc4go/spi/codegen"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -140,11 +143,9 @@ func AmsTCPPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 		}
 	}
 
-	// Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	length, _lengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	_ = length
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AmsTCPPacket")
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 
 	// Simple Field (userdata)
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
index 54542cac15..f398065e7b 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetVendorId.go
@@ -8972,7 +8972,7 @@ func (e BACnetVendorId) VendorId() uint16 {
 	}
 }
 
-func BACnetVendorIdFirstEnumForFieldVendorId(value uint16) (BACnetVendorId, bool) {
+func BACnetVendorIdFirstEnumForFieldVendorId(value uint16) (enum BACnetVendorId, ok bool) {
 	for _, sizeValue := range BACnetVendorIdValues {
 		if sizeValue.VendorId() == value {
 			return sizeValue, true
@@ -14930,7 +14930,7 @@ func (e BACnetVendorId) VendorName() string {
 	}
 }
 
-func BACnetVendorIdFirstEnumForFieldVendorName(value string) (BACnetVendorId, bool) {
+func BACnetVendorIdFirstEnumForFieldVendorName(value string) (enum BACnetVendorId, ok bool) {
 	for _, sizeValue := range BACnetVendorIdValues {
 		if sizeValue.VendorName() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BVLC.go b/plc4go/protocols/bacnetip/readwrite/model/BVLC.go
index 3b1e0c5add..139324d779 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BVLC.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BVLC.go
@@ -176,11 +176,9 @@ func BVLCParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BVLC
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'bvlcFunction' field"))
 	}
 
-	// Implicit Field (bvlcLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	bvlcLength, _bvlcLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("bvlcLength", 16)
-	_ = bvlcLength
-	if _bvlcLengthErr != nil {
-		return nil, errors.Wrap(_bvlcLengthErr, "Error parsing 'bvlcLength' field of BVLC")
+	bvlcLength, err := ReadImplicitField[uint16](ctx, "bvlcLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'bvlcLength' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/MaxApduLengthAccepted.go b/plc4go/protocols/bacnetip/readwrite/model/MaxApduLengthAccepted.go
index 77ae5ba209..3c3fbb25d6 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/MaxApduLengthAccepted.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/MaxApduLengthAccepted.go
@@ -157,7 +157,7 @@ func (e MaxApduLengthAccepted) NumberOfOctets() uint16 {
 	}
 }
 
-func MaxApduLengthAcceptedFirstEnumForFieldNumberOfOctets(value uint16) (MaxApduLengthAccepted, bool) {
+func MaxApduLengthAcceptedFirstEnumForFieldNumberOfOctets(value uint16) (enum MaxApduLengthAccepted, ok bool) {
 	for _, sizeValue := range MaxApduLengthAcceptedValues {
 		if sizeValue.NumberOfOctets() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/bacnetip/readwrite/model/MaxSegmentsAccepted.go b/plc4go/protocols/bacnetip/readwrite/model/MaxSegmentsAccepted.go
index 6f6d06e737..c1b11e4241 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/MaxSegmentsAccepted.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/MaxSegmentsAccepted.go
@@ -109,7 +109,7 @@ func (e MaxSegmentsAccepted) MaxSegments() uint8 {
 	}
 }
 
-func MaxSegmentsAcceptedFirstEnumForFieldMaxSegments(value uint8) (MaxSegmentsAccepted, bool) {
+func MaxSegmentsAcceptedFirstEnumForFieldMaxSegments(value uint8) (enum MaxSegmentsAccepted, ok bool) {
 	for _, sizeValue := range MaxSegmentsAcceptedValues {
 		if sizeValue.MaxSegments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/AccessControlCommandType.go b/plc4go/protocols/cbus/readwrite/model/AccessControlCommandType.go
index 584fcafb55..92129711fb 100644
--- a/plc4go/protocols/cbus/readwrite/model/AccessControlCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/AccessControlCommandType.go
@@ -109,7 +109,7 @@ func (e AccessControlCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func AccessControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (AccessControlCommandType, bool) {
+func AccessControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum AccessControlCommandType, ok bool) {
 	for _, sizeValue := range AccessControlCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/AccessControlCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/AccessControlCommandTypeContainer.go
index ba82f91127..c28d026288 100644
--- a/plc4go/protocols/cbus/readwrite/model/AccessControlCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/AccessControlCommandTypeContainer.go
@@ -483,7 +483,7 @@ func (e AccessControlCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func AccessControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (AccessControlCommandTypeContainer, bool) {
+func AccessControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum AccessControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range AccessControlCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -781,7 +781,7 @@ func (e AccessControlCommandTypeContainer) CommandType() AccessControlCommandTyp
 	}
 }
 
-func AccessControlCommandTypeContainerFirstEnumForFieldCommandType(value AccessControlCommandType) (AccessControlCommandTypeContainer, bool) {
+func AccessControlCommandTypeContainerFirstEnumForFieldCommandType(value AccessControlCommandType) (enum AccessControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range AccessControlCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
@@ -1079,7 +1079,7 @@ func (e AccessControlCommandTypeContainer) Category() AccessControlCategory {
 	}
 }
 
-func AccessControlCommandTypeContainerFirstEnumForFieldCategory(value AccessControlCategory) (AccessControlCommandTypeContainer, bool) {
+func AccessControlCommandTypeContainerFirstEnumForFieldCategory(value AccessControlCategory) (enum AccessControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range AccessControlCommandTypeContainerValues {
 		if sizeValue.Category() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandType.go b/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandType.go
index ea587dc66b..a337a55c45 100644
--- a/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandType.go
@@ -175,7 +175,7 @@ func (e AirConditioningCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func AirConditioningCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (AirConditioningCommandType, bool) {
+func AirConditioningCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum AirConditioningCommandType, ok bool) {
 	for _, sizeValue := range AirConditioningCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandTypeContainer.go
index fe6a1de2f2..b07c6064c7 100644
--- a/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/AirConditioningCommandTypeContainer.go
@@ -176,7 +176,7 @@ func (e AirConditioningCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func AirConditioningCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (AirConditioningCommandTypeContainer, bool) {
+func AirConditioningCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum AirConditioningCommandTypeContainer, ok bool) {
 	for _, sizeValue := range AirConditioningCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -270,7 +270,7 @@ func (e AirConditioningCommandTypeContainer) CommandType() AirConditioningComman
 	}
 }
 
-func AirConditioningCommandTypeContainerFirstEnumForFieldCommandType(value AirConditioningCommandType) (AirConditioningCommandTypeContainer, bool) {
+func AirConditioningCommandTypeContainerFirstEnumForFieldCommandType(value AirConditioningCommandType) (enum AirConditioningCommandTypeContainer, ok bool) {
 	for _, sizeValue := range AirConditioningCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/ApplicationIdContainer.go b/plc4go/protocols/cbus/readwrite/model/ApplicationIdContainer.go
index a12b5ff2cd..53ebc1a457 100644
--- a/plc4go/protocols/cbus/readwrite/model/ApplicationIdContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/ApplicationIdContainer.go
@@ -1598,7 +1598,7 @@ func (e ApplicationIdContainer) LightingCompatible() LightingCompatible {
 	}
 }
 
-func ApplicationIdContainerFirstEnumForFieldLightingCompatible(value LightingCompatible) (ApplicationIdContainer, bool) {
+func ApplicationIdContainerFirstEnumForFieldLightingCompatible(value LightingCompatible) (enum ApplicationIdContainer, ok bool) {
 	for _, sizeValue := range ApplicationIdContainerValues {
 		if sizeValue.LightingCompatible() == value {
 			return sizeValue, true
@@ -2640,7 +2640,7 @@ func (e ApplicationIdContainer) ApplicationId() ApplicationId {
 	}
 }
 
-func ApplicationIdContainerFirstEnumForFieldApplicationId(value ApplicationId) (ApplicationIdContainer, bool) {
+func ApplicationIdContainerFirstEnumForFieldApplicationId(value ApplicationId) (enum ApplicationIdContainer, ok bool) {
 	for _, sizeValue := range ApplicationIdContainerValues {
 		if sizeValue.ApplicationId() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/Attribute.go b/plc4go/protocols/cbus/readwrite/model/Attribute.go
index de3a1fd463..c428d0a511 100644
--- a/plc4go/protocols/cbus/readwrite/model/Attribute.go
+++ b/plc4go/protocols/cbus/readwrite/model/Attribute.go
@@ -169,7 +169,7 @@ func (e Attribute) BytesReturned() uint8 {
 	}
 }
 
-func AttributeFirstEnumForFieldBytesReturned(value uint8) (Attribute, bool) {
+func AttributeFirstEnumForFieldBytesReturned(value uint8) (enum Attribute, ok bool) {
 	for _, sizeValue := range AttributeValues {
 		if sizeValue.BytesReturned() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/CALCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/CALCommandTypeContainer.go
index fc11c659c9..737d33600e 100644
--- a/plc4go/protocols/cbus/readwrite/model/CALCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/CALCommandTypeContainer.go
@@ -764,7 +764,7 @@ func (e CALCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func CALCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (CALCommandTypeContainer, bool) {
+func CALCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum CALCommandTypeContainer, ok bool) {
 	for _, sizeValue := range CALCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -1250,7 +1250,7 @@ func (e CALCommandTypeContainer) CommandType() CALCommandType {
 	}
 }
 
-func CALCommandTypeContainerFirstEnumForFieldCommandType(value CALCommandType) (CALCommandTypeContainer, bool) {
+func CALCommandTypeContainerFirstEnumForFieldCommandType(value CALCommandType) (enum CALCommandTypeContainer, ok bool) {
 	for _, sizeValue := range CALCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandType.go b/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandType.go
index abb0f0e421..feaf6acb59 100644
--- a/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandType.go
@@ -73,7 +73,7 @@ func (e ClockAndTimekeepingCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func ClockAndTimekeepingCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (ClockAndTimekeepingCommandType, bool) {
+func ClockAndTimekeepingCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum ClockAndTimekeepingCommandType, ok bool) {
 	for _, sizeValue := range ClockAndTimekeepingCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandTypeContainer.go
index e4af4b310c..fe51519f76 100644
--- a/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/ClockAndTimekeepingCommandTypeContainer.go
@@ -116,7 +116,7 @@ func (e ClockAndTimekeepingCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func ClockAndTimekeepingCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (ClockAndTimekeepingCommandTypeContainer, bool) {
+func ClockAndTimekeepingCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum ClockAndTimekeepingCommandTypeContainer, ok bool) {
 	for _, sizeValue := range ClockAndTimekeepingCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -170,7 +170,7 @@ func (e ClockAndTimekeepingCommandTypeContainer) CommandType() ClockAndTimekeepi
 	}
 }
 
-func ClockAndTimekeepingCommandTypeContainerFirstEnumForFieldCommandType(value ClockAndTimekeepingCommandType) (ClockAndTimekeepingCommandTypeContainer, bool) {
+func ClockAndTimekeepingCommandTypeContainerFirstEnumForFieldCommandType(value ClockAndTimekeepingCommandType) (enum ClockAndTimekeepingCommandTypeContainer, ok bool) {
 	for _, sizeValue := range ClockAndTimekeepingCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/EnableControlCommandType.go b/plc4go/protocols/cbus/readwrite/model/EnableControlCommandType.go
index 32a6ebb989..e2316a2b3e 100644
--- a/plc4go/protocols/cbus/readwrite/model/EnableControlCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/EnableControlCommandType.go
@@ -67,7 +67,7 @@ func (e EnableControlCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func EnableControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (EnableControlCommandType, bool) {
+func EnableControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum EnableControlCommandType, ok bool) {
 	for _, sizeValue := range EnableControlCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/EnableControlCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/EnableControlCommandTypeContainer.go
index 967f3d8bd4..7d76996f94 100644
--- a/plc4go/protocols/cbus/readwrite/model/EnableControlCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/EnableControlCommandTypeContainer.go
@@ -158,7 +158,7 @@ func (e EnableControlCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func EnableControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (EnableControlCommandTypeContainer, bool) {
+func EnableControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum EnableControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range EnableControlCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -240,7 +240,7 @@ func (e EnableControlCommandTypeContainer) CommandType() EnableControlCommandTyp
 	}
 }
 
-func EnableControlCommandTypeContainerFirstEnumForFieldCommandType(value EnableControlCommandType) (EnableControlCommandTypeContainer, bool) {
+func EnableControlCommandTypeContainerFirstEnumForFieldCommandType(value EnableControlCommandType) (enum EnableControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range EnableControlCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandType.go b/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandType.go
index 50105692a6..1d8e3c36eb 100644
--- a/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandType.go
@@ -85,7 +85,7 @@ func (e ErrorReportingCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func ErrorReportingCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (ErrorReportingCommandType, bool) {
+func ErrorReportingCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum ErrorReportingCommandType, ok bool) {
 	for _, sizeValue := range ErrorReportingCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandTypeContainer.go
index ee436eedb2..1a942a3a44 100644
--- a/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/ErrorReportingCommandTypeContainer.go
@@ -86,7 +86,7 @@ func (e ErrorReportingCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func ErrorReportingCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (ErrorReportingCommandTypeContainer, bool) {
+func ErrorReportingCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum ErrorReportingCommandTypeContainer, ok bool) {
 	for _, sizeValue := range ErrorReportingCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -120,7 +120,7 @@ func (e ErrorReportingCommandTypeContainer) CommandType() ErrorReportingCommandT
 	}
 }
 
-func ErrorReportingCommandTypeContainerFirstEnumForFieldCommandType(value ErrorReportingCommandType) (ErrorReportingCommandTypeContainer, bool) {
+func ErrorReportingCommandTypeContainerFirstEnumForFieldCommandType(value ErrorReportingCommandType) (enum ErrorReportingCommandTypeContainer, ok bool) {
 	for _, sizeValue := range ErrorReportingCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/LevelInformationNibblePair.go b/plc4go/protocols/cbus/readwrite/model/LevelInformationNibblePair.go
index 2419945bd8..bd2a75a8c0 100644
--- a/plc4go/protocols/cbus/readwrite/model/LevelInformationNibblePair.go
+++ b/plc4go/protocols/cbus/readwrite/model/LevelInformationNibblePair.go
@@ -157,7 +157,7 @@ func (e LevelInformationNibblePair) NibbleValue() uint8 {
 	}
 }
 
-func LevelInformationNibblePairFirstEnumForFieldNibbleValue(value uint8) (LevelInformationNibblePair, bool) {
+func LevelInformationNibblePairFirstEnumForFieldNibbleValue(value uint8) (enum LevelInformationNibblePair, ok bool) {
 	for _, sizeValue := range LevelInformationNibblePairValues {
 		if sizeValue.NibbleValue() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/LightingCommandType.go b/plc4go/protocols/cbus/readwrite/model/LightingCommandType.go
index 00091edbcf..664285f168 100644
--- a/plc4go/protocols/cbus/readwrite/model/LightingCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/LightingCommandType.go
@@ -91,7 +91,7 @@ func (e LightingCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func LightingCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (LightingCommandType, bool) {
+func LightingCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum LightingCommandType, ok bool) {
 	for _, sizeValue := range LightingCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/LightingCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/LightingCommandTypeContainer.go
index 73d192e09e..9121c7a786 100644
--- a/plc4go/protocols/cbus/readwrite/model/LightingCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/LightingCommandTypeContainer.go
@@ -368,7 +368,7 @@ func (e LightingCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func LightingCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (LightingCommandTypeContainer, bool) {
+func LightingCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum LightingCommandTypeContainer, ok bool) {
 	for _, sizeValue := range LightingCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -590,7 +590,7 @@ func (e LightingCommandTypeContainer) CommandType() LightingCommandType {
 	}
 }
 
-func LightingCommandTypeContainerFirstEnumForFieldCommandType(value LightingCommandType) (LightingCommandTypeContainer, bool) {
+func LightingCommandTypeContainerFirstEnumForFieldCommandType(value LightingCommandType) (enum LightingCommandTypeContainer, ok bool) {
 	for _, sizeValue := range LightingCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/MeasurementCommandType.go b/plc4go/protocols/cbus/readwrite/model/MeasurementCommandType.go
index c7c1aa9724..cdf7bc9621 100644
--- a/plc4go/protocols/cbus/readwrite/model/MeasurementCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/MeasurementCommandType.go
@@ -67,7 +67,7 @@ func (e MeasurementCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func MeasurementCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (MeasurementCommandType, bool) {
+func MeasurementCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum MeasurementCommandType, ok bool) {
 	for _, sizeValue := range MeasurementCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/MeasurementCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/MeasurementCommandTypeContainer.go
index 58cc32b08f..ff334f8dbe 100644
--- a/plc4go/protocols/cbus/readwrite/model/MeasurementCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/MeasurementCommandTypeContainer.go
@@ -68,7 +68,7 @@ func (e MeasurementCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func MeasurementCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (MeasurementCommandTypeContainer, bool) {
+func MeasurementCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum MeasurementCommandTypeContainer, ok bool) {
 	for _, sizeValue := range MeasurementCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -90,7 +90,7 @@ func (e MeasurementCommandTypeContainer) CommandType() MeasurementCommandType {
 	}
 }
 
-func MeasurementCommandTypeContainerFirstEnumForFieldCommandType(value MeasurementCommandType) (MeasurementCommandTypeContainer, bool) {
+func MeasurementCommandTypeContainerFirstEnumForFieldCommandType(value MeasurementCommandType) (enum MeasurementCommandTypeContainer, ok bool) {
 	for _, sizeValue := range MeasurementCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandType.go b/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandType.go
index f31e5adc8c..ba610a32b1 100644
--- a/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandType.go
@@ -159,7 +159,7 @@ func (e MediaTransportControlCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func MediaTransportControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (MediaTransportControlCommandType, bool) {
+func MediaTransportControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum MediaTransportControlCommandType, ok bool) {
 	for _, sizeValue := range MediaTransportControlCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandTypeContainer.go
index 3cd54da097..442730970d 100644
--- a/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/MediaTransportControlCommandTypeContainer.go
@@ -746,7 +746,7 @@ func (e MediaTransportControlCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func MediaTransportControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (MediaTransportControlCommandTypeContainer, bool) {
+func MediaTransportControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum MediaTransportControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range MediaTransportControlCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -1220,7 +1220,7 @@ func (e MediaTransportControlCommandTypeContainer) CommandType() MediaTransportC
 	}
 }
 
-func MediaTransportControlCommandTypeContainerFirstEnumForFieldCommandType(value MediaTransportControlCommandType) (MediaTransportControlCommandTypeContainer, bool) {
+func MediaTransportControlCommandTypeContainerFirstEnumForFieldCommandType(value MediaTransportControlCommandType) (enum MediaTransportControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range MediaTransportControlCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/MeteringCommandType.go b/plc4go/protocols/cbus/readwrite/model/MeteringCommandType.go
index 14f0d30878..edd7c19bbc 100644
--- a/plc4go/protocols/cbus/readwrite/model/MeteringCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/MeteringCommandType.go
@@ -67,7 +67,7 @@ func (e MeteringCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func MeteringCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (MeteringCommandType, bool) {
+func MeteringCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum MeteringCommandType, ok bool) {
 	for _, sizeValue := range MeteringCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/MeteringCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/MeteringCommandTypeContainer.go
index 98448a0be9..368d96ade5 100644
--- a/plc4go/protocols/cbus/readwrite/model/MeteringCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/MeteringCommandTypeContainer.go
@@ -110,7 +110,7 @@ func (e MeteringCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func MeteringCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (MeteringCommandTypeContainer, bool) {
+func MeteringCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum MeteringCommandTypeContainer, ok bool) {
 	for _, sizeValue := range MeteringCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -160,7 +160,7 @@ func (e MeteringCommandTypeContainer) CommandType() MeteringCommandType {
 	}
 }
 
-func MeteringCommandTypeContainerFirstEnumForFieldCommandType(value MeteringCommandType) (MeteringCommandTypeContainer, bool) {
+func MeteringCommandTypeContainerFirstEnumForFieldCommandType(value MeteringCommandType) (enum MeteringCommandTypeContainer, ok bool) {
 	for _, sizeValue := range MeteringCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/Parameter.go b/plc4go/protocols/cbus/readwrite/model/Parameter.go
index 6d8923e01b..4699bc807b 100644
--- a/plc4go/protocols/cbus/readwrite/model/Parameter.go
+++ b/plc4go/protocols/cbus/readwrite/model/Parameter.go
@@ -1602,7 +1602,7 @@ func (e Parameter) ParameterType() ParameterType {
 	}
 }
 
-func ParameterFirstEnumForFieldParameterType(value ParameterType) (Parameter, bool) {
+func ParameterFirstEnumForFieldParameterType(value ParameterType) (enum Parameter, ok bool) {
 	for _, sizeValue := range ParameterValues {
 		if sizeValue.ParameterType() == value {
 			return sizeValue, true
@@ -2644,7 +2644,7 @@ func (e Parameter) Form() string {
 	}
 }
 
-func ParameterFirstEnumForFieldForm(value string) (Parameter, bool) {
+func ParameterFirstEnumForFieldForm(value string) (enum Parameter, ok bool) {
 	for _, sizeValue := range ParameterValues {
 		if sizeValue.Form() == value {
 			return sizeValue, true
@@ -3686,7 +3686,7 @@ func (e Parameter) IsVolatile() bool {
 	}
 }
 
-func ParameterFirstEnumForFieldIsVolatile(value bool) (Parameter, bool) {
+func ParameterFirstEnumForFieldIsVolatile(value bool) (enum Parameter, ok bool) {
 	for _, sizeValue := range ParameterValues {
 		if sizeValue.IsVolatile() == value {
 			return sizeValue, true
@@ -4728,7 +4728,7 @@ func (e Parameter) ParameterDescription() string {
 	}
 }
 
-func ParameterFirstEnumForFieldParameterDescription(value string) (Parameter, bool) {
+func ParameterFirstEnumForFieldParameterDescription(value string) (enum Parameter, ok bool) {
 	for _, sizeValue := range ParameterValues {
 		if sizeValue.ParameterDescription() == value {
 			return sizeValue, true
@@ -5770,7 +5770,7 @@ func (e Parameter) ProtectionLevel() ProtectionLevel {
 	}
 }
 
-func ParameterFirstEnumForFieldProtectionLevel(value ProtectionLevel) (Parameter, bool) {
+func ParameterFirstEnumForFieldProtectionLevel(value ProtectionLevel) (enum Parameter, ok bool) {
 	for _, sizeValue := range ParameterValues {
 		if sizeValue.ProtectionLevel() == value {
 			return sizeValue, true
@@ -6812,7 +6812,7 @@ func (e Parameter) Group() string {
 	}
 }
 
-func ParameterFirstEnumForFieldGroup(value string) (Parameter, bool) {
+func ParameterFirstEnumForFieldGroup(value string) (enum Parameter, ok bool) {
 	for _, sizeValue := range ParameterValues {
 		if sizeValue.Group() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/ProtectionLevel.go b/plc4go/protocols/cbus/readwrite/model/ProtectionLevel.go
index 96e8ce8199..bb58f35ffd 100644
--- a/plc4go/protocols/cbus/readwrite/model/ProtectionLevel.go
+++ b/plc4go/protocols/cbus/readwrite/model/ProtectionLevel.go
@@ -85,7 +85,7 @@ func (e ProtectionLevel) Description() string {
 	}
 }
 
-func ProtectionLevelFirstEnumForFieldDescription(value string) (ProtectionLevel, bool) {
+func ProtectionLevelFirstEnumForFieldDescription(value string) (enum ProtectionLevel, ok bool) {
 	for _, sizeValue := range ProtectionLevelValues {
 		if sizeValue.Description() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/RequestType.go b/plc4go/protocols/cbus/readwrite/model/RequestType.go
index f150216637..4d44958c4d 100644
--- a/plc4go/protocols/cbus/readwrite/model/RequestType.go
+++ b/plc4go/protocols/cbus/readwrite/model/RequestType.go
@@ -103,7 +103,7 @@ func (e RequestType) ControlChar() uint8 {
 	}
 }
 
-func RequestTypeFirstEnumForFieldControlChar(value uint8) (RequestType, bool) {
+func RequestTypeFirstEnumForFieldControlChar(value uint8) (enum RequestType, ok bool) {
 	for _, sizeValue := range RequestTypeValues {
 		if sizeValue.ControlChar() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/SecurityCommandType.go b/plc4go/protocols/cbus/readwrite/model/SecurityCommandType.go
index 4ca3463167..130add79ee 100644
--- a/plc4go/protocols/cbus/readwrite/model/SecurityCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/SecurityCommandType.go
@@ -79,7 +79,7 @@ func (e SecurityCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func SecurityCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (SecurityCommandType, bool) {
+func SecurityCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum SecurityCommandType, ok bool) {
 	for _, sizeValue := range SecurityCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/SecurityCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/SecurityCommandTypeContainer.go
index d05e47eed0..7321ab9e7a 100644
--- a/plc4go/protocols/cbus/readwrite/model/SecurityCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/SecurityCommandTypeContainer.go
@@ -782,7 +782,7 @@ func (e SecurityCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func SecurityCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (SecurityCommandTypeContainer, bool) {
+func SecurityCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum SecurityCommandTypeContainer, ok bool) {
 	for _, sizeValue := range SecurityCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -1280,7 +1280,7 @@ func (e SecurityCommandTypeContainer) CommandType() SecurityCommandType {
 	}
 }
 
-func SecurityCommandTypeContainerFirstEnumForFieldCommandType(value SecurityCommandType) (SecurityCommandTypeContainer, bool) {
+func SecurityCommandTypeContainerFirstEnumForFieldCommandType(value SecurityCommandType) (enum SecurityCommandTypeContainer, ok bool) {
 	for _, sizeValue := range SecurityCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/TelephonyCommandType.go b/plc4go/protocols/cbus/readwrite/model/TelephonyCommandType.go
index a2bae80028..e788d30943 100644
--- a/plc4go/protocols/cbus/readwrite/model/TelephonyCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/TelephonyCommandType.go
@@ -67,7 +67,7 @@ func (e TelephonyCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func TelephonyCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (TelephonyCommandType, bool) {
+func TelephonyCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum TelephonyCommandType, ok bool) {
 	for _, sizeValue := range TelephonyCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/TelephonyCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/TelephonyCommandTypeContainer.go
index f52eb0f34e..e26ab25220 100644
--- a/plc4go/protocols/cbus/readwrite/model/TelephonyCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/TelephonyCommandTypeContainer.go
@@ -260,7 +260,7 @@ func (e TelephonyCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func TelephonyCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (TelephonyCommandTypeContainer, bool) {
+func TelephonyCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum TelephonyCommandTypeContainer, ok bool) {
 	for _, sizeValue := range TelephonyCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -410,7 +410,7 @@ func (e TelephonyCommandTypeContainer) CommandType() TelephonyCommandType {
 	}
 }
 
-func TelephonyCommandTypeContainerFirstEnumForFieldCommandType(value TelephonyCommandType) (TelephonyCommandTypeContainer, bool) {
+func TelephonyCommandTypeContainerFirstEnumForFieldCommandType(value TelephonyCommandType) (enum TelephonyCommandTypeContainer, ok bool) {
 	for _, sizeValue := range TelephonyCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandType.go b/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandType.go
index a3efdfad37..056c59dcca 100644
--- a/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandType.go
@@ -67,7 +67,7 @@ func (e TemperatureBroadcastCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func TemperatureBroadcastCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (TemperatureBroadcastCommandType, bool) {
+func TemperatureBroadcastCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum TemperatureBroadcastCommandType, ok bool) {
 	for _, sizeValue := range TemperatureBroadcastCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandTypeContainer.go
index 41e0204997..ff5a85805b 100644
--- a/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/TemperatureBroadcastCommandTypeContainer.go
@@ -158,7 +158,7 @@ func (e TemperatureBroadcastCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func TemperatureBroadcastCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (TemperatureBroadcastCommandTypeContainer, bool) {
+func TemperatureBroadcastCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum TemperatureBroadcastCommandTypeContainer, ok bool) {
 	for _, sizeValue := range TemperatureBroadcastCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -240,7 +240,7 @@ func (e TemperatureBroadcastCommandTypeContainer) CommandType() TemperatureBroad
 	}
 }
 
-func TemperatureBroadcastCommandTypeContainerFirstEnumForFieldCommandType(value TemperatureBroadcastCommandType) (TemperatureBroadcastCommandTypeContainer, bool) {
+func TemperatureBroadcastCommandTypeContainerFirstEnumForFieldCommandType(value TemperatureBroadcastCommandType) (enum TemperatureBroadcastCommandTypeContainer, ok bool) {
 	for _, sizeValue := range TemperatureBroadcastCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandType.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandType.go
index ffe7409f64..567877090d 100644
--- a/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandType.go
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandType.go
@@ -91,7 +91,7 @@ func (e TriggerControlCommandType) NumberOfArguments() uint8 {
 	}
 }
 
-func TriggerControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (TriggerControlCommandType, bool) {
+func TriggerControlCommandTypeFirstEnumForFieldNumberOfArguments(value uint8) (enum TriggerControlCommandType, ok bool) {
 	for _, sizeValue := range TriggerControlCommandTypeValues {
 		if sizeValue.NumberOfArguments() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandTypeContainer.go b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandTypeContainer.go
index ed8279ded9..6b89fffc59 100644
--- a/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandTypeContainer.go
+++ b/plc4go/protocols/cbus/readwrite/model/TriggerControlCommandTypeContainer.go
@@ -368,7 +368,7 @@ func (e TriggerControlCommandTypeContainer) NumBytes() uint8 {
 	}
 }
 
-func TriggerControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (TriggerControlCommandTypeContainer, bool) {
+func TriggerControlCommandTypeContainerFirstEnumForFieldNumBytes(value uint8) (enum TriggerControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range TriggerControlCommandTypeContainerValues {
 		if sizeValue.NumBytes() == value {
 			return sizeValue, true
@@ -590,7 +590,7 @@ func (e TriggerControlCommandTypeContainer) CommandType() TriggerControlCommandT
 	}
 }
 
-func TriggerControlCommandTypeContainerFirstEnumForFieldCommandType(value TriggerControlCommandType) (TriggerControlCommandTypeContainer, bool) {
+func TriggerControlCommandTypeContainerFirstEnumForFieldCommandType(value TriggerControlCommandType) (enum TriggerControlCommandTypeContainer, ok bool) {
 	for _, sizeValue := range TriggerControlCommandTypeContainerValues {
 		if sizeValue.CommandType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/eip/readwrite/model/AnsiExtendedSymbolSegment.go b/plc4go/protocols/eip/readwrite/model/AnsiExtendedSymbolSegment.go
index 4905f54bdf..66594b1237 100644
--- a/plc4go/protocols/eip/readwrite/model/AnsiExtendedSymbolSegment.go
+++ b/plc4go/protocols/eip/readwrite/model/AnsiExtendedSymbolSegment.go
@@ -27,6 +27,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -158,11 +160,9 @@ func AnsiExtendedSymbolSegmentParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (dataSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataSize, _dataSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("dataSize", 8)
-	_ = dataSize
-	if _dataSizeErr != nil {
-		return nil, errors.Wrap(_dataSizeErr, "Error parsing 'dataSize' field of AnsiExtendedSymbolSegment")
+	dataSize, err := ReadImplicitField[uint8](ctx, "dataSize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataSize' field"))
 	}
 
 	// Simple Field (symbol)
diff --git a/plc4go/protocols/eip/readwrite/model/CIPAttributes.go b/plc4go/protocols/eip/readwrite/model/CIPAttributes.go
index 1f74736e6a..eae4cc8936 100644
--- a/plc4go/protocols/eip/readwrite/model/CIPAttributes.go
+++ b/plc4go/protocols/eip/readwrite/model/CIPAttributes.go
@@ -161,11 +161,9 @@ func CIPAttributesParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (numberOfClasses) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numberOfClasses, _numberOfClassesErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("numberOfClasses", 16)
-	_ = numberOfClasses
-	if _numberOfClassesErr != nil {
-		return nil, errors.Wrap(_numberOfClassesErr, "Error parsing 'numberOfClasses' field of CIPAttributes")
+	numberOfClasses, err := ReadImplicitField[uint16](ctx, "numberOfClasses", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numberOfClasses' field"))
 	}
 
 	classId, err := ReadCountArrayField[uint16](ctx, "classId", ReadUnsignedShort(readBuffer, 16), uint64(numberOfClasses))
diff --git a/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go b/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
index ebe0918db1..6ef9f036ea 100644
--- a/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
+++ b/plc4go/protocols/eip/readwrite/model/CIPDataTypeCode.go
@@ -239,7 +239,7 @@ func (e CIPDataTypeCode) Size() uint8 {
 	}
 }
 
-func CIPDataTypeCodeFirstEnumForFieldSize(value uint8) (CIPDataTypeCode, bool) {
+func CIPDataTypeCodeFirstEnumForFieldSize(value uint8) (enum CIPDataTypeCode, ok bool) {
 	for _, sizeValue := range CIPDataTypeCodeValues {
 		if sizeValue.Size() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/eip/readwrite/model/CipConnectedRequest.go b/plc4go/protocols/eip/readwrite/model/CipConnectedRequest.go
index 0dc00c02d2..bb06ef1ff3 100644
--- a/plc4go/protocols/eip/readwrite/model/CipConnectedRequest.go
+++ b/plc4go/protocols/eip/readwrite/model/CipConnectedRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -163,11 +165,9 @@ func CipConnectedRequestParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (requestPathSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	requestPathSize, _requestPathSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("requestPathSize", 8)
-	_ = requestPathSize
-	if _requestPathSizeErr != nil {
-		return nil, errors.Wrap(_requestPathSizeErr, "Error parsing 'requestPathSize' field of CipConnectedRequest")
+	requestPathSize, err := ReadImplicitField[uint8](ctx, "requestPathSize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'requestPathSize' field"))
 	}
 
 	pathSegments, err := readBuffer.ReadByteArray("pathSegments", int(int32(requestPathSize)*int32(int32(2))))
diff --git a/plc4go/protocols/eip/readwrite/model/CipConnectionManagerRequest.go b/plc4go/protocols/eip/readwrite/model/CipConnectionManagerRequest.go
index f9c5e7f11f..5339e17227 100644
--- a/plc4go/protocols/eip/readwrite/model/CipConnectionManagerRequest.go
+++ b/plc4go/protocols/eip/readwrite/model/CipConnectionManagerRequest.go
@@ -350,11 +350,9 @@ func CipConnectionManagerRequestParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (requestPathSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	requestPathSize, _requestPathSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("requestPathSize", 8)
-	_ = requestPathSize
-	if _requestPathSizeErr != nil {
-		return nil, errors.Wrap(_requestPathSizeErr, "Error parsing 'requestPathSize' field of CipConnectionManagerRequest")
+	requestPathSize, err := ReadImplicitField[uint8](ctx, "requestPathSize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'requestPathSize' field"))
 	}
 
 	// Simple Field (classSegment)
diff --git a/plc4go/protocols/eip/readwrite/model/CipConnectionManagerResponse.go b/plc4go/protocols/eip/readwrite/model/CipConnectionManagerResponse.go
index 68a108e04d..60458d0fa3 100644
--- a/plc4go/protocols/eip/readwrite/model/CipConnectionManagerResponse.go
+++ b/plc4go/protocols/eip/readwrite/model/CipConnectionManagerResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -293,11 +295,9 @@ func CipConnectionManagerResponseParseWithBuffer(ctx context.Context, readBuffer
 	}
 	toApi := _toApi
 
-	// Implicit Field (replySize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	replySize, _replySizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("replySize", 8)
-	_ = replySize
-	if _replySizeErr != nil {
-		return nil, errors.Wrap(_replySizeErr, "Error parsing 'replySize' field of CipConnectionManagerResponse")
+	replySize, err := ReadImplicitField[uint8](ctx, "replySize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'replySize' field"))
 	}
 
 	var reservedField1 *uint8
diff --git a/plc4go/protocols/eip/readwrite/model/CipIdentity.go b/plc4go/protocols/eip/readwrite/model/CipIdentity.go
index 7339d72b24..021f695a98 100644
--- a/plc4go/protocols/eip/readwrite/model/CipIdentity.go
+++ b/plc4go/protocols/eip/readwrite/model/CipIdentity.go
@@ -310,11 +310,9 @@ func CipIdentityParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	itemLength, _itemLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("itemLength", 16)
-	_ = itemLength
-	if _itemLengthErr != nil {
-		return nil, errors.Wrap(_itemLengthErr, "Error parsing 'itemLength' field of CipIdentity")
+	itemLength, err := ReadImplicitField[uint16](ctx, "itemLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemLength' field"))
 	}
 
 	// Simple Field (encapsulationProtocolVersion)
@@ -404,11 +402,9 @@ func CipIdentityParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer
 	}
 	serialNumber := _serialNumber
 
-	// Implicit Field (productNameLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	productNameLength, _productNameLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("productNameLength", 8)
-	_ = productNameLength
-	if _productNameLengthErr != nil {
-		return nil, errors.Wrap(_productNameLengthErr, "Error parsing 'productNameLength' field of CipIdentity")
+	productNameLength, err := ReadImplicitField[uint8](ctx, "productNameLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'productNameLength' field"))
 	}
 
 	// Simple Field (productName)
diff --git a/plc4go/protocols/eip/readwrite/model/CipRRData.go b/plc4go/protocols/eip/readwrite/model/CipRRData.go
index a7fc0bb16c..63890414ad 100644
--- a/plc4go/protocols/eip/readwrite/model/CipRRData.go
+++ b/plc4go/protocols/eip/readwrite/model/CipRRData.go
@@ -202,11 +202,9 @@ func CipRRDataParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer,
 	}
 	timeout := _timeout
 
-	// Implicit Field (typeIdCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	typeIdCount, _typeIdCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("typeIdCount", 16)
-	_ = typeIdCount
-	if _typeIdCountErr != nil {
-		return nil, errors.Wrap(_typeIdCountErr, "Error parsing 'typeIdCount' field of CipRRData")
+	typeIdCount, err := ReadImplicitField[uint16](ctx, "typeIdCount", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'typeIdCount' field"))
 	}
 
 	typeIds, err := ReadCountArrayField[TypeId](ctx, "typeIds", ReadComplex[TypeId](TypeIdParseWithBuffer, readBuffer), uint64(typeIdCount))
diff --git a/plc4go/protocols/eip/readwrite/model/CipReadRequest.go b/plc4go/protocols/eip/readwrite/model/CipReadRequest.go
index 3dc38a389f..141f4581ef 100644
--- a/plc4go/protocols/eip/readwrite/model/CipReadRequest.go
+++ b/plc4go/protocols/eip/readwrite/model/CipReadRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -165,11 +167,9 @@ func CipReadRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (requestPathSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	requestPathSize, _requestPathSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("requestPathSize", 8)
-	_ = requestPathSize
-	if _requestPathSizeErr != nil {
-		return nil, errors.Wrap(_requestPathSizeErr, "Error parsing 'requestPathSize' field of CipReadRequest")
+	requestPathSize, err := ReadImplicitField[uint8](ctx, "requestPathSize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'requestPathSize' field"))
 	}
 
 	tag, err := readBuffer.ReadByteArray("tag", int((int32(requestPathSize) * int32(int32(2)))))
diff --git a/plc4go/protocols/eip/readwrite/model/CipSecurityInformation.go b/plc4go/protocols/eip/readwrite/model/CipSecurityInformation.go
index 822dacd169..149ae50431 100644
--- a/plc4go/protocols/eip/readwrite/model/CipSecurityInformation.go
+++ b/plc4go/protocols/eip/readwrite/model/CipSecurityInformation.go
@@ -148,11 +148,9 @@ func CipSecurityInformationParseWithBuffer(ctx context.Context, readBuffer utils
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	itemLength, _itemLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("itemLength", 16)
-	_ = itemLength
-	if _itemLengthErr != nil {
-		return nil, errors.Wrap(_itemLengthErr, "Error parsing 'itemLength' field of CipSecurityInformation")
+	itemLength, err := ReadImplicitField[uint16](ctx, "itemLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemLength' field"))
 	}
 
 	todoImplement, err := ReadCountArrayField[uint8](ctx, "todoImplement", ReadUnsignedByte(readBuffer, 8), uint64(itemLength))
diff --git a/plc4go/protocols/eip/readwrite/model/CipUnconnectedRequest.go b/plc4go/protocols/eip/readwrite/model/CipUnconnectedRequest.go
index f4a79fbc3d..4781a93df5 100644
--- a/plc4go/protocols/eip/readwrite/model/CipUnconnectedRequest.go
+++ b/plc4go/protocols/eip/readwrite/model/CipUnconnectedRequest.go
@@ -225,11 +225,9 @@ func CipUnconnectedRequestParseWithBuffer(ctx context.Context, readBuffer utils.
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (requestPathSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	requestPathSize, _requestPathSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("requestPathSize", 8)
-	_ = requestPathSize
-	if _requestPathSizeErr != nil {
-		return nil, errors.Wrap(_requestPathSizeErr, "Error parsing 'requestPathSize' field of CipUnconnectedRequest")
+	requestPathSize, err := ReadImplicitField[uint8](ctx, "requestPathSize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'requestPathSize' field"))
 	}
 
 	// Simple Field (classSegment)
@@ -275,11 +273,9 @@ func CipUnconnectedRequestParseWithBuffer(ctx context.Context, readBuffer utils.
 		}
 	}
 
-	// Implicit Field (messageSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	messageSize, _messageSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("messageSize", 16)
-	_ = messageSize
-	if _messageSizeErr != nil {
-		return nil, errors.Wrap(_messageSizeErr, "Error parsing 'messageSize' field of CipUnconnectedRequest")
+	messageSize, err := ReadImplicitField[uint16](ctx, "messageSize", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'messageSize' field"))
 	}
 
 	// Simple Field (unconnectedService)
diff --git a/plc4go/protocols/eip/readwrite/model/CipWriteRequest.go b/plc4go/protocols/eip/readwrite/model/CipWriteRequest.go
index a65f8a3a03..e1390a3c53 100644
--- a/plc4go/protocols/eip/readwrite/model/CipWriteRequest.go
+++ b/plc4go/protocols/eip/readwrite/model/CipWriteRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -189,11 +191,9 @@ func CipWriteRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (requestPathSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	requestPathSize, _requestPathSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("requestPathSize", 8)
-	_ = requestPathSize
-	if _requestPathSizeErr != nil {
-		return nil, errors.Wrap(_requestPathSizeErr, "Error parsing 'requestPathSize' field of CipWriteRequest")
+	requestPathSize, err := ReadImplicitField[uint8](ctx, "requestPathSize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'requestPathSize' field"))
 	}
 
 	tag, err := readBuffer.ReadByteArray("tag", int(int32(requestPathSize)*int32(int32(2))))
diff --git a/plc4go/protocols/eip/readwrite/model/ConnectedDataItem.go b/plc4go/protocols/eip/readwrite/model/ConnectedDataItem.go
index c1a75dc534..72ca300492 100644
--- a/plc4go/protocols/eip/readwrite/model/ConnectedDataItem.go
+++ b/plc4go/protocols/eip/readwrite/model/ConnectedDataItem.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -155,11 +157,9 @@ func ConnectedDataItemParseWithBuffer(ctx context.Context, readBuffer utils.Read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (packetSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	packetSize, _packetSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("packetSize", 16)
-	_ = packetSize
-	if _packetSizeErr != nil {
-		return nil, errors.Wrap(_packetSizeErr, "Error parsing 'packetSize' field of ConnectedDataItem")
+	packetSize, err := ReadImplicitField[uint16](ctx, "packetSize", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'packetSize' field"))
 	}
 
 	// Simple Field (sequenceCount)
diff --git a/plc4go/protocols/eip/readwrite/model/EipListIdentityResponse.go b/plc4go/protocols/eip/readwrite/model/EipListIdentityResponse.go
index 1c28029dbf..20eba8c4fe 100644
--- a/plc4go/protocols/eip/readwrite/model/EipListIdentityResponse.go
+++ b/plc4go/protocols/eip/readwrite/model/EipListIdentityResponse.go
@@ -166,11 +166,9 @@ func EipListIdentityResponseParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (itemCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	itemCount, _itemCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("itemCount", 16)
-	_ = itemCount
-	if _itemCountErr != nil {
-		return nil, errors.Wrap(_itemCountErr, "Error parsing 'itemCount' field of EipListIdentityResponse")
+	itemCount, err := ReadImplicitField[uint16](ctx, "itemCount", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemCount' field"))
 	}
 
 	items, err := ReadCountArrayField[CommandSpecificDataItem](ctx, "items", ReadComplex[CommandSpecificDataItem](CommandSpecificDataItemParseWithBuffer, readBuffer), uint64(itemCount))
diff --git a/plc4go/protocols/eip/readwrite/model/EipPacket.go b/plc4go/protocols/eip/readwrite/model/EipPacket.go
index 50be88635a..98688eb95c 100644
--- a/plc4go/protocols/eip/readwrite/model/EipPacket.go
+++ b/plc4go/protocols/eip/readwrite/model/EipPacket.go
@@ -187,11 +187,9 @@ func EipPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer,
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'command' field"))
 	}
 
-	// Implicit Field (packetLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	packetLength, _packetLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("packetLength", 16)
-	_ = packetLength
-	if _packetLengthErr != nil {
-		return nil, errors.Wrap(_packetLengthErr, "Error parsing 'packetLength' field of EipPacket")
+	packetLength, err := ReadImplicitField[uint16](ctx, "packetLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'packetLength' field"))
 	}
 
 	// Simple Field (sessionHandle)
diff --git a/plc4go/protocols/eip/readwrite/model/GetAttributeAllRequest.go b/plc4go/protocols/eip/readwrite/model/GetAttributeAllRequest.go
index 78037caa4d..f1c1a9e580 100644
--- a/plc4go/protocols/eip/readwrite/model/GetAttributeAllRequest.go
+++ b/plc4go/protocols/eip/readwrite/model/GetAttributeAllRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -163,11 +165,9 @@ func GetAttributeAllRequestParseWithBuffer(ctx context.Context, readBuffer utils
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (requestPathSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	requestPathSize, _requestPathSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("requestPathSize", 8)
-	_ = requestPathSize
-	if _requestPathSizeErr != nil {
-		return nil, errors.Wrap(_requestPathSizeErr, "Error parsing 'requestPathSize' field of GetAttributeAllRequest")
+	requestPathSize, err := ReadImplicitField[uint8](ctx, "requestPathSize", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'requestPathSize' field"))
 	}
 
 	// Simple Field (classSegment)
diff --git a/plc4go/protocols/eip/readwrite/model/ListServicesResponse.go b/plc4go/protocols/eip/readwrite/model/ListServicesResponse.go
index 301c76f35e..34b6758843 100644
--- a/plc4go/protocols/eip/readwrite/model/ListServicesResponse.go
+++ b/plc4go/protocols/eip/readwrite/model/ListServicesResponse.go
@@ -166,11 +166,9 @@ func ListServicesResponseParseWithBuffer(ctx context.Context, readBuffer utils.R
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (typeIdCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	typeIdCount, _typeIdCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("typeIdCount", 16)
-	_ = typeIdCount
-	if _typeIdCountErr != nil {
-		return nil, errors.Wrap(_typeIdCountErr, "Error parsing 'typeIdCount' field of ListServicesResponse")
+	typeIdCount, err := ReadImplicitField[uint16](ctx, "typeIdCount", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'typeIdCount' field"))
 	}
 
 	typeIds, err := ReadCountArrayField[TypeId](ctx, "typeIds", ReadComplex[TypeId](TypeIdParseWithBuffer, readBuffer), uint64(typeIdCount))
diff --git a/plc4go/protocols/eip/readwrite/model/SendUnitData.go b/plc4go/protocols/eip/readwrite/model/SendUnitData.go
index 5f6eda7ff0..b233e5092a 100644
--- a/plc4go/protocols/eip/readwrite/model/SendUnitData.go
+++ b/plc4go/protocols/eip/readwrite/model/SendUnitData.go
@@ -209,11 +209,9 @@ func SendUnitDataParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 	}
 	timeout := _timeout
 
-	// Implicit Field (typeIdCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	typeIdCount, _typeIdCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("typeIdCount", 16)
-	_ = typeIdCount
-	if _typeIdCountErr != nil {
-		return nil, errors.Wrap(_typeIdCountErr, "Error parsing 'typeIdCount' field of SendUnitData")
+	typeIdCount, err := ReadImplicitField[uint16](ctx, "typeIdCount", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'typeIdCount' field"))
 	}
 
 	typeIds, err := ReadCountArrayField[TypeId](ctx, "typeIds", ReadComplex[TypeId](TypeIdParseWithBuffer, readBuffer), uint64(typeIdCount))
diff --git a/plc4go/protocols/eip/readwrite/model/Services.go b/plc4go/protocols/eip/readwrite/model/Services.go
index 72872b9b36..877a0cf7c2 100644
--- a/plc4go/protocols/eip/readwrite/model/Services.go
+++ b/plc4go/protocols/eip/readwrite/model/Services.go
@@ -141,11 +141,9 @@ func ServicesParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, s
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (serviceNb) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	serviceNb, _serviceNbErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("serviceNb", 16)
-	_ = serviceNb
-	if _serviceNbErr != nil {
-		return nil, errors.Wrap(_serviceNbErr, "Error parsing 'serviceNb' field of Services")
+	serviceNb, err := ReadImplicitField[uint16](ctx, "serviceNb", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'serviceNb' field"))
 	}
 
 	offsets, err := ReadCountArrayField[uint16](ctx, "offsets", ReadUnsignedShort(readBuffer, 16), uint64(serviceNb))
diff --git a/plc4go/protocols/eip/readwrite/model/ServicesResponse.go b/plc4go/protocols/eip/readwrite/model/ServicesResponse.go
index 88c2cc6993..5cd9e37c2b 100644
--- a/plc4go/protocols/eip/readwrite/model/ServicesResponse.go
+++ b/plc4go/protocols/eip/readwrite/model/ServicesResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -188,11 +190,9 @@ func ServicesResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (serviceLen) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	serviceLen, _serviceLenErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("serviceLen", 16)
-	_ = serviceLen
-	if _serviceLenErr != nil {
-		return nil, errors.Wrap(_serviceLenErr, "Error parsing 'serviceLen' field of ServicesResponse")
+	serviceLen, err := ReadImplicitField[uint16](ctx, "serviceLen", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'serviceLen' field"))
 	}
 
 	// Simple Field (encapsulationProtocol)
diff --git a/plc4go/protocols/eip/readwrite/model/UnConnectedDataItem.go b/plc4go/protocols/eip/readwrite/model/UnConnectedDataItem.go
index 975bb91dd1..2df194c233 100644
--- a/plc4go/protocols/eip/readwrite/model/UnConnectedDataItem.go
+++ b/plc4go/protocols/eip/readwrite/model/UnConnectedDataItem.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -144,11 +146,9 @@ func UnConnectedDataItemParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (packetSize) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	packetSize, _packetSizeErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("packetSize", 16)
-	_ = packetSize
-	if _packetSizeErr != nil {
-		return nil, errors.Wrap(_packetSizeErr, "Error parsing 'packetSize' field of UnConnectedDataItem")
+	packetSize, err := ReadImplicitField[uint16](ctx, "packetSize", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'packetSize' field"))
 	}
 
 	// Simple Field (service)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/AccessLevel.go b/plc4go/protocols/knxnetip/readwrite/model/AccessLevel.go
index 71e501757d..d91440aafe 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/AccessLevel.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/AccessLevel.go
@@ -92,7 +92,7 @@ func (e AccessLevel) Purpose() string {
 	}
 }
 
-func AccessLevelFirstEnumForFieldPurpose(value string) (AccessLevel, bool) {
+func AccessLevelFirstEnumForFieldPurpose(value string) (enum AccessLevel, ok bool) {
 	for _, sizeValue := range AccessLevelValues {
 		if sizeValue.Purpose() == value {
 			return sizeValue, true
@@ -130,7 +130,7 @@ func (e AccessLevel) NeedsAuthentication() bool {
 	}
 }
 
-func AccessLevelFirstEnumForFieldNeedsAuthentication(value bool) (AccessLevel, bool) {
+func AccessLevelFirstEnumForFieldNeedsAuthentication(value bool) (enum AccessLevel, ok bool) {
 	for _, sizeValue := range AccessLevelValues {
 		if sizeValue.NeedsAuthentication() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/ApduDataMemoryResponse.go b/plc4go/protocols/knxnetip/readwrite/model/ApduDataMemoryResponse.go
index bc4a4f9dc5..e1e26c4cbd 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/ApduDataMemoryResponse.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/ApduDataMemoryResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -157,11 +159,9 @@ func ApduDataMemoryResponseParseWithBuffer(ctx context.Context, readBuffer utils
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (numBytes) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numBytes, _numBytesErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("numBytes", 6)
-	_ = numBytes
-	if _numBytesErr != nil {
-		return nil, errors.Wrap(_numBytesErr, "Error parsing 'numBytes' field of ApduDataMemoryResponse")
+	numBytes, err := ReadImplicitField[uint8](ctx, "numBytes", ReadUnsignedByte(readBuffer, 6))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numBytes' field"))
 	}
 
 	// Simple Field (address)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/ComObjectTableAddresses.go b/plc4go/protocols/knxnetip/readwrite/model/ComObjectTableAddresses.go
index b394673fad..bd0d0d00f8 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/ComObjectTableAddresses.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/ComObjectTableAddresses.go
@@ -11317,7 +11317,7 @@ func (e ComObjectTableAddresses) ComObjectTableAddress() uint16 {
 	}
 }
 
-func ComObjectTableAddressesFirstEnumForFieldComObjectTableAddress(value uint16) (ComObjectTableAddresses, bool) {
+func ComObjectTableAddressesFirstEnumForFieldComObjectTableAddress(value uint16) (enum ComObjectTableAddresses, ok bool) {
 	for _, sizeValue := range ComObjectTableAddressesValues {
 		if sizeValue.ComObjectTableAddress() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/ComObjectValueType.go b/plc4go/protocols/knxnetip/readwrite/model/ComObjectValueType.go
index 8e630f9266..43275ca067 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/ComObjectValueType.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/ComObjectValueType.go
@@ -151,7 +151,7 @@ func (e ComObjectValueType) SizeInBytes() uint8 {
 	}
 }
 
-func ComObjectValueTypeFirstEnumForFieldSizeInBytes(value uint8) (ComObjectValueType, bool) {
+func ComObjectValueTypeFirstEnumForFieldSizeInBytes(value uint8) (enum ComObjectValueType, ok bool) {
 	for _, sizeValue := range ComObjectValueTypeValues {
 		if sizeValue.SizeInBytes() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/ConnectionRequestInformation.go b/plc4go/protocols/knxnetip/readwrite/model/ConnectionRequestInformation.go
index d5cbd6eaca..58c860895e 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/ConnectionRequestInformation.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/ConnectionRequestInformation.go
@@ -124,11 +124,9 @@ func ConnectionRequestInformationParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of ConnectionRequestInformation")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	connectionType, err := ReadDiscriminatorField[uint8](ctx, "connectionType", ReadUnsignedByte(readBuffer, 8))
diff --git a/plc4go/protocols/knxnetip/readwrite/model/ConnectionResponseDataBlock.go b/plc4go/protocols/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
index 2bd4e1c4bb..9f31f44076 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
@@ -124,11 +124,9 @@ func ConnectionResponseDataBlockParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of ConnectionResponseDataBlock")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	connectionType, err := ReadDiscriminatorField[uint8](ctx, "connectionType", ReadUnsignedByte(readBuffer, 8))
diff --git a/plc4go/protocols/knxnetip/readwrite/model/DIBDeviceInfo.go b/plc4go/protocols/knxnetip/readwrite/model/DIBDeviceInfo.go
index f7fac12e20..496cd19f7a 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/DIBDeviceInfo.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/DIBDeviceInfo.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -201,11 +203,9 @@ func DIBDeviceInfoParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of DIBDeviceInfo")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (descriptionType)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/DIBSuppSvcFamilies.go b/plc4go/protocols/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
index 510e4bfe8d..11caa67973 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
@@ -133,11 +133,9 @@ func DIBSuppSvcFamiliesParseWithBuffer(ctx context.Context, readBuffer utils.Rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of DIBSuppSvcFamilies")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (descriptionType)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go b/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
index 2d2115f8de..c69b4a2ace 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -137,11 +139,9 @@ func DeviceConfigurationAckDataBlockParseWithBuffer(ctx context.Context, readBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of DeviceConfigurationAckDataBlock")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (communicationChannelId)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go b/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
index 4a73aac996..33b0fdc289 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -132,11 +134,9 @@ func DeviceConfigurationRequestDataBlockParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of DeviceConfigurationRequestDataBlock")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (communicationChannelId)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/DeviceDescriptor.go b/plc4go/protocols/knxnetip/readwrite/model/DeviceDescriptor.go
index 2c1a7f67ca..4bc4174fda 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/DeviceDescriptor.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/DeviceDescriptor.go
@@ -236,7 +236,7 @@ func (e DeviceDescriptor) FirmwareType() FirmwareType {
 	}
 }
 
-func DeviceDescriptorFirstEnumForFieldFirmwareType(value FirmwareType) (DeviceDescriptor, bool) {
+func DeviceDescriptorFirstEnumForFieldFirmwareType(value FirmwareType) (enum DeviceDescriptor, ok bool) {
 	for _, sizeValue := range DeviceDescriptorValues {
 		if sizeValue.FirmwareType() == value {
 			return sizeValue, true
@@ -370,7 +370,7 @@ func (e DeviceDescriptor) MediumType() DeviceDescriptorMediumType {
 	}
 }
 
-func DeviceDescriptorFirstEnumForFieldMediumType(value DeviceDescriptorMediumType) (DeviceDescriptor, bool) {
+func DeviceDescriptorFirstEnumForFieldMediumType(value DeviceDescriptorMediumType) (enum DeviceDescriptor, ok bool) {
 	for _, sizeValue := range DeviceDescriptorValues {
 		if sizeValue.MediumType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/HPAIControlEndpoint.go b/plc4go/protocols/knxnetip/readwrite/model/HPAIControlEndpoint.go
index fbc74f5570..66548c4344 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/HPAIControlEndpoint.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/HPAIControlEndpoint.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -137,11 +139,9 @@ func HPAIControlEndpointParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of HPAIControlEndpoint")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (hostProtocolCode)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/HPAIDataEndpoint.go b/plc4go/protocols/knxnetip/readwrite/model/HPAIDataEndpoint.go
index e76b53098b..77c4d0536a 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/HPAIDataEndpoint.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/HPAIDataEndpoint.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -137,11 +139,9 @@ func HPAIDataEndpointParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of HPAIDataEndpoint")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (hostProtocolCode)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go b/plc4go/protocols/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
index ecc7b6b7a1..ee42c4c120 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -137,11 +139,9 @@ func HPAIDiscoveryEndpointParseWithBuffer(ctx context.Context, readBuffer utils.
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of HPAIDiscoveryEndpoint")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (hostProtocolCode)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointMainType.go b/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointMainType.go
index 733874170c..92ecc86733 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointMainType.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointMainType.go
@@ -429,7 +429,7 @@ func (e KnxDatapointMainType) Number() uint16 {
 	}
 }
 
-func KnxDatapointMainTypeFirstEnumForFieldNumber(value uint16) (KnxDatapointMainType, bool) {
+func KnxDatapointMainTypeFirstEnumForFieldNumber(value uint16) (enum KnxDatapointMainType, ok bool) {
 	for _, sizeValue := range KnxDatapointMainTypeValues {
 		if sizeValue.Number() == value {
 			return sizeValue, true
@@ -691,7 +691,7 @@ func (e KnxDatapointMainType) Name() string {
 	}
 }
 
-func KnxDatapointMainTypeFirstEnumForFieldName(value string) (KnxDatapointMainType, bool) {
+func KnxDatapointMainTypeFirstEnumForFieldName(value string) (enum KnxDatapointMainType, ok bool) {
 	for _, sizeValue := range KnxDatapointMainTypeValues {
 		if sizeValue.Name() == value {
 			return sizeValue, true
@@ -953,7 +953,7 @@ func (e KnxDatapointMainType) SizeInBits() uint8 {
 	}
 }
 
-func KnxDatapointMainTypeFirstEnumForFieldSizeInBits(value uint8) (KnxDatapointMainType, bool) {
+func KnxDatapointMainTypeFirstEnumForFieldSizeInBits(value uint8) (enum KnxDatapointMainType, ok bool) {
 	for _, sizeValue := range KnxDatapointMainTypeValues {
 		if sizeValue.SizeInBits() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointType.go b/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointType.go
index 4bd0d7c1dd..15bcd368ef 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointType.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxDatapointType.go
@@ -2175,7 +2175,7 @@ func (e KnxDatapointType) Number() uint16 {
 	}
 }
 
-func KnxDatapointTypeFirstEnumForFieldNumber(value uint16) (KnxDatapointType, bool) {
+func KnxDatapointTypeFirstEnumForFieldNumber(value uint16) (enum KnxDatapointType, ok bool) {
 	for _, sizeValue := range KnxDatapointTypeValues {
 		if sizeValue.Number() == value {
 			return sizeValue, true
@@ -3601,7 +3601,7 @@ func (e KnxDatapointType) Name() string {
 	}
 }
 
-func KnxDatapointTypeFirstEnumForFieldName(value string) (KnxDatapointType, bool) {
+func KnxDatapointTypeFirstEnumForFieldName(value string) (enum KnxDatapointType, ok bool) {
 	for _, sizeValue := range KnxDatapointTypeValues {
 		if sizeValue.Name() == value {
 			return sizeValue, true
@@ -5027,7 +5027,7 @@ func (e KnxDatapointType) DatapointMainType() KnxDatapointMainType {
 	}
 }
 
-func KnxDatapointTypeFirstEnumForFieldDatapointMainType(value KnxDatapointMainType) (KnxDatapointType, bool) {
+func KnxDatapointTypeFirstEnumForFieldDatapointMainType(value KnxDatapointMainType) (enum KnxDatapointType, ok bool) {
 	for _, sizeValue := range KnxDatapointTypeValues {
 		if sizeValue.DatapointMainType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go b/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
index ee04c93b4a..677915b752 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectProperty.go
@@ -1360,7 +1360,7 @@ func (e KnxInterfaceObjectProperty) PropertyDataType() KnxPropertyDataType {
 	}
 }
 
-func KnxInterfaceObjectPropertyFirstEnumForFieldPropertyDataType(value KnxPropertyDataType) (KnxInterfaceObjectProperty, bool) {
+func KnxInterfaceObjectPropertyFirstEnumForFieldPropertyDataType(value KnxPropertyDataType) (enum KnxInterfaceObjectProperty, ok bool) {
 	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
 		if sizeValue.PropertyDataType() == value {
 			return sizeValue, true
@@ -2242,7 +2242,7 @@ func (e KnxInterfaceObjectProperty) Name() string {
 	}
 }
 
-func KnxInterfaceObjectPropertyFirstEnumForFieldName(value string) (KnxInterfaceObjectProperty, bool) {
+func KnxInterfaceObjectPropertyFirstEnumForFieldName(value string) (enum KnxInterfaceObjectProperty, ok bool) {
 	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
 		if sizeValue.Name() == value {
 			return sizeValue, true
@@ -3124,7 +3124,7 @@ func (e KnxInterfaceObjectProperty) PropertyId() uint8 {
 	}
 }
 
-func KnxInterfaceObjectPropertyFirstEnumForFieldPropertyId(value uint8) (KnxInterfaceObjectProperty, bool) {
+func KnxInterfaceObjectPropertyFirstEnumForFieldPropertyId(value uint8) (enum KnxInterfaceObjectProperty, ok bool) {
 	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
 		if sizeValue.PropertyId() == value {
 			return sizeValue, true
@@ -4006,7 +4006,7 @@ func (e KnxInterfaceObjectProperty) ObjectType() KnxInterfaceObjectType {
 	}
 }
 
-func KnxInterfaceObjectPropertyFirstEnumForFieldObjectType(value KnxInterfaceObjectType) (KnxInterfaceObjectProperty, bool) {
+func KnxInterfaceObjectPropertyFirstEnumForFieldObjectType(value KnxInterfaceObjectType) (enum KnxInterfaceObjectProperty, ok bool) {
 	for _, sizeValue := range KnxInterfaceObjectPropertyValues {
 		if sizeValue.ObjectType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectType.go b/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectType.go
index d474c1dabf..5143d5f096 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectType.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxInterfaceObjectType.go
@@ -212,7 +212,7 @@ func (e KnxInterfaceObjectType) Code() string {
 	}
 }
 
-func KnxInterfaceObjectTypeFirstEnumForFieldCode(value string) (KnxInterfaceObjectType, bool) {
+func KnxInterfaceObjectTypeFirstEnumForFieldCode(value string) (enum KnxInterfaceObjectType, ok bool) {
 	for _, sizeValue := range KnxInterfaceObjectTypeValues {
 		if sizeValue.Code() == value {
 			return sizeValue, true
@@ -330,7 +330,7 @@ func (e KnxInterfaceObjectType) Name() string {
 	}
 }
 
-func KnxInterfaceObjectTypeFirstEnumForFieldName(value string) (KnxInterfaceObjectType, bool) {
+func KnxInterfaceObjectTypeFirstEnumForFieldName(value string) (enum KnxInterfaceObjectType, ok bool) {
 	for _, sizeValue := range KnxInterfaceObjectTypeValues {
 		if sizeValue.Name() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
index 448512ee71..686fc5b7e8 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxManufacturer.go
@@ -4196,7 +4196,7 @@ func (e KnxManufacturer) Number() uint16 {
 	}
 }
 
-func KnxManufacturerFirstEnumForFieldNumber(value uint16) (KnxManufacturer, bool) {
+func KnxManufacturerFirstEnumForFieldNumber(value uint16) (enum KnxManufacturer, ok bool) {
 	for _, sizeValue := range KnxManufacturerValues {
 		if sizeValue.Number() == value {
 			return sizeValue, true
@@ -6970,7 +6970,7 @@ func (e KnxManufacturer) Name() string {
 	}
 }
 
-func KnxManufacturerFirstEnumForFieldName(value string) (KnxManufacturer, bool) {
+func KnxManufacturerFirstEnumForFieldName(value string) (enum KnxManufacturer, ok bool) {
 	for _, sizeValue := range KnxManufacturerValues {
 		if sizeValue.Name() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxNetIpMessage.go b/plc4go/protocols/knxnetip/readwrite/model/KnxNetIpMessage.go
index 8d19837f38..467a628a71 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxNetIpMessage.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxNetIpMessage.go
@@ -149,11 +149,9 @@ func KnxNetIpMessageParseWithBuffer(ctx context.Context, readBuffer utils.ReadBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (headerLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	headerLength, _headerLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("headerLength", 8)
-	_ = headerLength
-	if _headerLengthErr != nil {
-		return nil, errors.Wrap(_headerLengthErr, "Error parsing 'headerLength' field of KnxNetIpMessage")
+	headerLength, err := ReadImplicitField[uint8](ctx, "headerLength", ReadUnsignedByte(readBuffer, 8), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'headerLength' field"))
 	}
 
 	protocolVersion, err := ReadConstField[uint8](ctx, "protocolVersion", ReadUnsignedByte(readBuffer, 8), KnxNetIpMessage_PROTOCOLVERSION, codegen.WithByteOrder(binary.BigEndian))
@@ -167,11 +165,9 @@ func KnxNetIpMessageParseWithBuffer(ctx context.Context, readBuffer utils.ReadBu
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'msgType' field"))
 	}
 
-	// Implicit Field (totalLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	totalLength, _totalLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("totalLength", 16)
-	_ = totalLength
-	if _totalLengthErr != nil {
-		return nil, errors.Wrap(_totalLengthErr, "Error parsing 'totalLength' field of KnxNetIpMessage")
+	totalLength, err := ReadImplicitField[uint16](ctx, "totalLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'totalLength' field"))
 	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxPropertyDataType.go b/plc4go/protocols/knxnetip/readwrite/model/KnxPropertyDataType.go
index b5b6d45da7..24aeaffc71 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxPropertyDataType.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxPropertyDataType.go
@@ -363,7 +363,7 @@ func (e KnxPropertyDataType) Number() uint8 {
 	}
 }
 
-func KnxPropertyDataTypeFirstEnumForFieldNumber(value uint8) (KnxPropertyDataType, bool) {
+func KnxPropertyDataTypeFirstEnumForFieldNumber(value uint8) (enum KnxPropertyDataType, ok bool) {
 	for _, sizeValue := range KnxPropertyDataTypeValues {
 		if sizeValue.Number() == value {
 			return sizeValue, true
@@ -581,7 +581,7 @@ func (e KnxPropertyDataType) SizeInBytes() uint8 {
 	}
 }
 
-func KnxPropertyDataTypeFirstEnumForFieldSizeInBytes(value uint8) (KnxPropertyDataType, bool) {
+func KnxPropertyDataTypeFirstEnumForFieldSizeInBytes(value uint8) (enum KnxPropertyDataType, ok bool) {
 	for _, sizeValue := range KnxPropertyDataTypeValues {
 		if sizeValue.SizeInBytes() == value {
 			return sizeValue, true
@@ -799,7 +799,7 @@ func (e KnxPropertyDataType) Name() string {
 	}
 }
 
-func KnxPropertyDataTypeFirstEnumForFieldName(value string) (KnxPropertyDataType, bool) {
+func KnxPropertyDataTypeFirstEnumForFieldName(value string) (enum KnxPropertyDataType, ok bool) {
 	for _, sizeValue := range KnxPropertyDataTypeValues {
 		if sizeValue.Name() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/LDataExtended.go b/plc4go/protocols/knxnetip/readwrite/model/LDataExtended.go
index db84909797..d3618eae8d 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/LDataExtended.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/LDataExtended.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -250,11 +252,9 @@ func LDataExtendedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'destinationAddress' field"))
 	}
 
-	// Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataLength, _dataLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("dataLength", 8)
-	_ = dataLength
-	if _dataLengthErr != nil {
-		return nil, errors.Wrap(_dataLengthErr, "Error parsing 'dataLength' field of LDataExtended")
+	dataLength, err := ReadImplicitField[uint8](ctx, "dataLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataLength' field"))
 	}
 
 	// Simple Field (apdu)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/SupportedPhysicalMedia.go b/plc4go/protocols/knxnetip/readwrite/model/SupportedPhysicalMedia.go
index 0d84a41feb..9a330fd06c 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/SupportedPhysicalMedia.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/SupportedPhysicalMedia.go
@@ -188,7 +188,7 @@ func (e SupportedPhysicalMedia) KnxSupport() bool {
 	}
 }
 
-func SupportedPhysicalMediaFirstEnumForFieldKnxSupport(value bool) (SupportedPhysicalMedia, bool) {
+func SupportedPhysicalMediaFirstEnumForFieldKnxSupport(value bool) (enum SupportedPhysicalMedia, ok bool) {
 	for _, sizeValue := range SupportedPhysicalMediaValues {
 		if sizeValue.KnxSupport() == value {
 			return sizeValue, true
@@ -290,7 +290,7 @@ func (e SupportedPhysicalMedia) Description() string {
 	}
 }
 
-func SupportedPhysicalMediaFirstEnumForFieldDescription(value string) (SupportedPhysicalMedia, bool) {
+func SupportedPhysicalMediaFirstEnumForFieldDescription(value string) (enum SupportedPhysicalMedia, ok bool) {
 	for _, sizeValue := range SupportedPhysicalMediaValues {
 		if sizeValue.Description() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/knxnetip/readwrite/model/TunnelingRequestDataBlock.go b/plc4go/protocols/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
index 2bf8e5b79f..a14e0d35b4 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -132,11 +134,9 @@ func TunnelingRequestDataBlockParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of TunnelingRequestDataBlock")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (communicationChannelId)
diff --git a/plc4go/protocols/knxnetip/readwrite/model/TunnelingResponseDataBlock.go b/plc4go/protocols/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
index 7b8f615a76..488b50de35 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -137,11 +139,9 @@ func TunnelingResponseDataBlockParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (structureLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	structureLength, _structureLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("structureLength", 8)
-	_ = structureLength
-	if _structureLengthErr != nil {
-		return nil, errors.Wrap(_structureLengthErr, "Error parsing 'structureLength' field of TunnelingResponseDataBlock")
+	structureLength, err := ReadImplicitField[uint8](ctx, "structureLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'structureLength' field"))
 	}
 
 	// Simple Field (communicationChannelId)
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusDataType.go b/plc4go/protocols/modbus/readwrite/model/ModbusDataType.go
index ddcc7b2db4..c8874bde54 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusDataType.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusDataType.go
@@ -223,7 +223,7 @@ func (e ModbusDataType) DataTypeSize() uint8 {
 	}
 }
 
-func ModbusDataTypeFirstEnumForFieldDataTypeSize(value uint8) (ModbusDataType, bool) {
+func ModbusDataTypeFirstEnumForFieldDataTypeSize(value uint8) (enum ModbusDataType, ok bool) {
 	for _, sizeValue := range ModbusDataTypeValues {
 		if sizeValue.DataTypeSize() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusDeviceInformationObject.go b/plc4go/protocols/modbus/readwrite/model/ModbusDeviceInformationObject.go
index ed8698cafe..963594c30a 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusDeviceInformationObject.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusDeviceInformationObject.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -136,11 +138,9 @@ func ModbusDeviceInformationObjectParseWithBuffer(ctx context.Context, readBuffe
 	}
 	objectId := _objectId
 
-	// Implicit Field (objectLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	objectLength, _objectLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("objectLength", 8)
-	_ = objectLength
-	if _objectLengthErr != nil {
-		return nil, errors.Wrap(_objectLengthErr, "Error parsing 'objectLength' field of ModbusDeviceInformationObject")
+	objectLength, err := ReadImplicitField[uint8](ctx, "objectLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'objectLength' field"))
 	}
 
 	data, err := readBuffer.ReadByteArray("data", int(objectLength))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
index ef0868d9ce..cd16bc8d43 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -187,11 +189,9 @@ func ModbusPDUGetComEventLogResponseParseWithBuffer(ctx context.Context, readBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUGetComEventLogResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	// Simple Field (status)
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
index a2b435e253..19e112a516 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -154,11 +156,9 @@ func ModbusPDUReadCoilsResponseParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadCoilsResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go
index 850b8fbe36..48f981e1a6 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go
@@ -294,11 +294,9 @@ func ModbusPDUReadDeviceIdentificationResponseParseWithBuffer(ctx context.Contex
 	}
 	nextObjectId := _nextObjectId
 
-	// Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numberOfObjects, _numberOfObjectsErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("numberOfObjects", 8)
-	_ = numberOfObjects
-	if _numberOfObjectsErr != nil {
-		return nil, errors.Wrap(_numberOfObjectsErr, "Error parsing 'numberOfObjects' field of ModbusPDUReadDeviceIdentificationResponse")
+	numberOfObjects, err := ReadImplicitField[uint8](ctx, "numberOfObjects", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numberOfObjects' field"))
 	}
 
 	objects, err := ReadCountArrayField[ModbusDeviceInformationObject](ctx, "objects", ReadComplex[ModbusDeviceInformationObject](ModbusDeviceInformationObjectParseWithBuffer, readBuffer), uint64(numberOfObjects))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
index 0f09336130..9c596197c8 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -154,11 +156,9 @@ func ModbusPDUReadDiscreteInputsResponseParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadDiscreteInputsResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
index 922f20f78d..4cbce4a0eb 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
@@ -159,18 +159,14 @@ func ModbusPDUReadFifoQueueResponseParseWithBuffer(ctx context.Context, readBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("byteCount", 16)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadFifoQueueResponse")
+	byteCount, err := ReadImplicitField[uint16](ctx, "byteCount", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
-	// Implicit Field (fifoCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	fifoCount, _fifoCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("fifoCount", 16)
-	_ = fifoCount
-	if _fifoCountErr != nil {
-		return nil, errors.Wrap(_fifoCountErr, "Error parsing 'fifoCount' field of ModbusPDUReadFifoQueueResponse")
+	fifoCount, err := ReadImplicitField[uint16](ctx, "fifoCount", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'fifoCount' field"))
 	}
 
 	fifoValue, err := ReadCountArrayField[uint16](ctx, "fifoValue", ReadUnsignedShort(readBuffer, 16), uint64(fifoCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
index 54dcdbf260..0f9ec15395 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
@@ -158,11 +158,9 @@ func ModbusPDUReadFileRecordRequestParseWithBuffer(ctx context.Context, readBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadFileRecordRequest")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	items, err := ReadLengthArrayField[ModbusPDUReadFileRecordRequestItem](ctx, "items", ReadComplex[ModbusPDUReadFileRecordRequestItem](ModbusPDUReadFileRecordRequestItemParseWithBuffer, readBuffer), int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
index 5b15509bfb..238bef3862 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
@@ -158,11 +158,9 @@ func ModbusPDUReadFileRecordResponseParseWithBuffer(ctx context.Context, readBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadFileRecordResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	items, err := ReadLengthArrayField[ModbusPDUReadFileRecordResponseItem](ctx, "items", ReadComplex[ModbusPDUReadFileRecordResponseItem](ModbusPDUReadFileRecordResponseItemParseWithBuffer, readBuffer), int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
index 1b453dbe00..9115ac2a80 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -129,11 +131,9 @@ func ModbusPDUReadFileRecordResponseItemParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataLength, _dataLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("dataLength", 8)
-	_ = dataLength
-	if _dataLengthErr != nil {
-		return nil, errors.Wrap(_dataLengthErr, "Error parsing 'dataLength' field of ModbusPDUReadFileRecordResponseItem")
+	dataLength, err := ReadImplicitField[uint8](ctx, "dataLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataLength' field"))
 	}
 
 	// Simple Field (referenceType)
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
index 44e069fdd9..5d46a5c05a 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -154,11 +156,9 @@ func ModbusPDUReadHoldingRegistersResponseParseWithBuffer(ctx context.Context, r
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadHoldingRegistersResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
index 29a069bb5c..84b57e21ef 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -154,11 +156,9 @@ func ModbusPDUReadInputRegistersResponseParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadInputRegistersResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
index 286e577f07..1bac0e4ef0 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -226,11 +228,9 @@ func ModbusPDUReadWriteMultipleHoldingRegistersRequestParseWithBuffer(ctx contex
 	}
 	writeQuantity := _writeQuantity
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadWriteMultipleHoldingRegistersRequest")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
index 15f7b1e57a..e209f1b0e2 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -154,11 +156,9 @@ func ModbusPDUReadWriteMultipleHoldingRegistersResponseParseWithBuffer(ctx conte
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReadWriteMultipleHoldingRegistersResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
index 251aef584e..47c0202ba9 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -154,11 +156,9 @@ func ModbusPDUReportServerIdResponseParseWithBuffer(ctx context.Context, readBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUReportServerIdResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
index abb4824873..e77cdcb788 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
@@ -158,11 +158,9 @@ func ModbusPDUWriteFileRecordRequestParseWithBuffer(ctx context.Context, readBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUWriteFileRecordRequest")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	items, err := ReadLengthArrayField[ModbusPDUWriteFileRecordRequestItem](ctx, "items", ReadComplex[ModbusPDUWriteFileRecordRequestItem](ModbusPDUWriteFileRecordRequestItemParseWithBuffer, readBuffer), int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
index 80387b6860..530a381b4d 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -170,11 +172,9 @@ func ModbusPDUWriteFileRecordRequestItemParseWithBuffer(ctx context.Context, rea
 	}
 	recordNumber := _recordNumber
 
-	// Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	recordLength, _recordLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("recordLength", 16)
-	_ = recordLength
-	if _recordLengthErr != nil {
-		return nil, errors.Wrap(_recordLengthErr, "Error parsing 'recordLength' field of ModbusPDUWriteFileRecordRequestItem")
+	recordLength, err := ReadImplicitField[uint16](ctx, "recordLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'recordLength' field"))
 	}
 
 	recordData, err := readBuffer.ReadByteArray("recordData", int(int32(recordLength)*int32(int32(2))))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
index 57ec6dd345..f69491ea06 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
@@ -158,11 +158,9 @@ func ModbusPDUWriteFileRecordResponseParseWithBuffer(ctx context.Context, readBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUWriteFileRecordResponse")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	items, err := ReadLengthArrayField[ModbusPDUWriteFileRecordResponseItem](ctx, "items", ReadComplex[ModbusPDUWriteFileRecordResponseItem](ModbusPDUWriteFileRecordResponseItemParseWithBuffer, readBuffer), int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
index e77d3f1057..a8e3347096 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -170,11 +172,9 @@ func ModbusPDUWriteFileRecordResponseItemParseWithBuffer(ctx context.Context, re
 	}
 	recordNumber := _recordNumber
 
-	// Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	recordLength, _recordLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("recordLength", 16)
-	_ = recordLength
-	if _recordLengthErr != nil {
-		return nil, errors.Wrap(_recordLengthErr, "Error parsing 'recordLength' field of ModbusPDUWriteFileRecordResponseItem")
+	recordLength, err := ReadImplicitField[uint16](ctx, "recordLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'recordLength' field"))
 	}
 
 	recordData, err := readBuffer.ReadByteArray("recordData", int(recordLength))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
index 1fb310822f..314115088b 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -190,11 +192,9 @@ func ModbusPDUWriteMultipleCoilsRequestParseWithBuffer(ctx context.Context, read
 	}
 	quantity := _quantity
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUWriteMultipleCoilsRequest")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
index 9361d10144..5da2ac4c9b 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -190,11 +192,9 @@ func ModbusPDUWriteMultipleHoldingRegistersRequestParseWithBuffer(ctx context.Co
 	}
 	quantity := _quantity
 
-	// Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	byteCount, _byteCountErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("byteCount", 8)
-	_ = byteCount
-	if _byteCountErr != nil {
-		return nil, errors.Wrap(_byteCountErr, "Error parsing 'byteCount' field of ModbusPDUWriteMultipleHoldingRegistersRequest")
+	byteCount, err := ReadImplicitField[uint8](ctx, "byteCount", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteCount' field"))
 	}
 
 	value, err := readBuffer.ReadByteArray("value", int(byteCount))
diff --git a/plc4go/protocols/modbus/readwrite/model/ModbusTcpADU.go b/plc4go/protocols/modbus/readwrite/model/ModbusTcpADU.go
index 788dffae01..db3fa21fe8 100644
--- a/plc4go/protocols/modbus/readwrite/model/ModbusTcpADU.go
+++ b/plc4go/protocols/modbus/readwrite/model/ModbusTcpADU.go
@@ -202,11 +202,9 @@ func ModbusTcpADUParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 	}
 	_ = protocolIdentifier
 
-	// Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	length, _lengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("length", 16)
-	_ = length
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of ModbusTcpADU")
+	length, err := ReadImplicitField[uint16](ctx, "length", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 
 	// Simple Field (unitIdentifier)
diff --git a/plc4go/protocols/opcua/readwrite/model/DataChangeNotification.go b/plc4go/protocols/opcua/readwrite/model/DataChangeNotification.go
index 022d5d3b76..7a70068e4f 100644
--- a/plc4go/protocols/opcua/readwrite/model/DataChangeNotification.go
+++ b/plc4go/protocols/opcua/readwrite/model/DataChangeNotification.go
@@ -193,11 +193,9 @@ func DataChangeNotificationParseWithBuffer(ctx context.Context, readBuffer utils
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (notificationLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	notificationLength, _notificationLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadInt32("notificationLength", 32)
-	_ = notificationLength
-	if _notificationLengthErr != nil {
-		return nil, errors.Wrap(_notificationLengthErr, "Error parsing 'notificationLength' field of DataChangeNotification")
+	notificationLength, err := ReadImplicitField[int32](ctx, "notificationLength", ReadSignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'notificationLength' field"))
 	}
 
 	// Simple Field (noOfMonitoredItems)
diff --git a/plc4go/protocols/opcua/readwrite/model/EventNotificationList.go b/plc4go/protocols/opcua/readwrite/model/EventNotificationList.go
index ac4067fde7..57a6266e53 100644
--- a/plc4go/protocols/opcua/readwrite/model/EventNotificationList.go
+++ b/plc4go/protocols/opcua/readwrite/model/EventNotificationList.go
@@ -164,11 +164,9 @@ func EventNotificationListParseWithBuffer(ctx context.Context, readBuffer utils.
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (notificationLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	notificationLength, _notificationLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadInt32("notificationLength", 32)
-	_ = notificationLength
-	if _notificationLengthErr != nil {
-		return nil, errors.Wrap(_notificationLengthErr, "Error parsing 'notificationLength' field of EventNotificationList")
+	notificationLength, err := ReadImplicitField[int32](ctx, "notificationLength", ReadSignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'notificationLength' field"))
 	}
 
 	// Simple Field (noOfEvents)
diff --git a/plc4go/protocols/opcua/readwrite/model/MessagePDU.go b/plc4go/protocols/opcua/readwrite/model/MessagePDU.go
index 1e9c201f9a..9f040007ae 100644
--- a/plc4go/protocols/opcua/readwrite/model/MessagePDU.go
+++ b/plc4go/protocols/opcua/readwrite/model/MessagePDU.go
@@ -165,11 +165,9 @@ func MessagePDUParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer,
 		return nil, errors.Wrap(closeErr, "Error closing for chunk")
 	}
 
-	// Implicit Field (totalLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	totalLength, _totalLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint32("totalLength", 32)
-	_ = totalLength
-	if _totalLengthErr != nil {
-		return nil, errors.Wrap(_totalLengthErr, "Error parsing 'totalLength' field of MessagePDU")
+	totalLength, err := ReadImplicitField[uint32](ctx, "totalLength", ReadUnsignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'totalLength' field"))
 	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
diff --git a/plc4go/protocols/opcua/readwrite/model/OpcuaDataType.go b/plc4go/protocols/opcua/readwrite/model/OpcuaDataType.go
index 59898c8135..bc62da0a98 100644
--- a/plc4go/protocols/opcua/readwrite/model/OpcuaDataType.go
+++ b/plc4go/protocols/opcua/readwrite/model/OpcuaDataType.go
@@ -205,7 +205,7 @@ func (e OpcuaDataType) VariantType() uint8 {
 	}
 }
 
-func OpcuaDataTypeFirstEnumForFieldVariantType(value uint8) (OpcuaDataType, bool) {
+func OpcuaDataTypeFirstEnumForFieldVariantType(value uint8) (enum OpcuaDataType, ok bool) {
 	for _, sizeValue := range OpcuaDataTypeValues {
 		if sizeValue.VariantType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/opcua/readwrite/model/PascalString.go b/plc4go/protocols/opcua/readwrite/model/PascalString.go
index 3196f04e65..955805ca94 100644
--- a/plc4go/protocols/opcua/readwrite/model/PascalString.go
+++ b/plc4go/protocols/opcua/readwrite/model/PascalString.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -136,11 +138,9 @@ func PascalStringParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (sLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	sLength, _sLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadInt32("sLength", 32)
-	_ = sLength
-	if _sLengthErr != nil {
-		return nil, errors.Wrap(_sLengthErr, "Error parsing 'sLength' field of PascalString")
+	sLength, err := ReadImplicitField[int32](ctx, "sLength", ReadSignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sLength' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/opcua/readwrite/model/StatusChangeNotification.go b/plc4go/protocols/opcua/readwrite/model/StatusChangeNotification.go
index 362973cd5e..1213166cf6 100644
--- a/plc4go/protocols/opcua/readwrite/model/StatusChangeNotification.go
+++ b/plc4go/protocols/opcua/readwrite/model/StatusChangeNotification.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -155,11 +157,9 @@ func StatusChangeNotificationParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (notificationLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	notificationLength, _notificationLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadInt32("notificationLength", 32)
-	_ = notificationLength
-	if _notificationLengthErr != nil {
-		return nil, errors.Wrap(_notificationLengthErr, "Error parsing 'notificationLength' field of StatusChangeNotification")
+	notificationLength, err := ReadImplicitField[int32](ctx, "notificationLength", ReadSignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'notificationLength' field"))
 	}
 
 	// Simple Field (status)
diff --git a/plc4go/protocols/opcua/readwrite/model/UserIdentityToken.go b/plc4go/protocols/opcua/readwrite/model/UserIdentityToken.go
index cf178d0f43..6da0444372 100644
--- a/plc4go/protocols/opcua/readwrite/model/UserIdentityToken.go
+++ b/plc4go/protocols/opcua/readwrite/model/UserIdentityToken.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -155,11 +157,9 @@ func UserIdentityTokenParseWithBuffer(ctx context.Context, readBuffer utils.Read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (policyLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	policyLength, _policyLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadInt32("policyLength", 32)
-	_ = policyLength
-	if _policyLengthErr != nil {
-		return nil, errors.Wrap(_policyLengthErr, "Error parsing 'policyLength' field of UserIdentityToken")
+	policyLength, err := ReadImplicitField[int32](ctx, "policyLength", ReadSignedInt(readBuffer, 32))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'policyLength' field"))
 	}
 
 	// Simple Field (policyId)
diff --git a/plc4go/protocols/s7/readwrite/model/COTPPacket.go b/plc4go/protocols/s7/readwrite/model/COTPPacket.go
index 78b2e5b9c4..cb5dfc65a3 100644
--- a/plc4go/protocols/s7/readwrite/model/COTPPacket.go
+++ b/plc4go/protocols/s7/readwrite/model/COTPPacket.go
@@ -166,11 +166,9 @@ func COTPPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer,
 	var startPos = positionAware.GetPos()
 	_ = startPos
 
-	// Implicit Field (headerLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	headerLength, _headerLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("headerLength", 8)
-	_ = headerLength
-	if _headerLengthErr != nil {
-		return nil, errors.Wrap(_headerLengthErr, "Error parsing 'headerLength' field of COTPPacket")
+	headerLength, err := ReadImplicitField[uint8](ctx, "headerLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'headerLength' field"))
 	}
 
 	tpduCode, err := ReadDiscriminatorField[uint8](ctx, "tpduCode", ReadUnsignedByte(readBuffer, 8))
diff --git a/plc4go/protocols/s7/readwrite/model/COTPParameter.go b/plc4go/protocols/s7/readwrite/model/COTPParameter.go
index ece383c54a..480e757886 100644
--- a/plc4go/protocols/s7/readwrite/model/COTPParameter.go
+++ b/plc4go/protocols/s7/readwrite/model/COTPParameter.go
@@ -132,11 +132,9 @@ func COTPParameterParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'parameterType' field"))
 	}
 
-	// Implicit Field (parameterLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	parameterLength, _parameterLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("parameterLength", 8)
-	_ = parameterLength
-	if _parameterLengthErr != nil {
-		return nil, errors.Wrap(_parameterLengthErr, "Error parsing 'parameterLength' field of COTPParameter")
+	parameterLength, err := ReadImplicitField[uint8](ctx, "parameterLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'parameterLength' field"))
 	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
diff --git a/plc4go/protocols/s7/readwrite/model/COTPTpduSize.go b/plc4go/protocols/s7/readwrite/model/COTPTpduSize.go
index 7a0618264a..9a5f5344c0 100644
--- a/plc4go/protocols/s7/readwrite/model/COTPTpduSize.go
+++ b/plc4go/protocols/s7/readwrite/model/COTPTpduSize.go
@@ -103,7 +103,7 @@ func (e COTPTpduSize) SizeInBytes() uint16 {
 	}
 }
 
-func COTPTpduSizeFirstEnumForFieldSizeInBytes(value uint16) (COTPTpduSize, bool) {
+func COTPTpduSizeFirstEnumForFieldSizeInBytes(value uint16) (enum COTPTpduSize, ok bool) {
 	for _, sizeValue := range COTPTpduSizeValues {
 		if sizeValue.SizeInBytes() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/s7/readwrite/model/DataTransportSize.go b/plc4go/protocols/s7/readwrite/model/DataTransportSize.go
index b54c8a1724..d2ee553b5d 100644
--- a/plc4go/protocols/s7/readwrite/model/DataTransportSize.go
+++ b/plc4go/protocols/s7/readwrite/model/DataTransportSize.go
@@ -103,7 +103,7 @@ func (e DataTransportSize) SizeInBits() bool {
 	}
 }
 
-func DataTransportSizeFirstEnumForFieldSizeInBits(value bool) (DataTransportSize, bool) {
+func DataTransportSizeFirstEnumForFieldSizeInBits(value bool) (enum DataTransportSize, ok bool) {
 	for _, sizeValue := range DataTransportSizeValues {
 		if sizeValue.SizeInBits() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/s7/readwrite/model/MemoryArea.go b/plc4go/protocols/s7/readwrite/model/MemoryArea.go
index bc52be148f..bc1c80a244 100644
--- a/plc4go/protocols/s7/readwrite/model/MemoryArea.go
+++ b/plc4go/protocols/s7/readwrite/model/MemoryArea.go
@@ -115,7 +115,7 @@ func (e MemoryArea) ShortName() string {
 	}
 }
 
-func MemoryAreaFirstEnumForFieldShortName(value string) (MemoryArea, bool) {
+func MemoryAreaFirstEnumForFieldShortName(value string) (enum MemoryArea, ok bool) {
 	for _, sizeValue := range MemoryAreaValues {
 		if sizeValue.ShortName() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/s7/readwrite/model/S7Message.go b/plc4go/protocols/s7/readwrite/model/S7Message.go
index 9747495a00..560a0f7d62 100644
--- a/plc4go/protocols/s7/readwrite/model/S7Message.go
+++ b/plc4go/protocols/s7/readwrite/model/S7Message.go
@@ -231,18 +231,14 @@ func S7MessageParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer)
 	}
 	tpduReference := _tpduReference
 
-	// Implicit Field (parameterLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	parameterLength, _parameterLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("parameterLength", 16)
-	_ = parameterLength
-	if _parameterLengthErr != nil {
-		return nil, errors.Wrap(_parameterLengthErr, "Error parsing 'parameterLength' field of S7Message")
+	parameterLength, err := ReadImplicitField[uint16](ctx, "parameterLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'parameterLength' field"))
 	}
 
-	// Implicit Field (payloadLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	payloadLength, _payloadLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("payloadLength", 16)
-	_ = payloadLength
-	if _payloadLengthErr != nil {
-		return nil, errors.Wrap(_payloadLengthErr, "Error parsing 'payloadLength' field of S7Message")
+	payloadLength, err := ReadImplicitField[uint16](ctx, "payloadLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payloadLength' field"))
 	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
diff --git a/plc4go/protocols/s7/readwrite/model/S7ParameterModeTransition.go b/plc4go/protocols/s7/readwrite/model/S7ParameterModeTransition.go
index 6eb47abfb8..ade86d869b 100644
--- a/plc4go/protocols/s7/readwrite/model/S7ParameterModeTransition.go
+++ b/plc4go/protocols/s7/readwrite/model/S7ParameterModeTransition.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -214,11 +216,9 @@ func S7ParameterModeTransitionParseWithBuffer(ctx context.Context, readBuffer ut
 		}
 	}
 
-	// Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	itemLength, _itemLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("itemLength", 8)
-	_ = itemLength
-	if _itemLengthErr != nil {
-		return nil, errors.Wrap(_itemLengthErr, "Error parsing 'itemLength' field of S7ParameterModeTransition")
+	itemLength, err := ReadImplicitField[uint8](ctx, "itemLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemLength' field"))
 	}
 
 	// Simple Field (method)
diff --git a/plc4go/protocols/s7/readwrite/model/S7ParameterReadVarRequest.go b/plc4go/protocols/s7/readwrite/model/S7ParameterReadVarRequest.go
index ef9c757e5f..d70b4b8291 100644
--- a/plc4go/protocols/s7/readwrite/model/S7ParameterReadVarRequest.go
+++ b/plc4go/protocols/s7/readwrite/model/S7ParameterReadVarRequest.go
@@ -157,11 +157,9 @@ func S7ParameterReadVarRequestParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numItems, _numItemsErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("numItems", 8)
-	_ = numItems
-	if _numItemsErr != nil {
-		return nil, errors.Wrap(_numItemsErr, "Error parsing 'numItems' field of S7ParameterReadVarRequest")
+	numItems, err := ReadImplicitField[uint8](ctx, "numItems", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numItems' field"))
 	}
 
 	items, err := ReadCountArrayField[S7VarRequestParameterItem](ctx, "items", ReadComplex[S7VarRequestParameterItem](S7VarRequestParameterItemParseWithBuffer, readBuffer), uint64(numItems))
diff --git a/plc4go/protocols/s7/readwrite/model/S7ParameterUserData.go b/plc4go/protocols/s7/readwrite/model/S7ParameterUserData.go
index 91dc739147..27003c30fc 100644
--- a/plc4go/protocols/s7/readwrite/model/S7ParameterUserData.go
+++ b/plc4go/protocols/s7/readwrite/model/S7ParameterUserData.go
@@ -157,11 +157,9 @@ func S7ParameterUserDataParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numItems, _numItemsErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("numItems", 8)
-	_ = numItems
-	if _numItemsErr != nil {
-		return nil, errors.Wrap(_numItemsErr, "Error parsing 'numItems' field of S7ParameterUserData")
+	numItems, err := ReadImplicitField[uint8](ctx, "numItems", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numItems' field"))
 	}
 
 	items, err := ReadCountArrayField[S7ParameterUserDataItem](ctx, "items", ReadComplex[S7ParameterUserDataItem](S7ParameterUserDataItemParseWithBuffer, readBuffer), uint64(numItems))
diff --git a/plc4go/protocols/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go b/plc4go/protocols/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
index 1fd6572ce5..aada618e6a 100644
--- a/plc4go/protocols/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
+++ b/plc4go/protocols/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
@@ -27,6 +27,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -228,11 +230,9 @@ func S7ParameterUserDataItemCPUFunctionsParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	itemLength, _itemLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("itemLength", 8)
-	_ = itemLength
-	if _itemLengthErr != nil {
-		return nil, errors.Wrap(_itemLengthErr, "Error parsing 'itemLength' field of S7ParameterUserDataItemCPUFunctions")
+	itemLength, err := ReadImplicitField[uint8](ctx, "itemLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemLength' field"))
 	}
 
 	// Simple Field (method)
diff --git a/plc4go/protocols/s7/readwrite/model/S7ParameterWriteVarRequest.go b/plc4go/protocols/s7/readwrite/model/S7ParameterWriteVarRequest.go
index 493833dbbd..02d3208e49 100644
--- a/plc4go/protocols/s7/readwrite/model/S7ParameterWriteVarRequest.go
+++ b/plc4go/protocols/s7/readwrite/model/S7ParameterWriteVarRequest.go
@@ -157,11 +157,9 @@ func S7ParameterWriteVarRequestParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numItems, _numItemsErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("numItems", 8)
-	_ = numItems
-	if _numItemsErr != nil {
-		return nil, errors.Wrap(_numItemsErr, "Error parsing 'numItems' field of S7ParameterWriteVarRequest")
+	numItems, err := ReadImplicitField[uint8](ctx, "numItems", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numItems' field"))
 	}
 
 	items, err := ReadCountArrayField[S7VarRequestParameterItem](ctx, "items", ReadComplex[S7VarRequestParameterItem](S7VarRequestParameterItemParseWithBuffer, readBuffer), uint64(numItems))
diff --git a/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.go b/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.go
index ec94c1174c..fee2a79e5c 100644
--- a/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.go
+++ b/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.go
@@ -190,11 +190,9 @@ func S7PayloadUserDataItemCpuFunctionAlarmAckRequestParseWithBuffer(ctx context.
 	}
 	_ = functionId
 
-	// Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numberOfObjects, _numberOfObjectsErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("numberOfObjects", 8)
-	_ = numberOfObjects
-	if _numberOfObjectsErr != nil {
-		return nil, errors.Wrap(_numberOfObjectsErr, "Error parsing 'numberOfObjects' field of S7PayloadUserDataItemCpuFunctionAlarmAckRequest")
+	numberOfObjects, err := ReadImplicitField[uint8](ctx, "numberOfObjects", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numberOfObjects' field"))
 	}
 
 	messageObjects, err := ReadCountArrayField[AlarmMessageObjectAckType](ctx, "messageObjects", ReadComplex[AlarmMessageObjectAckType](AlarmMessageObjectAckTypeParseWithBuffer, readBuffer), uint64(numberOfObjects))
diff --git a/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.go b/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.go
index a414b358f3..cfe0c3dead 100644
--- a/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.go
+++ b/plc4go/protocols/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.go
@@ -178,11 +178,9 @@ func S7PayloadUserDataItemCpuFunctionAlarmAckResponseParseWithBuffer(ctx context
 	}
 	functionId := _functionId
 
-	// Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	numberOfObjects, _numberOfObjectsErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("numberOfObjects", 8)
-	_ = numberOfObjects
-	if _numberOfObjectsErr != nil {
-		return nil, errors.Wrap(_numberOfObjectsErr, "Error parsing 'numberOfObjects' field of S7PayloadUserDataItemCpuFunctionAlarmAckResponse")
+	numberOfObjects, err := ReadImplicitField[uint8](ctx, "numberOfObjects", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numberOfObjects' field"))
 	}
 
 	messageObjects, err := ReadCountArrayField[uint8](ctx, "messageObjects", ReadUnsignedByte(readBuffer, 8), uint64(numberOfObjects))
diff --git a/plc4go/protocols/s7/readwrite/model/S7VarPayloadDataItem.go b/plc4go/protocols/s7/readwrite/model/S7VarPayloadDataItem.go
index f55db4107a..ea0b06b29a 100644
--- a/plc4go/protocols/s7/readwrite/model/S7VarPayloadDataItem.go
+++ b/plc4go/protocols/s7/readwrite/model/S7VarPayloadDataItem.go
@@ -27,6 +27,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -172,11 +174,9 @@ func S7VarPayloadDataItemParseWithBuffer(ctx context.Context, readBuffer utils.R
 		return nil, errors.Wrap(closeErr, "Error closing for transportSize")
 	}
 
-	// Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	dataLength, _dataLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("dataLength", 16)
-	_ = dataLength
-	if _dataLengthErr != nil {
-		return nil, errors.Wrap(_dataLengthErr, "Error parsing 'dataLength' field of S7VarPayloadDataItem")
+	dataLength, err := ReadImplicitField[uint16](ctx, "dataLength", ReadUnsignedShort(readBuffer, 16))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataLength' field"))
 	}
 
 	data, err := readBuffer.ReadByteArray("data", int(utils.InlineIf(transportSize.SizeInBits(), func() any { return int32(math.Ceil(float64(dataLength) / float64(float64(8.0)))) }, func() any { return int32(dataLength) }).(int32)))
diff --git a/plc4go/protocols/s7/readwrite/model/S7VarRequestParameterItemAddress.go b/plc4go/protocols/s7/readwrite/model/S7VarRequestParameterItemAddress.go
index cf26036a09..15401a5d26 100644
--- a/plc4go/protocols/s7/readwrite/model/S7VarRequestParameterItemAddress.go
+++ b/plc4go/protocols/s7/readwrite/model/S7VarRequestParameterItemAddress.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -144,11 +146,9 @@ func S7VarRequestParameterItemAddressParseWithBuffer(ctx context.Context, readBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	itemLength, _itemLengthErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint8("itemLength", 8)
-	_ = itemLength
-	if _itemLengthErr != nil {
-		return nil, errors.Wrap(_itemLengthErr, "Error parsing 'itemLength' field of S7VarRequestParameterItemAddress")
+	itemLength, err := ReadImplicitField[uint8](ctx, "itemLength", ReadUnsignedByte(readBuffer, 8))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemLength' field"))
 	}
 
 	// Simple Field (address)
diff --git a/plc4go/protocols/s7/readwrite/model/TPKTPacket.go b/plc4go/protocols/s7/readwrite/model/TPKTPacket.go
index 32849c9c01..fb8bc25bea 100644
--- a/plc4go/protocols/s7/readwrite/model/TPKTPacket.go
+++ b/plc4go/protocols/s7/readwrite/model/TPKTPacket.go
@@ -168,11 +168,9 @@ func TPKTPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer)
 		}
 	}
 
-	// Implicit Field (len) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-	len, _lenErr := /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.ReadUint16("len", 16)
-	_ = len
-	if _lenErr != nil {
-		return nil, errors.Wrap(_lenErr, "Error parsing 'len' field of TPKTPacket")
+	len, err := ReadImplicitField[uint16](ctx, "len", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'len' field"))
 	}
 
 	// Simple Field (payload)
diff --git a/plc4go/protocols/s7/readwrite/model/TransportSize.go b/plc4go/protocols/s7/readwrite/model/TransportSize.go
index 3f1595d1ba..39d0913c4f 100644
--- a/plc4go/protocols/s7/readwrite/model/TransportSize.go
+++ b/plc4go/protocols/s7/readwrite/model/TransportSize.go
@@ -263,7 +263,7 @@ func (e TransportSize) Supported_S7_300() bool {
 	}
 }
 
-func TransportSizeFirstEnumForFieldSupported_S7_300(value bool) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldSupported_S7_300(value bool) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.Supported_S7_300() == value {
 			return sizeValue, true
@@ -409,7 +409,7 @@ func (e TransportSize) Supported_LOGO() bool {
 	}
 }
 
-func TransportSizeFirstEnumForFieldSupported_LOGO(value bool) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldSupported_LOGO(value bool) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.Supported_LOGO() == value {
 			return sizeValue, true
@@ -555,7 +555,7 @@ func (e TransportSize) Code() uint8 {
 	}
 }
 
-func TransportSizeFirstEnumForFieldCode(value uint8) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldCode(value uint8) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.Code() == value {
 			return sizeValue, true
@@ -701,7 +701,7 @@ func (e TransportSize) SizeInBytes() uint8 {
 	}
 }
 
-func TransportSizeFirstEnumForFieldSizeInBytes(value uint8) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldSizeInBytes(value uint8) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.SizeInBytes() == value {
 			return sizeValue, true
@@ -847,7 +847,7 @@ func (e TransportSize) Supported_S7_400() bool {
 	}
 }
 
-func TransportSizeFirstEnumForFieldSupported_S7_400(value bool) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldSupported_S7_400(value bool) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.Supported_S7_400() == value {
 			return sizeValue, true
@@ -993,7 +993,7 @@ func (e TransportSize) Supported_S7_1200() bool {
 	}
 }
 
-func TransportSizeFirstEnumForFieldSupported_S7_1200(value bool) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldSupported_S7_1200(value bool) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.Supported_S7_1200() == value {
 			return sizeValue, true
@@ -1139,7 +1139,7 @@ func (e TransportSize) ShortName() uint8 {
 	}
 }
 
-func TransportSizeFirstEnumForFieldShortName(value uint8) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldShortName(value uint8) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.ShortName() == value {
 			return sizeValue, true
@@ -1285,7 +1285,7 @@ func (e TransportSize) Supported_S7_1500() bool {
 	}
 }
 
-func TransportSizeFirstEnumForFieldSupported_S7_1500(value bool) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldSupported_S7_1500(value bool) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.Supported_S7_1500() == value {
 			return sizeValue, true
@@ -1431,7 +1431,7 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
 	}
 }
 
-func TransportSizeFirstEnumForFieldDataTransportSize(value DataTransportSize) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldDataTransportSize(value DataTransportSize) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.DataTransportSize() == value {
 			return sizeValue, true
@@ -1577,7 +1577,7 @@ func (e TransportSize) DataProtocolId() string {
 	}
 }
 
-func TransportSizeFirstEnumForFieldDataProtocolId(value string) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldDataProtocolId(value string) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.DataProtocolId() == value {
 			return sizeValue, true
@@ -1723,7 +1723,7 @@ func (e TransportSize) BaseType() TransportSize {
 	}
 }
 
-func TransportSizeFirstEnumForFieldBaseType(value TransportSize) (TransportSize, bool) {
+func TransportSizeFirstEnumForFieldBaseType(value TransportSize) (enum TransportSize, ok bool) {
 	for _, sizeValue := range TransportSizeValues {
 		if sizeValue.BaseType() == value {
 			return sizeValue, true
diff --git a/plc4go/protocols/simulated/readwrite/model/SimulatedDataTypeSizes.go b/plc4go/protocols/simulated/readwrite/model/SimulatedDataTypeSizes.go
index e80b728c3a..a601838969 100644
--- a/plc4go/protocols/simulated/readwrite/model/SimulatedDataTypeSizes.go
+++ b/plc4go/protocols/simulated/readwrite/model/SimulatedDataTypeSizes.go
@@ -223,7 +223,7 @@ func (e SimulatedDataTypeSizes) DataTypeSize() uint8 {
 	}
 }
 
-func SimulatedDataTypeSizesFirstEnumForFieldDataTypeSize(value uint8) (SimulatedDataTypeSizes, bool) {
+func SimulatedDataTypeSizesFirstEnumForFieldDataTypeSize(value uint8) (enum SimulatedDataTypeSizes, ok bool) {
 	for _, sizeValue := range SimulatedDataTypeSizesValues {
 		if sizeValue.DataTypeSize() == value {
 			return sizeValue, true