You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by ld...@apache.org on 2024/11/05 18:11:34 UTC

(plc4x) 01/03: feat(plc4j/opcua): Implementation of OPC-UA event subscriptions.

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

ldywicki pushed a commit to branch opc-ua-events
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit b207bcb36206956bb0a9eddc1fe2f5650202045f
Author: Łukasz Dywicki <lu...@code-house.org>
AuthorDate: Mon Aug 5 18:01:46 2024 +0200

    feat(plc4j/opcua): Implementation of OPC-UA event subscriptions.
    
    Series of changes related to code generation, testing of OPC-UA driver and its logic.
    
    Signed-off-by: Łukasz Dywicki <lu...@code-house.org>
---
 plc4j/drivers/opcua/pom.xml                        |   10 +
 .../opcua/readwrite/ActivateSessionRequest.java    |  121 +-
 .../opcua/readwrite/ActivateSessionResponse.java   |   77 +-
 .../plc4x/java/opcua/readwrite/AddNodesItem.java   |    6 +-
 .../java/opcua/readwrite/AddNodesRequest.java      |   69 +-
 .../java/opcua/readwrite/AddNodesResponse.java     |   96 +-
 .../plc4x/java/opcua/readwrite/AddNodesResult.java |    6 +-
 .../java/opcua/readwrite/AddReferencesItem.java    |    6 +-
 .../java/opcua/readwrite/AddReferencesRequest.java |   67 +-
 .../opcua/readwrite/AddReferencesResponse.java     |   79 +-
 .../opcua/readwrite/AdditionalParametersType.java  |   54 +-
 .../opcua/readwrite/AggregateConfiguration.java    |    6 +-
 .../java/opcua/readwrite/AggregateFilter.java      |  218 ++
 .../opcua/readwrite/AggregateFilterResult.java     |  200 ++
 .../java/opcua/readwrite/AliasNameDataType.java    |   40 +-
 .../plc4x/java/opcua/readwrite/Annotation.java     |    6 +-
 .../java/opcua/readwrite/AnnotationDataType.java   |    6 +-
 .../opcua/readwrite/AnonymousIdentityToken.java    |   47 +-
 .../opcua/readwrite/ApplicationDescription.java    |   31 +-
 .../plc4x/java/opcua/readwrite/Argument.java       |   37 +-
 .../plc4x/java/opcua/readwrite/AttributeId.java    |   80 +
 .../{ReadValueId.java => AttributeOperand.java}    |  116 +-
 .../java/opcua/readwrite/AxisInformation.java      |   62 +-
 ...ect.java => BinaryExtensionObjectWithMask.java} |  118 +-
 .../plc4x/java/opcua/readwrite/BinaryPayload.java  |    6 +-
 .../java/opcua/readwrite/BitFieldDefinition.java   |    6 +-
 ...java => BrokerConnectionTransportDataType.java} |  116 +-
 .../BrokerDataSetReaderTransportDataType.java      |  262 +++
 .../BrokerDataSetWriterTransportDataType.java      |  284 +++
 .../BrokerWriterGroupTransportDataType.java        |  231 ++
 .../java/opcua/readwrite/BrowseDescription.java    |    6 +-
 .../java/opcua/readwrite/BrowseNextRequest.java    |   49 +-
 .../java/opcua/readwrite/BrowseNextResponse.java   |   95 +-
 .../plc4x/java/opcua/readwrite/BrowsePath.java     |   20 +-
 .../java/opcua/readwrite/BrowsePathResult.java     |   51 +-
 .../java/opcua/readwrite/BrowsePathTarget.java     |    6 +-
 .../plc4x/java/opcua/readwrite/BrowseRequest.java  |   83 +-
 .../plc4x/java/opcua/readwrite/BrowseResponse.java |   96 +-
 .../plc4x/java/opcua/readwrite/BrowseResult.java   |   57 +-
 .../plc4x/java/opcua/readwrite/BuildInfo.java      |    6 +-
 .../java/opcua/readwrite/CallMethodRequest.java    |   42 +-
 .../java/opcua/readwrite/CallMethodResult.java     |   95 +-
 .../plc4x/java/opcua/readwrite/CallRequest.java    |   69 +-
 .../plc4x/java/opcua/readwrite/CallResponse.java   |   98 +-
 .../plc4x/java/opcua/readwrite/CancelRequest.java  |   21 +-
 .../plc4x/java/opcua/readwrite/CancelResponse.java |   21 +-
 .../java/opcua/readwrite/CartesianCoordinates.java |    6 +-
 .../java/opcua/readwrite/ChannelSecurityToken.java |    6 +-
 .../opcua/readwrite/CloseSecureChannelRequest.java |   21 +-
 .../readwrite/CloseSecureChannelResponse.java      |   21 +-
 .../java/opcua/readwrite/CloseSessionRequest.java  |   21 +-
 .../java/opcua/readwrite/CloseSessionResponse.java |   21 +-
 .../java/opcua/readwrite/ComplexNumberType.java    |    6 +-
 .../readwrite/ConfigurationVersionDataType.java    |    6 +-
 .../readwrite/ConnectionTransportDataType.java     |    6 +-
 .../plc4x/java/opcua/readwrite/ContentFilter.java  |   53 +-
 .../java/opcua/readwrite/ContentFilterElement.java |   40 +-
 .../readwrite/ContentFilterElementResult.java      |   73 +-
 .../java/opcua/readwrite/ContentFilterResult.java  |   89 +-
 .../readwrite/CreateMonitoredItemsRequest.java     |   66 +-
 .../readwrite/CreateMonitoredItemsResponse.java    |   97 +-
 .../java/opcua/readwrite/CreateSessionRequest.java |   37 +-
 .../opcua/readwrite/CreateSessionResponse.java     |  126 +-
 .../opcua/readwrite/CreateSubscriptionRequest.java |   21 +-
 .../readwrite/CreateSubscriptionResponse.java      |   21 +-
 .../java/opcua/readwrite/CurrencyUnitType.java     |    6 +-
 ...yMappingRuleType.java => DataChangeFilter.java} |  123 +-
 .../opcua/readwrite/DataChangeNotification.java    |   94 +-
 .../java/opcua/readwrite/DataSetMetaDataType.java  |  461 ++++
 .../opcua/readwrite/DataSetReaderDataType.java     |  619 +++++
 .../readwrite/DataSetReaderMessageDataType.java    |    6 +-
 .../readwrite/DataSetReaderTransportDataType.java  |    6 +-
 .../opcua/readwrite/DataSetWriterDataType.java     |   51 +-
 .../readwrite/DataSetWriterMessageDataType.java    |    6 +-
 .../readwrite/DataSetWriterTransportDataType.java  |    6 +-
 ...NodeAttributes.java => DataTypeAttributes.java} |   77 +-
 .../java/opcua/readwrite/DataTypeDefinition.java   |    6 +-
 .../java/opcua/readwrite/DataTypeDescription.java  |    6 +-
 .../java/opcua/readwrite/DataTypeSchemaHeader.java |  173 +-
 .../DatagramConnectionTransport2DataType.java      |  266 +++
 ...va => DatagramConnectionTransportDataType.java} |   69 +-
 .../DatagramDataSetReaderTransportDataType.java    |  235 ++
 .../DatagramWriterGroupTransport2DataType.java     |  315 +++
 ...a => DatagramWriterGroupTransportDataType.java} |  116 +-
 ...leteNodesItem.java => DeleteAtTimeDetails.java} |   79 +-
 ...eleteNodesItem.java => DeleteEventDetails.java} |   86 +-
 .../readwrite/DeleteMonitoredItemsRequest.java     |   59 +-
 .../readwrite/DeleteMonitoredItemsResponse.java    |   79 +-
 .../java/opcua/readwrite/DeleteNodesItem.java      |    6 +-
 .../java/opcua/readwrite/DeleteNodesRequest.java   |   70 +-
 .../java/opcua/readwrite/DeleteNodesResponse.java  |   79 +-
 ...odesItem.java => DeleteRawModifiedDetails.java} |   99 +-
 .../java/opcua/readwrite/DeleteReferencesItem.java |    6 +-
 .../opcua/readwrite/DeleteReferencesRequest.java   |   67 +-
 .../opcua/readwrite/DeleteReferencesResponse.java  |   79 +-
 .../readwrite/DeleteSubscriptionsRequest.java      |   55 +-
 .../readwrite/DeleteSubscriptionsResponse.java     |   79 +-
 .../opcua/readwrite/DiscoveryConfiguration.java    |    6 +-
 .../opcua/readwrite/DoubleComplexNumberType.java   |    6 +-
 .../plc4x/java/opcua/readwrite/EUInformation.java  |    6 +-
 ...rtesianCoordinates.java => ElementOperand.java} |   59 +-
 .../opcua/readwrite/EndpointConfiguration.java     |    6 +-
 .../java/opcua/readwrite/EndpointDescription.java  |   65 +-
 .../plc4x/java/opcua/readwrite/EndpointType.java   |    6 +-
 .../opcua/readwrite/EndpointUrlListDataType.java   |   42 +-
 .../{HistoryEvent.java => EnumDefinition.java}     |   91 +-
 ...taTypeDescription.java => EnumDescription.java} |   82 +-
 .../{EnumValueType.java => EnumField.java}         |   61 +-
 .../plc4x/java/opcua/readwrite/EnumValueType.java  |    6 +-
 .../java/opcua/readwrite/EphemeralKeyType.java     |    6 +-
 .../plc4x/java/opcua/readwrite/EventFieldList.java |   38 +-
 .../{FindServersResponse.java => EventFilter.java} |  143 +-
 .../java/opcua/readwrite/EventFilterResult.java    |  249 ++
 .../opcua/readwrite/EventNotificationList.java     |   63 +-
 .../plc4x/java/opcua/readwrite/ExpandedNodeId.java |   11 -
 .../java/opcua/readwrite/ExtensiblePayload.java    |   23 +-
 .../java/opcua/readwrite/ExtensionObject.java      |  106 +-
 .../opcua/readwrite/ExtensionObjectDefinition.java | 1267 +++++++----
 .../readwrite/ExtensionObjectEncodingMask.java     |   24 +-
 .../opcua/readwrite/ExtensionObjectWithMask.java   |  189 ++
 .../plc4x/java/opcua/readwrite/FieldMetaData.java  |   73 +-
 .../java/opcua/readwrite/FieldTargetDataType.java  |    6 +-
 .../plc4x/java/opcua/readwrite/FilterOperand.java  |    6 +-
 .../readwrite/FindServersOnNetworkRequest.java     |   59 +-
 .../readwrite/FindServersOnNetworkResponse.java    |   71 +-
 .../java/opcua/readwrite/FindServersRequest.java   |   77 +-
 .../java/opcua/readwrite/FindServersResponse.java  |   68 +-
 .../apache/plc4x/java/opcua/readwrite/Frame.java   |    6 +-
 .../opcua/readwrite/GenericAttributeValue.java     |    6 +-
 ...{NodeAttributes.java => GenericAttributes.java} |   99 +-
 .../java/opcua/readwrite/GetEndpointsRequest.java  |   77 +-
 .../java/opcua/readwrite/GetEndpointsResponse.java |   67 +-
 .../plc4x/java/opcua/readwrite/HistoryData.java    |   39 +-
 .../plc4x/java/opcua/readwrite/HistoryEvent.java   |   53 +-
 .../opcua/readwrite/HistoryEventFieldList.java     |   40 +-
 .../{HistoryData.java => HistoryModifiedData.java} |  105 +-
 ...ficationList.java => HistoryModifiedEvent.java} |  129 +-
 .../java/opcua/readwrite/HistoryReadDetails.java   |    6 +-
 .../java/opcua/readwrite/HistoryReadRequest.java   |   63 +-
 .../java/opcua/readwrite/HistoryReadResponse.java  |   97 +-
 .../java/opcua/readwrite/HistoryReadResult.java    |    6 +-
 .../java/opcua/readwrite/HistoryReadValueId.java   |    6 +-
 .../java/opcua/readwrite/HistoryUpdateDetails.java |    6 +-
 .../java/opcua/readwrite/HistoryUpdateRequest.java |   56 +-
 .../opcua/readwrite/HistoryUpdateResponse.java     |   97 +-
 .../java/opcua/readwrite/HistoryUpdateResult.java  |   69 +-
 .../opcua/readwrite/IdentityMappingRuleType.java   |    6 +-
 .../java/opcua/readwrite/IssuedIdentityToken.java  |   46 +-
 .../JsonDataSetReaderMessageDataType.java          |  192 ++
 ....java => JsonDataSetWriterMessageDataType.java} |   95 +-
 ...pe.java => JsonWriterGroupMessageDataType.java} |   95 +-
 .../plc4x/java/opcua/readwrite/KeyValuePair.java   |    6 +-
 .../opcua/readwrite/LinearConversionDataType.java  |    6 +-
 .../{KeyValuePair.java => LiteralOperand.java}     |   61 +-
 ...etwork.java => MdnsDiscoveryConfiguration.java} |  142 +-
 .../plc4x/java/opcua/readwrite/MessagePDU.java     |   23 +-
 .../{NodeAttributes.java => MethodAttributes.java} |  109 +-
 .../readwrite/ModelChangeStructureDataType.java    |    6 +-
 .../java/opcua/readwrite/ModificationInfo.java     |    6 +-
 .../readwrite/ModifyMonitoredItemsRequest.java     |   66 +-
 .../readwrite/ModifyMonitoredItemsResponse.java    |   97 +-
 .../opcua/readwrite/ModifySubscriptionRequest.java |   21 +-
 .../readwrite/ModifySubscriptionResponse.java      |   21 +-
 .../readwrite/MonitoredItemCreateRequest.java      |   36 +-
 .../opcua/readwrite/MonitoredItemCreateResult.java |    6 +-
 .../readwrite/MonitoredItemModifyRequest.java      |   22 +-
 .../opcua/readwrite/MonitoredItemModifyResult.java |    6 +-
 .../opcua/readwrite/MonitoredItemNotification.java |    6 +-
 .../java/opcua/readwrite/MonitoringFilter.java     |    6 +-
 .../opcua/readwrite/MonitoringFilterResult.java    |    6 +-
 .../java/opcua/readwrite/MonitoringParameters.java |    6 +-
 .../opcua/readwrite/NetworkAddressDataType.java    |    6 +-
 ...ataType.java => NetworkAddressUrlDataType.java} |   61 +-
 .../java/opcua/readwrite/NetworkGroupDataType.java |   54 +-
 .../plc4x/java/opcua/readwrite/NodeAttributes.java |    6 +-
 .../apache/plc4x/java/opcua/readwrite/NodeId.java  |   11 -
 .../java/opcua/readwrite/NodeIdByteString.java     |   11 +
 .../plc4x/java/opcua/readwrite/NodeIdFourByte.java |   11 +
 .../plc4x/java/opcua/readwrite/NodeIdGuid.java     |   11 +
 .../plc4x/java/opcua/readwrite/NodeIdNumeric.java  |   11 +
 .../plc4x/java/opcua/readwrite/NodeIdString.java   |   11 +
 .../plc4x/java/opcua/readwrite/NodeIdTwoByte.java  |   11 +
 .../java/opcua/readwrite/NodeIdTypeDefinition.java |    2 +
 .../plc4x/java/opcua/readwrite/NodeReference.java  |   45 +-
 .../java/opcua/readwrite/NodeTypeDescription.java  |   58 +-
 .../java/opcua/readwrite/NotificationData.java     |    6 +-
 .../java/opcua/readwrite/NotificationMessage.java  |   49 +-
 .../plc4x/java/opcua/readwrite/NullExtension.java  |    6 +-
 ...oByte.java => NullExtensionObjectWithMask.java} |   82 +-
 .../{NodeAttributes.java => ObjectAttributes.java} |   73 +-
 ...deAttributes.java => ObjectTypeAttributes.java} |   77 +-
 .../plc4x/java/opcua/readwrite/OpcuaAPU.java       |   10 +-
 .../opcua/readwrite/OpcuaAcknowledgeResponse.java  |    2 +-
 .../java/opcua/readwrite/OpcuaCloseRequest.java    |    5 +-
 .../java/opcua/readwrite/OpcuaHelloRequest.java    |    2 +-
 .../java/opcua/readwrite/OpcuaMessageError.java    |    2 +-
 .../java/opcua/readwrite/OpcuaMessageRequest.java  |    5 +-
 .../java/opcua/readwrite/OpcuaMessageResponse.java |    5 +-
 .../java/opcua/readwrite/OpcuaOpenRequest.java     |    5 +-
 .../java/opcua/readwrite/OpcuaOpenResponse.java    |    5 +-
 .../plc4x/java/opcua/readwrite/OpcuaVector.java    |    6 +-
 .../opcua/readwrite/OpenSecureChannelRequest.java  |   21 +-
 .../opcua/readwrite/OpenSecureChannelResponse.java |   37 +-
 .../plc4x/java/opcua/readwrite/OptionSet.java      |    6 +-
 .../plc4x/java/opcua/readwrite/Orientation.java    |    6 +-
 .../plc4x/java/opcua/readwrite/ParsingResult.java  |   72 +-
 .../plc4x/java/opcua/readwrite/PascalString.java   |   13 +-
 .../apache/plc4x/java/opcua/readwrite/Payload.java |   18 +-
 ...tableQualifiedName.java => PortableNodeId.java} |   64 +-
 .../opcua/readwrite/PortableQualifiedName.java     |    6 +-
 .../opcua/readwrite/PriorityMappingEntryType.java  |    6 +-
 .../readwrite/ProgramDiagnostic2DataType.java      |  148 +-
 .../opcua/readwrite/ProgramDiagnosticDataType.java |  108 +-
 .../readwrite/PubSubConfiguration2DataType.java    |  578 +++++
 .../readwrite/PubSubConfigurationDataType.java     |  101 +-
 .../readwrite/PubSubConfigurationRefDataType.java  |    6 +-
 ....java => PubSubConfigurationValueDataType.java} |   93 +-
 .../opcua/readwrite/PubSubConnectionDataType.java  |  134 +-
 .../java/opcua/readwrite/PubSubGroupDataType.java  |   92 +-
 .../readwrite/PubSubKeyPushTargetDataType.java     |  115 +-
 .../plc4x/java/opcua/readwrite/PublishRequest.java |   75 +-
 .../java/opcua/readwrite/PublishResponse.java      |  115 +-
 ...Filter.java => PublishedDataItemsDataType.java} |   95 +-
 ...a => PublishedDataSetCustomSourceDataType.java} |   82 +-
 .../opcua/readwrite/PublishedDataSetDataType.java  |  289 +++
 .../readwrite/PublishedDataSetSourceDataType.java  |    6 +-
 .../opcua/readwrite/PublishedEventsDataType.java   |  213 ++
 .../opcua/readwrite/PublishedVariableDataType.java |   31 +-
 .../plc4x/java/opcua/readwrite/QosDataType.java    |    6 +-
 .../java/opcua/readwrite/QuantityDimension.java    |    6 +-
 .../java/opcua/readwrite/QueryDataDescription.java |   20 +-
 .../plc4x/java/opcua/readwrite/QueryDataSet.java   |   42 +-
 .../java/opcua/readwrite/QueryFirstRequest.java    |  108 +-
 .../java/opcua/readwrite/QueryFirstResponse.java   |  146 +-
 .../java/opcua/readwrite/QueryNextRequest.java     |   21 +-
 .../java/opcua/readwrite/QueryNextResponse.java    |   70 +-
 .../apache/plc4x/java/opcua/readwrite/Range.java   |    6 +-
 .../plc4x/java/opcua/readwrite/RationalNumber.java |    6 +-
 ...lNumber.java => ReadAnnotationDataDetails.java} |   86 +-
 ...eSessionRequest.java => ReadAtTimeDetails.java} |  104 +-
 ...RepublishRequest.java => ReadEventDetails.java} |  146 +-
 ...oringParameters.java => ReadEventDetails2.java} |  182 +-
 .../java/opcua/readwrite/ReadProcessedDetails.java |  258 +++
 .../opcua/readwrite/ReadRawModifiedDetails.java    |  248 ++
 .../plc4x/java/opcua/readwrite/ReadRequest.java    |   64 +-
 .../plc4x/java/opcua/readwrite/ReadResponse.java   |   80 +-
 .../plc4x/java/opcua/readwrite/ReadValueId.java    |    6 +-
 ...GroupDataType.java => ReaderGroupDataType.java} |  227 +-
 .../readwrite/ReaderGroupMessageDataType.java      |    6 +-
 .../readwrite/ReaderGroupTransportDataType.java    |    6 +-
 ...oryReadDetails.java => ReceiveQosDataType.java} |   36 +-
 ...eFault.java => ReceiveQosPriorityDataType.java} |   68 +-
 .../opcua/readwrite/RedundantServerDataType.java   |    6 +-
 .../java/opcua/readwrite/ReferenceDescription.java |    6 +-
 .../readwrite/ReferenceDescriptionDataType.java    |    6 +-
 .../readwrite/ReferenceListEntryDataType.java      |    6 +-
 ...ttributes.java => ReferenceTypeAttributes.java} |  133 +-
 .../java/opcua/readwrite/RegisterNodesRequest.java |   54 +-
 .../opcua/readwrite/RegisterNodesResponse.java     |   54 +-
 .../opcua/readwrite/RegisterServer2Request.java    |   74 +-
 .../opcua/readwrite/RegisterServer2Response.java   |   86 +-
 .../opcua/readwrite/RegisterServerRequest.java     |   35 +-
 .../opcua/readwrite/RegisterServerResponse.java    |   21 +-
 .../java/opcua/readwrite/RegisteredServer.java     |   55 +-
 .../plc4x/java/opcua/readwrite/RelativePath.java   |   53 +-
 .../java/opcua/readwrite/RelativePathElement.java  |    6 +-
 .../java/opcua/readwrite/RepublishRequest.java     |   23 +-
 .../java/opcua/readwrite/RepublishResponse.java    |   34 +-
 .../plc4x/java/opcua/readwrite/RequestHeader.java  |    6 +-
 .../plc4x/java/opcua/readwrite/ResponseHeader.java |   37 +-
 .../java/opcua/readwrite/RolePermissionType.java   |    6 +-
 ...{ServiceFault.java => RootExtensionObject.java} |   75 +-
 .../SamplingIntervalDiagnosticsDataType.java       |    6 +-
 .../opcua/readwrite/SecurityGroupDataType.java     |  118 +-
 .../readwrite/SemanticChangeStructureDataType.java |    6 +-
 .../ServerDiagnosticsSummaryDataType.java          |    6 +-
 .../java/opcua/readwrite/ServerOnNetwork.java      |   35 +-
 .../java/opcua/readwrite/ServerStatusDataType.java |   20 +-
 .../opcua/readwrite/ServiceCounterDataType.java    |    6 +-
 .../plc4x/java/opcua/readwrite/ServiceFault.java   |   21 +-
 .../readwrite/SessionDiagnosticsDataType.java      |  510 +++--
 .../SessionSecurityDiagnosticsDataType.java        |   31 +-
 .../readwrite/SessionlessInvokeRequestType.java    |   91 +-
 .../readwrite/SessionlessInvokeResponseType.java   |   73 +-
 .../opcua/readwrite/SetMonitoringModeRequest.java  |   53 +-
 .../opcua/readwrite/SetMonitoringModeResponse.java |   79 +-
 .../opcua/readwrite/SetPublishingModeRequest.java  |   59 +-
 .../opcua/readwrite/SetPublishingModeResponse.java |   79 +-
 .../java/opcua/readwrite/SetTriggeringRequest.java |   82 +-
 .../opcua/readwrite/SetTriggeringResponse.java     |  133 +-
 .../plc4x/java/opcua/readwrite/SignatureData.java  |    6 +-
 .../opcua/readwrite/SignedSoftwareCertificate.java |    6 +-
 ...eadValueId.java => SimpleAttributeOperand.java} |  137 +-
 ...Description.java => SimpleTypeDescription.java} |   78 +-
 .../StandaloneSubscribedDataSetDataType.java       |  245 ++
 ...=> StandaloneSubscribedDataSetRefDataType.java} |   69 +-
 .../opcua/readwrite/StatusChangeNotification.java  |   16 +-
 .../plc4x/java/opcua/readwrite/StatusResult.java   |    6 +-
 .../java/opcua/readwrite/StructureDefinition.java  |  245 ++
 ...eDescription.java => StructureDescription.java} |   65 +-
 .../plc4x/java/opcua/readwrite/StructureField.java |   48 +-
 .../opcua/readwrite/SubscribedDataSetDataType.java |    6 +-
 .../readwrite/SubscribedDataSetMirrorDataType.java |  191 ++
 .../readwrite/SubscriptionAcknowledgement.java     |    6 +-
 .../readwrite/SubscriptionDiagnosticsDataType.java |    6 +-
 ...entFilter.java => TargetVariablesDataType.java} |   96 +-
 .../java/opcua/readwrite/TimeZoneDataType.java     |    6 +-
 .../java/opcua/readwrite/TransactionErrorType.java |    6 +-
 .../plc4x/java/opcua/readwrite/TransferResult.java |   51 +-
 .../readwrite/TransferSubscriptionsRequest.java    |   59 +-
 .../readwrite/TransferSubscriptionsResponse.java   |   96 +-
 .../TranslateBrowsePathsToNodeIdsRequest.java      |   64 +-
 .../TranslateBrowsePathsToNodeIdsResponse.java     |   96 +-
 ...ryReadDetails.java => TransmitQosDataType.java} |   36 +-
 ...aType.java => TransmitQosPriorityDataType.java} |   66 +-
 .../java/opcua/readwrite/TrustListDataType.java    |  116 +-
 .../java/opcua/readwrite/UABinaryFileDataType.java |  406 ++++
 .../UadpDataSetReaderMessageDataType.java          |  354 +++
 .../UadpDataSetWriterMessageDataType.java          |  224 ++
 .../readwrite/UadpWriterGroupMessageDataType.java  |  273 +++
 .../apache/plc4x/java/opcua/readwrite/Union.java   |    6 +-
 .../opcua/readwrite/UnregisterNodesRequest.java    |   54 +-
 .../opcua/readwrite/UnregisterNodesResponse.java   |   21 +-
 .../opcua/readwrite/UnsignedRationalNumber.java    |    6 +-
 .../{WriteValue.java => UpdateDataDetails.java}    |  140 +-
 .../java/opcua/readwrite/UpdateEventDetails.java   |  245 ++
 .../readwrite/UpdateStructureDataDetails.java      |  214 ++
 .../java/opcua/readwrite/UserIdentityToken.java    |   61 +-
 .../readwrite/UserIdentityTokenDefinition.java     |  146 --
 .../opcua/readwrite/UserManagementDataType.java    |    6 +-
 .../opcua/readwrite/UserNameIdentityToken.java     |   52 +-
 .../java/opcua/readwrite/UserTokenPolicy.java      |    6 +-
 .../java/opcua/readwrite/VariableAttributes.java   |  450 ++++
 ...Attributes.java => VariableTypeAttributes.java} |  194 +-
 .../{NodeAttributes.java => ViewAttributes.java}   |  109 +-
 .../java/opcua/readwrite/ViewDescription.java      |    6 +-
 .../plc4x/java/opcua/readwrite/WriteRequest.java   |   70 +-
 .../plc4x/java/opcua/readwrite/WriteResponse.java  |   80 +-
 .../plc4x/java/opcua/readwrite/WriteValue.java     |    6 +-
 .../java/opcua/readwrite/WriterGroupDataType.java  |  613 +++++
 .../readwrite/WriterGroupMessageDataType.java      |    6 +-
 .../readwrite/WriterGroupTransportDataType.java    |    6 +-
 .../java/opcua/readwrite/X509IdentityToken.java    |   47 +-
 .../apache/plc4x/java/opcua/readwrite/XVType.java  |    6 +-
 .../apache/plc4x/java/opcua/OpcuaPlcDriver.java    |    2 +-
 .../plc4x/java/opcua/context/Conversation.java     |   14 +-
 .../plc4x/java/opcua/context/SecureChannel.java    |   72 +-
 .../java/opcua/protocol/OpcuaProtocolLogic.java    |  362 +--
 .../opcua/protocol/OpcuaSubscriptionHandle.java    |  164 +-
 .../opcua/protocol/chunk/PayloadConverter.java     |   11 +-
 .../java/opcua/readwrite/utils/StaticHelper.java   |   16 +-
 .../org/apache/plc4x/java/opcua/tag/OpcuaTag.java  |   87 +-
 .../java/opcua/OpcuaParserSerializerTest.java      |   29 +
 .../protocol/OpcuaSubscriptionHandleTest.java      |   23 +
 .../opcua/protocol/chunk/PayloadConverterTest.java |    6 +-
 .../milo/examples/server/EventNotifierTask.java    |   99 +
 .../milo/examples/server/TestMiloServer.java       |   14 +-
 .../java/spi/codegen/fields/FieldReaderArray.java  |    3 +
 .../apache/plc4x/java/spi/tag/TagConfigParser.java |    3 +-
 .../plc4x/java/spi/tag/TagTagConfigParserTest.java |   17 +-
 .../plc4x/test/driver/internal/Testcase.java       |    2 +-
 .../internal/handlers/ApiRequestHandler.java       |    2 +-
 .../migration/MessageValidatorAndMigrator.java     |    4 +
 protocols/opcua/pom.xml                            |   27 +
 .../generated/protocols/opcua/opc-attribute.mspec  |   53 +
 .../generated/protocols/opcua/opc-manual.mspec     | 2377 +++++++++++---------
 .../apache/plc4x/protocol/opcua/OpcuaProtocol.java |    3 +
 .../main/script/downloadAndEditOpcuaNodeSet.groovy |    1 +
 protocols/opcua/src/main/xslt/opc-attribute.xsl    |   81 +
 protocols/opcua/src/main/xslt/opc-common.xsl       |  152 +-
 protocols/opcua/src/main/xslt/opc-manual.xsl       |  134 +-
 .../resources/protocols/opcua/DriverTestsuite.xml  | 2081 ++++++++++++++++-
 .../protocols/opcua/ParserSerializerTestsuite.xml  | 2102 +++++++++++++++++
 373 files changed, 23066 insertions(+), 10348 deletions(-)

diff --git a/plc4j/drivers/opcua/pom.xml b/plc4j/drivers/opcua/pom.xml
index c63e139f1b..40fbdfe942 100644
--- a/plc4j/drivers/opcua/pom.xml
+++ b/plc4j/drivers/opcua/pom.xml
@@ -162,6 +162,11 @@
       <artifactId>bcprov-jdk18on</artifactId>
     </dependency>
 
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-transport-tcp</artifactId>
@@ -289,6 +294,11 @@
           <!-- Scope is 'provided' as this way it's not shipped with the driver -->
           <scope>provided</scope>
         </dependency>
+        <dependency>
+          <groupId>com.google.guava</groupId>
+          <artifactId>guava</artifactId>
+          <scope>provided</scope>
+        </dependency>
 
         <dependency>
           <groupId>org.apache.plc4x</groupId>
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionRequest.java
index 7a280a0583..0b43c965bc 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionRequest.java
@@ -38,60 +38,46 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ActivateSessionRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "467";
+  public Integer getExtensionId() {
+    return (int) 467;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
-  protected final ExtensionObjectDefinition clientSignature;
-  protected final int noOfClientSoftwareCertificates;
-  protected final List<ExtensionObjectDefinition> clientSoftwareCertificates;
-  protected final int noOfLocaleIds;
+  protected final RequestHeader requestHeader;
+  protected final SignatureData clientSignature;
+  protected final List<SignedSoftwareCertificate> clientSoftwareCertificates;
   protected final List<PascalString> localeIds;
   protected final ExtensionObject userIdentityToken;
-  protected final ExtensionObjectDefinition userTokenSignature;
+  protected final SignatureData userTokenSignature;
 
   public ActivateSessionRequest(
-      ExtensionObjectDefinition requestHeader,
-      ExtensionObjectDefinition clientSignature,
-      int noOfClientSoftwareCertificates,
-      List<ExtensionObjectDefinition> clientSoftwareCertificates,
-      int noOfLocaleIds,
+      RequestHeader requestHeader,
+      SignatureData clientSignature,
+      List<SignedSoftwareCertificate> clientSoftwareCertificates,
       List<PascalString> localeIds,
       ExtensionObject userIdentityToken,
-      ExtensionObjectDefinition userTokenSignature) {
+      SignatureData userTokenSignature) {
     super();
     this.requestHeader = requestHeader;
     this.clientSignature = clientSignature;
-    this.noOfClientSoftwareCertificates = noOfClientSoftwareCertificates;
     this.clientSoftwareCertificates = clientSoftwareCertificates;
-    this.noOfLocaleIds = noOfLocaleIds;
     this.localeIds = localeIds;
     this.userIdentityToken = userIdentityToken;
     this.userTokenSignature = userTokenSignature;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
-  public ExtensionObjectDefinition getClientSignature() {
+  public SignatureData getClientSignature() {
     return clientSignature;
   }
 
-  public int getNoOfClientSoftwareCertificates() {
-    return noOfClientSoftwareCertificates;
-  }
-
-  public List<ExtensionObjectDefinition> getClientSoftwareCertificates() {
+  public List<SignedSoftwareCertificate> getClientSoftwareCertificates() {
     return clientSoftwareCertificates;
   }
 
-  public int getNoOfLocaleIds() {
-    return noOfLocaleIds;
-  }
-
   public List<PascalString> getLocaleIds() {
     return localeIds;
   }
@@ -100,7 +86,7 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
     return userIdentityToken;
   }
 
-  public ExtensionObjectDefinition getUserTokenSignature() {
+  public SignatureData getUserTokenSignature() {
     return userTokenSignature;
   }
 
@@ -117,8 +103,14 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
     // Simple Field (clientSignature)
     writeSimpleField("clientSignature", clientSignature, writeComplex(writeBuffer));
 
-    // Simple Field (noOfClientSoftwareCertificates)
-    writeSimpleField(
+    // Implicit Field (noOfClientSoftwareCertificates) (Used for parsing, but its value is not
+    // stored as it's implicitly given by the objects content)
+    int noOfClientSoftwareCertificates =
+        (int)
+            ((((getClientSoftwareCertificates()) == (null))
+                ? -(1)
+                : COUNT(getClientSoftwareCertificates())));
+    writeImplicitField(
         "noOfClientSoftwareCertificates",
         noOfClientSoftwareCertificates,
         writeSignedInt(writeBuffer, 32));
@@ -127,8 +119,10 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
     writeComplexTypeArrayField(
         "clientSoftwareCertificates", clientSoftwareCertificates, writeBuffer);
 
-    // Simple Field (noOfLocaleIds)
-    writeSimpleField("noOfLocaleIds", noOfLocaleIds, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfLocaleIds) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfLocaleIds = (int) ((((getLocaleIds()) == (null)) ? -(1) : COUNT(getLocaleIds())));
+    writeImplicitField("noOfLocaleIds", noOfLocaleIds, writeSignedInt(writeBuffer, 32));
 
     // Array Field (localeIds)
     writeComplexTypeArrayField("localeIds", localeIds, writeBuffer);
@@ -159,19 +153,19 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
     // Simple field (clientSignature)
     lengthInBits += clientSignature.getLengthInBits();
 
-    // Simple field (noOfClientSoftwareCertificates)
+    // Implicit Field (noOfClientSoftwareCertificates)
     lengthInBits += 32;
 
     // Array field
     if (clientSoftwareCertificates != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : clientSoftwareCertificates) {
+      for (SignedSoftwareCertificate element : clientSoftwareCertificates) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= clientSoftwareCertificates.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfLocaleIds)
+    // Implicit Field (noOfLocaleIds)
     lengthInBits += 32;
 
     // Array field
@@ -193,37 +187,41 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ActivateSessionRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
-    ExtensionObjectDefinition clientSignature =
+    SignatureData clientSignature =
         readSimpleField(
             "clientSignature",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("458")),
+                () ->
+                    (SignatureData) ExtensionObjectDefinition.staticParse(readBuffer, (int) (458)),
                 readBuffer));
 
     int noOfClientSoftwareCertificates =
-        readSimpleField("noOfClientSoftwareCertificates", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfClientSoftwareCertificates", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> clientSoftwareCertificates =
+    List<SignedSoftwareCertificate> clientSoftwareCertificates =
         readCountArrayField(
             "clientSoftwareCertificates",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("346")),
+                () ->
+                    (SignedSoftwareCertificate)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (346)),
                 readBuffer),
             noOfClientSoftwareCertificates);
 
-    int noOfLocaleIds = readSimpleField("noOfLocaleIds", readSignedInt(readBuffer, 32));
+    int noOfLocaleIds = readImplicitField("noOfLocaleIds", readSignedInt(readBuffer, 32));
 
     List<PascalString> localeIds =
         readCountArrayField(
@@ -237,11 +235,12 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
             readComplex(
                 () -> ExtensionObject.staticParse(readBuffer, (boolean) (true)), readBuffer));
 
-    ExtensionObjectDefinition userTokenSignature =
+    SignatureData userTokenSignature =
         readSimpleField(
             "userTokenSignature",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("458")),
+                () ->
+                    (SignatureData) ExtensionObjectDefinition.staticParse(readBuffer, (int) (458)),
                 readBuffer));
 
     readBuffer.closeContext("ActivateSessionRequest");
@@ -249,9 +248,7 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
     return new ActivateSessionRequestBuilderImpl(
         requestHeader,
         clientSignature,
-        noOfClientSoftwareCertificates,
         clientSoftwareCertificates,
-        noOfLocaleIds,
         localeIds,
         userIdentityToken,
         userTokenSignature);
@@ -259,29 +256,23 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
 
   public static class ActivateSessionRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
-    private final ExtensionObjectDefinition clientSignature;
-    private final int noOfClientSoftwareCertificates;
-    private final List<ExtensionObjectDefinition> clientSoftwareCertificates;
-    private final int noOfLocaleIds;
+    private final RequestHeader requestHeader;
+    private final SignatureData clientSignature;
+    private final List<SignedSoftwareCertificate> clientSoftwareCertificates;
     private final List<PascalString> localeIds;
     private final ExtensionObject userIdentityToken;
-    private final ExtensionObjectDefinition userTokenSignature;
+    private final SignatureData userTokenSignature;
 
     public ActivateSessionRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
-        ExtensionObjectDefinition clientSignature,
-        int noOfClientSoftwareCertificates,
-        List<ExtensionObjectDefinition> clientSoftwareCertificates,
-        int noOfLocaleIds,
+        RequestHeader requestHeader,
+        SignatureData clientSignature,
+        List<SignedSoftwareCertificate> clientSoftwareCertificates,
         List<PascalString> localeIds,
         ExtensionObject userIdentityToken,
-        ExtensionObjectDefinition userTokenSignature) {
+        SignatureData userTokenSignature) {
       this.requestHeader = requestHeader;
       this.clientSignature = clientSignature;
-      this.noOfClientSoftwareCertificates = noOfClientSoftwareCertificates;
       this.clientSoftwareCertificates = clientSoftwareCertificates;
-      this.noOfLocaleIds = noOfLocaleIds;
       this.localeIds = localeIds;
       this.userIdentityToken = userIdentityToken;
       this.userTokenSignature = userTokenSignature;
@@ -292,9 +283,7 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
           new ActivateSessionRequest(
               requestHeader,
               clientSignature,
-              noOfClientSoftwareCertificates,
               clientSoftwareCertificates,
-              noOfLocaleIds,
               localeIds,
               userIdentityToken,
               userTokenSignature);
@@ -313,9 +302,7 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
     ActivateSessionRequest that = (ActivateSessionRequest) o;
     return (getRequestHeader() == that.getRequestHeader())
         && (getClientSignature() == that.getClientSignature())
-        && (getNoOfClientSoftwareCertificates() == that.getNoOfClientSoftwareCertificates())
         && (getClientSoftwareCertificates() == that.getClientSoftwareCertificates())
-        && (getNoOfLocaleIds() == that.getNoOfLocaleIds())
         && (getLocaleIds() == that.getLocaleIds())
         && (getUserIdentityToken() == that.getUserIdentityToken())
         && (getUserTokenSignature() == that.getUserTokenSignature())
@@ -329,9 +316,7 @@ public class ActivateSessionRequest extends ExtensionObjectDefinition implements
         super.hashCode(),
         getRequestHeader(),
         getClientSignature(),
-        getNoOfClientSoftwareCertificates(),
         getClientSoftwareCertificates(),
-        getNoOfLocaleIds(),
         getLocaleIds(),
         getUserIdentityToken(),
         getUserTokenSignature());
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionResponse.java
index 199bc61686..7e9f4cb156 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ActivateSessionResponse.java
@@ -38,35 +38,29 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ActivateSessionResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "470";
+  public Integer getExtensionId() {
+    return (int) 470;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
+  protected final ResponseHeader responseHeader;
   protected final PascalByteString serverNonce;
-  protected final int noOfResults;
   protected final List<StatusCode> results;
-  protected final int noOfDiagnosticInfos;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public ActivateSessionResponse(
-      ExtensionObjectDefinition responseHeader,
+      ResponseHeader responseHeader,
       PascalByteString serverNonce,
-      int noOfResults,
       List<StatusCode> results,
-      int noOfDiagnosticInfos,
       List<DiagnosticInfo> diagnosticInfos) {
     super();
     this.responseHeader = responseHeader;
     this.serverNonce = serverNonce;
-    this.noOfResults = noOfResults;
     this.results = results;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
@@ -74,18 +68,10 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
     return serverNonce;
   }
 
-  public int getNoOfResults() {
-    return noOfResults;
-  }
-
   public List<StatusCode> getResults() {
     return results;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -103,14 +89,19 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
     // Simple Field (serverNonce)
     writeSimpleField("serverNonce", serverNonce, writeComplex(writeBuffer));
 
-    // Simple Field (noOfResults)
-    writeSimpleField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfResults = (int) ((((getResults()) == (null)) ? -(1) : COUNT(getResults())));
+    writeImplicitField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (results)
     writeComplexTypeArrayField("results", results, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -135,7 +126,7 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
     // Simple field (serverNonce)
     lengthInBits += serverNonce.getLengthInBits();
 
-    // Simple field (noOfResults)
+    // Implicit Field (noOfResults)
     lengthInBits += 32;
 
     // Array field
@@ -147,7 +138,7 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -163,23 +154,24 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ActivateSessionResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
     PascalByteString serverNonce =
         readSimpleField(
             "serverNonce", readComplex(() -> PascalByteString.staticParse(readBuffer), readBuffer));
 
-    int noOfResults = readSimpleField("noOfResults", readSignedInt(readBuffer, 32));
+    int noOfResults = readImplicitField("noOfResults", readSignedInt(readBuffer, 32));
 
     List<StatusCode> results =
         readCountArrayField(
@@ -187,7 +179,8 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
             readComplex(() -> StatusCode.staticParse(readBuffer), readBuffer),
             noOfResults);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -198,42 +191,30 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
     readBuffer.closeContext("ActivateSessionResponse");
     // Create the instance
     return new ActivateSessionResponseBuilderImpl(
-        responseHeader, serverNonce, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+        responseHeader, serverNonce, results, diagnosticInfos);
   }
 
   public static class ActivateSessionResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
+    private final ResponseHeader responseHeader;
     private final PascalByteString serverNonce;
-    private final int noOfResults;
     private final List<StatusCode> results;
-    private final int noOfDiagnosticInfos;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public ActivateSessionResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
+        ResponseHeader responseHeader,
         PascalByteString serverNonce,
-        int noOfResults,
         List<StatusCode> results,
-        int noOfDiagnosticInfos,
         List<DiagnosticInfo> diagnosticInfos) {
       this.responseHeader = responseHeader;
       this.serverNonce = serverNonce;
-      this.noOfResults = noOfResults;
       this.results = results;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public ActivateSessionResponse build() {
       ActivateSessionResponse activateSessionResponse =
-          new ActivateSessionResponse(
-              responseHeader,
-              serverNonce,
-              noOfResults,
-              results,
-              noOfDiagnosticInfos,
-              diagnosticInfos);
+          new ActivateSessionResponse(responseHeader, serverNonce, results, diagnosticInfos);
       return activateSessionResponse;
     }
   }
@@ -249,9 +230,7 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
     ActivateSessionResponse that = (ActivateSessionResponse) o;
     return (getResponseHeader() == that.getResponseHeader())
         && (getServerNonce() == that.getServerNonce())
-        && (getNoOfResults() == that.getNoOfResults())
         && (getResults() == that.getResults())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -263,9 +242,7 @@ public class ActivateSessionResponse extends ExtensionObjectDefinition implement
         super.hashCode(),
         getResponseHeader(),
         getServerNonce(),
-        getNoOfResults(),
         getResults(),
-        getNoOfDiagnosticInfos(),
         getDiagnosticInfos());
   }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesItem.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesItem.java
index 890f29c603..90d7fec563 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesItem.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesItem.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AddNodesItem extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "378";
+  public Integer getExtensionId() {
+    return (int) 378;
   }
 
   // Properties.
@@ -168,7 +168,7 @@ public class AddNodesItem extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AddNodesItem");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesRequest.java
index df2265caed..58effce83d 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesRequest.java
@@ -38,34 +38,25 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AddNodesRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "488";
+  public Integer getExtensionId() {
+    return (int) 488;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
-  protected final int noOfNodesToAdd;
-  protected final List<ExtensionObjectDefinition> nodesToAdd;
-
-  public AddNodesRequest(
-      ExtensionObjectDefinition requestHeader,
-      int noOfNodesToAdd,
-      List<ExtensionObjectDefinition> nodesToAdd) {
+  protected final RequestHeader requestHeader;
+  protected final List<AddNodesItem> nodesToAdd;
+
+  public AddNodesRequest(RequestHeader requestHeader, List<AddNodesItem> nodesToAdd) {
     super();
     this.requestHeader = requestHeader;
-    this.noOfNodesToAdd = noOfNodesToAdd;
     this.nodesToAdd = nodesToAdd;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
-  public int getNoOfNodesToAdd() {
-    return noOfNodesToAdd;
-  }
-
-  public List<ExtensionObjectDefinition> getNodesToAdd() {
+  public List<AddNodesItem> getNodesToAdd() {
     return nodesToAdd;
   }
 
@@ -79,8 +70,10 @@ public class AddNodesRequest extends ExtensionObjectDefinition implements Messag
     // Simple Field (requestHeader)
     writeSimpleField("requestHeader", requestHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfNodesToAdd)
-    writeSimpleField("noOfNodesToAdd", noOfNodesToAdd, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfNodesToAdd) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfNodesToAdd = (int) ((((getNodesToAdd()) == (null)) ? -(1) : COUNT(getNodesToAdd())));
+    writeImplicitField("noOfNodesToAdd", noOfNodesToAdd, writeSignedInt(writeBuffer, 32));
 
     // Array Field (nodesToAdd)
     writeComplexTypeArrayField("nodesToAdd", nodesToAdd, writeBuffer);
@@ -102,13 +95,13 @@ public class AddNodesRequest extends ExtensionObjectDefinition implements Messag
     // Simple field (requestHeader)
     lengthInBits += requestHeader.getLengthInBits();
 
-    // Simple field (noOfNodesToAdd)
+    // Implicit Field (noOfNodesToAdd)
     lengthInBits += 32;
 
     // Array field
     if (nodesToAdd != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : nodesToAdd) {
+      for (AddNodesItem element : nodesToAdd) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= nodesToAdd.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -118,51 +111,46 @@ public class AddNodesRequest extends ExtensionObjectDefinition implements Messag
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AddNodesRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
-    int noOfNodesToAdd = readSimpleField("noOfNodesToAdd", readSignedInt(readBuffer, 32));
+    int noOfNodesToAdd = readImplicitField("noOfNodesToAdd", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> nodesToAdd =
+    List<AddNodesItem> nodesToAdd =
         readCountArrayField(
             "nodesToAdd",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("378")),
+                () -> (AddNodesItem) ExtensionObjectDefinition.staticParse(readBuffer, (int) (378)),
                 readBuffer),
             noOfNodesToAdd);
 
     readBuffer.closeContext("AddNodesRequest");
     // Create the instance
-    return new AddNodesRequestBuilderImpl(requestHeader, noOfNodesToAdd, nodesToAdd);
+    return new AddNodesRequestBuilderImpl(requestHeader, nodesToAdd);
   }
 
   public static class AddNodesRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
-    private final int noOfNodesToAdd;
-    private final List<ExtensionObjectDefinition> nodesToAdd;
-
-    public AddNodesRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
-        int noOfNodesToAdd,
-        List<ExtensionObjectDefinition> nodesToAdd) {
+    private final RequestHeader requestHeader;
+    private final List<AddNodesItem> nodesToAdd;
+
+    public AddNodesRequestBuilderImpl(RequestHeader requestHeader, List<AddNodesItem> nodesToAdd) {
       this.requestHeader = requestHeader;
-      this.noOfNodesToAdd = noOfNodesToAdd;
       this.nodesToAdd = nodesToAdd;
     }
 
     public AddNodesRequest build() {
-      AddNodesRequest addNodesRequest =
-          new AddNodesRequest(requestHeader, noOfNodesToAdd, nodesToAdd);
+      AddNodesRequest addNodesRequest = new AddNodesRequest(requestHeader, nodesToAdd);
       return addNodesRequest;
     }
   }
@@ -177,7 +165,6 @@ public class AddNodesRequest extends ExtensionObjectDefinition implements Messag
     }
     AddNodesRequest that = (AddNodesRequest) o;
     return (getRequestHeader() == that.getRequestHeader())
-        && (getNoOfNodesToAdd() == that.getNoOfNodesToAdd())
         && (getNodesToAdd() == that.getNodesToAdd())
         && super.equals(that)
         && true;
@@ -185,7 +172,7 @@ public class AddNodesRequest extends ExtensionObjectDefinition implements Messag
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getRequestHeader(), getNoOfNodesToAdd(), getNodesToAdd());
+    return Objects.hash(super.hashCode(), getRequestHeader(), getNodesToAdd());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResponse.java
index 8c8320541c..5e36de4514 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResponse.java
@@ -38,47 +38,33 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AddNodesResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "491";
+  public Integer getExtensionId() {
+    return (int) 491;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
-  protected final int noOfResults;
-  protected final List<ExtensionObjectDefinition> results;
-  protected final int noOfDiagnosticInfos;
+  protected final ResponseHeader responseHeader;
+  protected final List<AddNodesResult> results;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public AddNodesResponse(
-      ExtensionObjectDefinition responseHeader,
-      int noOfResults,
-      List<ExtensionObjectDefinition> results,
-      int noOfDiagnosticInfos,
+      ResponseHeader responseHeader,
+      List<AddNodesResult> results,
       List<DiagnosticInfo> diagnosticInfos) {
     super();
     this.responseHeader = responseHeader;
-    this.noOfResults = noOfResults;
     this.results = results;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
-  public int getNoOfResults() {
-    return noOfResults;
-  }
-
-  public List<ExtensionObjectDefinition> getResults() {
+  public List<AddNodesResult> getResults() {
     return results;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -93,14 +79,19 @@ public class AddNodesResponse extends ExtensionObjectDefinition implements Messa
     // Simple Field (responseHeader)
     writeSimpleField("responseHeader", responseHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfResults)
-    writeSimpleField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfResults = (int) ((((getResults()) == (null)) ? -(1) : COUNT(getResults())));
+    writeImplicitField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (results)
     writeComplexTypeArrayField("results", results, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -122,19 +113,19 @@ public class AddNodesResponse extends ExtensionObjectDefinition implements Messa
     // Simple field (responseHeader)
     lengthInBits += responseHeader.getLengthInBits();
 
-    // Simple field (noOfResults)
+    // Implicit Field (noOfResults)
     lengthInBits += 32;
 
     // Array field
     if (results != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : results) {
+      for (AddNodesResult element : results) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= results.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -150,29 +141,32 @@ public class AddNodesResponse extends ExtensionObjectDefinition implements Messa
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AddNodesResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
-    int noOfResults = readSimpleField("noOfResults", readSignedInt(readBuffer, 32));
+    int noOfResults = readImplicitField("noOfResults", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> results =
+    List<AddNodesResult> results =
         readCountArrayField(
             "results",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("485")),
+                () ->
+                    (AddNodesResult) ExtensionObjectDefinition.staticParse(readBuffer, (int) (485)),
                 readBuffer),
             noOfResults);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -182,35 +176,27 @@ public class AddNodesResponse extends ExtensionObjectDefinition implements Messa
 
     readBuffer.closeContext("AddNodesResponse");
     // Create the instance
-    return new AddNodesResponseBuilderImpl(
-        responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+    return new AddNodesResponseBuilderImpl(responseHeader, results, diagnosticInfos);
   }
 
   public static class AddNodesResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
-    private final int noOfResults;
-    private final List<ExtensionObjectDefinition> results;
-    private final int noOfDiagnosticInfos;
+    private final ResponseHeader responseHeader;
+    private final List<AddNodesResult> results;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public AddNodesResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
-        int noOfResults,
-        List<ExtensionObjectDefinition> results,
-        int noOfDiagnosticInfos,
+        ResponseHeader responseHeader,
+        List<AddNodesResult> results,
         List<DiagnosticInfo> diagnosticInfos) {
       this.responseHeader = responseHeader;
-      this.noOfResults = noOfResults;
       this.results = results;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public AddNodesResponse build() {
       AddNodesResponse addNodesResponse =
-          new AddNodesResponse(
-              responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+          new AddNodesResponse(responseHeader, results, diagnosticInfos);
       return addNodesResponse;
     }
   }
@@ -225,9 +211,7 @@ public class AddNodesResponse extends ExtensionObjectDefinition implements Messa
     }
     AddNodesResponse that = (AddNodesResponse) o;
     return (getResponseHeader() == that.getResponseHeader())
-        && (getNoOfResults() == that.getNoOfResults())
         && (getResults() == that.getResults())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -235,13 +219,7 @@ public class AddNodesResponse extends ExtensionObjectDefinition implements Messa
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getResponseHeader(),
-        getNoOfResults(),
-        getResults(),
-        getNoOfDiagnosticInfos(),
-        getDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getResponseHeader(), getResults(), getDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResult.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResult.java
index aef84880de..54f1fce7a0 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResult.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddNodesResult.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AddNodesResult extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "485";
+  public Integer getExtensionId() {
+    return (int) 485;
   }
 
   // Properties.
@@ -97,7 +97,7 @@ public class AddNodesResult extends ExtensionObjectDefinition implements Message
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AddNodesResult");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesItem.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesItem.java
index 8f31e626ef..709483b9b9 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesItem.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesItem.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AddReferencesItem extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "381";
+  public Integer getExtensionId() {
+    return (int) 381;
   }
 
   // Properties.
@@ -161,7 +161,7 @@ public class AddReferencesItem extends ExtensionObjectDefinition implements Mess
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AddReferencesItem");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesRequest.java
index 3a3c3b9674..770c6e9261 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesRequest.java
@@ -38,34 +38,26 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AddReferencesRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "494";
+  public Integer getExtensionId() {
+    return (int) 494;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
-  protected final int noOfReferencesToAdd;
-  protected final List<ExtensionObjectDefinition> referencesToAdd;
+  protected final RequestHeader requestHeader;
+  protected final List<AddReferencesItem> referencesToAdd;
 
   public AddReferencesRequest(
-      ExtensionObjectDefinition requestHeader,
-      int noOfReferencesToAdd,
-      List<ExtensionObjectDefinition> referencesToAdd) {
+      RequestHeader requestHeader, List<AddReferencesItem> referencesToAdd) {
     super();
     this.requestHeader = requestHeader;
-    this.noOfReferencesToAdd = noOfReferencesToAdd;
     this.referencesToAdd = referencesToAdd;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
-  public int getNoOfReferencesToAdd() {
-    return noOfReferencesToAdd;
-  }
-
-  public List<ExtensionObjectDefinition> getReferencesToAdd() {
+  public List<AddReferencesItem> getReferencesToAdd() {
     return referencesToAdd;
   }
 
@@ -79,8 +71,11 @@ public class AddReferencesRequest extends ExtensionObjectDefinition implements M
     // Simple Field (requestHeader)
     writeSimpleField("requestHeader", requestHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfReferencesToAdd)
-    writeSimpleField("noOfReferencesToAdd", noOfReferencesToAdd, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfReferencesToAdd) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfReferencesToAdd =
+        (int) ((((getReferencesToAdd()) == (null)) ? -(1) : COUNT(getReferencesToAdd())));
+    writeImplicitField("noOfReferencesToAdd", noOfReferencesToAdd, writeSignedInt(writeBuffer, 32));
 
     // Array Field (referencesToAdd)
     writeComplexTypeArrayField("referencesToAdd", referencesToAdd, writeBuffer);
@@ -102,13 +97,13 @@ public class AddReferencesRequest extends ExtensionObjectDefinition implements M
     // Simple field (requestHeader)
     lengthInBits += requestHeader.getLengthInBits();
 
-    // Simple field (noOfReferencesToAdd)
+    // Implicit Field (noOfReferencesToAdd)
     lengthInBits += 32;
 
     // Array field
     if (referencesToAdd != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : referencesToAdd) {
+      for (AddReferencesItem element : referencesToAdd) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= referencesToAdd.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -118,51 +113,51 @@ public class AddReferencesRequest extends ExtensionObjectDefinition implements M
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AddReferencesRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
-    int noOfReferencesToAdd = readSimpleField("noOfReferencesToAdd", readSignedInt(readBuffer, 32));
+    int noOfReferencesToAdd =
+        readImplicitField("noOfReferencesToAdd", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> referencesToAdd =
+    List<AddReferencesItem> referencesToAdd =
         readCountArrayField(
             "referencesToAdd",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("381")),
+                () ->
+                    (AddReferencesItem)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (381)),
                 readBuffer),
             noOfReferencesToAdd);
 
     readBuffer.closeContext("AddReferencesRequest");
     // Create the instance
-    return new AddReferencesRequestBuilderImpl(requestHeader, noOfReferencesToAdd, referencesToAdd);
+    return new AddReferencesRequestBuilderImpl(requestHeader, referencesToAdd);
   }
 
   public static class AddReferencesRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
-    private final int noOfReferencesToAdd;
-    private final List<ExtensionObjectDefinition> referencesToAdd;
+    private final RequestHeader requestHeader;
+    private final List<AddReferencesItem> referencesToAdd;
 
     public AddReferencesRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
-        int noOfReferencesToAdd,
-        List<ExtensionObjectDefinition> referencesToAdd) {
+        RequestHeader requestHeader, List<AddReferencesItem> referencesToAdd) {
       this.requestHeader = requestHeader;
-      this.noOfReferencesToAdd = noOfReferencesToAdd;
       this.referencesToAdd = referencesToAdd;
     }
 
     public AddReferencesRequest build() {
       AddReferencesRequest addReferencesRequest =
-          new AddReferencesRequest(requestHeader, noOfReferencesToAdd, referencesToAdd);
+          new AddReferencesRequest(requestHeader, referencesToAdd);
       return addReferencesRequest;
     }
   }
@@ -177,7 +172,6 @@ public class AddReferencesRequest extends ExtensionObjectDefinition implements M
     }
     AddReferencesRequest that = (AddReferencesRequest) o;
     return (getRequestHeader() == that.getRequestHeader())
-        && (getNoOfReferencesToAdd() == that.getNoOfReferencesToAdd())
         && (getReferencesToAdd() == that.getReferencesToAdd())
         && super.equals(that)
         && true;
@@ -185,8 +179,7 @@ public class AddReferencesRequest extends ExtensionObjectDefinition implements M
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(), getRequestHeader(), getNoOfReferencesToAdd(), getReferencesToAdd());
+    return Objects.hash(super.hashCode(), getRequestHeader(), getReferencesToAdd());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesResponse.java
index ffe897b616..9f34ad7395 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AddReferencesResponse.java
@@ -38,47 +38,33 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AddReferencesResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "497";
+  public Integer getExtensionId() {
+    return (int) 497;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
-  protected final int noOfResults;
+  protected final ResponseHeader responseHeader;
   protected final List<StatusCode> results;
-  protected final int noOfDiagnosticInfos;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public AddReferencesResponse(
-      ExtensionObjectDefinition responseHeader,
-      int noOfResults,
+      ResponseHeader responseHeader,
       List<StatusCode> results,
-      int noOfDiagnosticInfos,
       List<DiagnosticInfo> diagnosticInfos) {
     super();
     this.responseHeader = responseHeader;
-    this.noOfResults = noOfResults;
     this.results = results;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
-  public int getNoOfResults() {
-    return noOfResults;
-  }
-
   public List<StatusCode> getResults() {
     return results;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -93,14 +79,19 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
     // Simple Field (responseHeader)
     writeSimpleField("responseHeader", responseHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfResults)
-    writeSimpleField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfResults = (int) ((((getResults()) == (null)) ? -(1) : COUNT(getResults())));
+    writeImplicitField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (results)
     writeComplexTypeArrayField("results", results, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -122,7 +113,7 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
     // Simple field (responseHeader)
     lengthInBits += responseHeader.getLengthInBits();
 
-    // Simple field (noOfResults)
+    // Implicit Field (noOfResults)
     lengthInBits += 32;
 
     // Array field
@@ -134,7 +125,7 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -150,19 +141,20 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AddReferencesResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
-    int noOfResults = readSimpleField("noOfResults", readSignedInt(readBuffer, 32));
+    int noOfResults = readImplicitField("noOfResults", readSignedInt(readBuffer, 32));
 
     List<StatusCode> results =
         readCountArrayField(
@@ -170,7 +162,8 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
             readComplex(() -> StatusCode.staticParse(readBuffer), readBuffer),
             noOfResults);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -180,35 +173,27 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
 
     readBuffer.closeContext("AddReferencesResponse");
     // Create the instance
-    return new AddReferencesResponseBuilderImpl(
-        responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+    return new AddReferencesResponseBuilderImpl(responseHeader, results, diagnosticInfos);
   }
 
   public static class AddReferencesResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
-    private final int noOfResults;
+    private final ResponseHeader responseHeader;
     private final List<StatusCode> results;
-    private final int noOfDiagnosticInfos;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public AddReferencesResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
-        int noOfResults,
+        ResponseHeader responseHeader,
         List<StatusCode> results,
-        int noOfDiagnosticInfos,
         List<DiagnosticInfo> diagnosticInfos) {
       this.responseHeader = responseHeader;
-      this.noOfResults = noOfResults;
       this.results = results;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public AddReferencesResponse build() {
       AddReferencesResponse addReferencesResponse =
-          new AddReferencesResponse(
-              responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+          new AddReferencesResponse(responseHeader, results, diagnosticInfos);
       return addReferencesResponse;
     }
   }
@@ -223,9 +208,7 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
     }
     AddReferencesResponse that = (AddReferencesResponse) o;
     return (getResponseHeader() == that.getResponseHeader())
-        && (getNoOfResults() == that.getNoOfResults())
         && (getResults() == that.getResults())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -233,13 +216,7 @@ public class AddReferencesResponse extends ExtensionObjectDefinition implements
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getResponseHeader(),
-        getNoOfResults(),
-        getResults(),
-        getNoOfDiagnosticInfos(),
-        getDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getResponseHeader(), getResults(), getDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AdditionalParametersType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AdditionalParametersType.java
index 094fa267f0..764a5c1e09 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AdditionalParametersType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AdditionalParametersType.java
@@ -38,25 +38,19 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AdditionalParametersType extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "16315";
+  public Integer getExtensionId() {
+    return (int) 16315;
   }
 
   // Properties.
-  protected final int noOfParameters;
-  protected final List<ExtensionObjectDefinition> parameters;
+  protected final List<KeyValuePair> parameters;
 
-  public AdditionalParametersType(int noOfParameters, List<ExtensionObjectDefinition> parameters) {
+  public AdditionalParametersType(List<KeyValuePair> parameters) {
     super();
-    this.noOfParameters = noOfParameters;
     this.parameters = parameters;
   }
 
-  public int getNoOfParameters() {
-    return noOfParameters;
-  }
-
-  public List<ExtensionObjectDefinition> getParameters() {
+  public List<KeyValuePair> getParameters() {
     return parameters;
   }
 
@@ -67,8 +61,10 @@ public class AdditionalParametersType extends ExtensionObjectDefinition implemen
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     writeBuffer.pushContext("AdditionalParametersType");
 
-    // Simple Field (noOfParameters)
-    writeSimpleField("noOfParameters", noOfParameters, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfParameters) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfParameters = (int) ((((getParameters()) == (null)) ? -(1) : COUNT(getParameters())));
+    writeImplicitField("noOfParameters", noOfParameters, writeSignedInt(writeBuffer, 32));
 
     // Array Field (parameters)
     writeComplexTypeArrayField("parameters", parameters, writeBuffer);
@@ -87,13 +83,13 @@ public class AdditionalParametersType extends ExtensionObjectDefinition implemen
     AdditionalParametersType _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (noOfParameters)
+    // Implicit Field (noOfParameters)
     lengthInBits += 32;
 
     // Array field
     if (parameters != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : parameters) {
+      for (KeyValuePair element : parameters) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= parameters.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -103,40 +99,37 @@ public class AdditionalParametersType extends ExtensionObjectDefinition implemen
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AdditionalParametersType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int noOfParameters = readSimpleField("noOfParameters", readSignedInt(readBuffer, 32));
+    int noOfParameters = readImplicitField("noOfParameters", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> parameters =
+    List<KeyValuePair> parameters =
         readCountArrayField(
             "parameters",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("14535")),
+                () ->
+                    (KeyValuePair) ExtensionObjectDefinition.staticParse(readBuffer, (int) (14535)),
                 readBuffer),
             noOfParameters);
 
     readBuffer.closeContext("AdditionalParametersType");
     // Create the instance
-    return new AdditionalParametersTypeBuilderImpl(noOfParameters, parameters);
+    return new AdditionalParametersTypeBuilderImpl(parameters);
   }
 
   public static class AdditionalParametersTypeBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final int noOfParameters;
-    private final List<ExtensionObjectDefinition> parameters;
+    private final List<KeyValuePair> parameters;
 
-    public AdditionalParametersTypeBuilderImpl(
-        int noOfParameters, List<ExtensionObjectDefinition> parameters) {
-      this.noOfParameters = noOfParameters;
+    public AdditionalParametersTypeBuilderImpl(List<KeyValuePair> parameters) {
       this.parameters = parameters;
     }
 
     public AdditionalParametersType build() {
-      AdditionalParametersType additionalParametersType =
-          new AdditionalParametersType(noOfParameters, parameters);
+      AdditionalParametersType additionalParametersType = new AdditionalParametersType(parameters);
       return additionalParametersType;
     }
   }
@@ -150,15 +143,12 @@ public class AdditionalParametersType extends ExtensionObjectDefinition implemen
       return false;
     }
     AdditionalParametersType that = (AdditionalParametersType) o;
-    return (getNoOfParameters() == that.getNoOfParameters())
-        && (getParameters() == that.getParameters())
-        && super.equals(that)
-        && true;
+    return (getParameters() == that.getParameters()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getNoOfParameters(), getParameters());
+    return Objects.hash(super.hashCode(), getParameters());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateConfiguration.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateConfiguration.java
index c3c865b96d..ac8ab8a28f 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateConfiguration.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateConfiguration.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AggregateConfiguration extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "950";
+  public Integer getExtensionId() {
+    return (int) 950;
   }
 
   // Properties.
@@ -151,7 +151,7 @@ public class AggregateConfiguration extends ExtensionObjectDefinition implements
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AggregateConfiguration");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateFilter.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateFilter.java
new file mode 100644
index 0000000000..8382d9bdd7
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateFilter.java
@@ -0,0 +1,218 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class AggregateFilter extends ExtensionObjectDefinition implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getExtensionId() {
+    return (int) 730;
+  }
+
+  // Properties.
+  protected final long startTime;
+  protected final NodeId aggregateType;
+  protected final double processingInterval;
+  protected final AggregateConfiguration aggregateConfiguration;
+
+  public AggregateFilter(
+      long startTime,
+      NodeId aggregateType,
+      double processingInterval,
+      AggregateConfiguration aggregateConfiguration) {
+    super();
+    this.startTime = startTime;
+    this.aggregateType = aggregateType;
+    this.processingInterval = processingInterval;
+    this.aggregateConfiguration = aggregateConfiguration;
+  }
+
+  public long getStartTime() {
+    return startTime;
+  }
+
+  public NodeId getAggregateType() {
+    return aggregateType;
+  }
+
+  public double getProcessingInterval() {
+    return processingInterval;
+  }
+
+  public AggregateConfiguration getAggregateConfiguration() {
+    return aggregateConfiguration;
+  }
+
+  @Override
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AggregateFilter");
+
+    // Simple Field (startTime)
+    writeSimpleField("startTime", startTime, writeSignedLong(writeBuffer, 64));
+
+    // Simple Field (aggregateType)
+    writeSimpleField("aggregateType", aggregateType, writeComplex(writeBuffer));
+
+    // Simple Field (processingInterval)
+    writeSimpleField("processingInterval", processingInterval, writeDouble(writeBuffer, 64));
+
+    // Simple Field (aggregateConfiguration)
+    writeSimpleField("aggregateConfiguration", aggregateConfiguration, writeComplex(writeBuffer));
+
+    writeBuffer.popContext("AggregateFilter");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    AggregateFilter _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (startTime)
+    lengthInBits += 64;
+
+    // Simple field (aggregateType)
+    lengthInBits += aggregateType.getLengthInBits();
+
+    // Simple field (processingInterval)
+    lengthInBits += 64;
+
+    // Simple field (aggregateConfiguration)
+    lengthInBits += aggregateConfiguration.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("AggregateFilter");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    long startTime = readSimpleField("startTime", readSignedLong(readBuffer, 64));
+
+    NodeId aggregateType =
+        readSimpleField(
+            "aggregateType", readComplex(() -> NodeId.staticParse(readBuffer), readBuffer));
+
+    double processingInterval = readSimpleField("processingInterval", readDouble(readBuffer, 64));
+
+    AggregateConfiguration aggregateConfiguration =
+        readSimpleField(
+            "aggregateConfiguration",
+            readComplex(
+                () ->
+                    (AggregateConfiguration)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (950)),
+                readBuffer));
+
+    readBuffer.closeContext("AggregateFilter");
+    // Create the instance
+    return new AggregateFilterBuilderImpl(
+        startTime, aggregateType, processingInterval, aggregateConfiguration);
+  }
+
+  public static class AggregateFilterBuilderImpl
+      implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
+    private final long startTime;
+    private final NodeId aggregateType;
+    private final double processingInterval;
+    private final AggregateConfiguration aggregateConfiguration;
+
+    public AggregateFilterBuilderImpl(
+        long startTime,
+        NodeId aggregateType,
+        double processingInterval,
+        AggregateConfiguration aggregateConfiguration) {
+      this.startTime = startTime;
+      this.aggregateType = aggregateType;
+      this.processingInterval = processingInterval;
+      this.aggregateConfiguration = aggregateConfiguration;
+    }
+
+    public AggregateFilter build() {
+      AggregateFilter aggregateFilter =
+          new AggregateFilter(startTime, aggregateType, processingInterval, aggregateConfiguration);
+      return aggregateFilter;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AggregateFilter)) {
+      return false;
+    }
+    AggregateFilter that = (AggregateFilter) o;
+    return (getStartTime() == that.getStartTime())
+        && (getAggregateType() == that.getAggregateType())
+        && (getProcessingInterval() == that.getProcessingInterval())
+        && (getAggregateConfiguration() == that.getAggregateConfiguration())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getStartTime(),
+        getAggregateType(),
+        getProcessingInterval(),
+        getAggregateConfiguration());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateFilterResult.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateFilterResult.java
new file mode 100644
index 0000000000..b7c2a5d2df
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AggregateFilterResult.java
@@ -0,0 +1,200 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class AggregateFilterResult extends ExtensionObjectDefinition implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getExtensionId() {
+    return (int) 739;
+  }
+
+  // Properties.
+  protected final long revisedStartTime;
+  protected final double revisedProcessingInterval;
+  protected final AggregateConfiguration revisedAggregateConfiguration;
+
+  public AggregateFilterResult(
+      long revisedStartTime,
+      double revisedProcessingInterval,
+      AggregateConfiguration revisedAggregateConfiguration) {
+    super();
+    this.revisedStartTime = revisedStartTime;
+    this.revisedProcessingInterval = revisedProcessingInterval;
+    this.revisedAggregateConfiguration = revisedAggregateConfiguration;
+  }
+
+  public long getRevisedStartTime() {
+    return revisedStartTime;
+  }
+
+  public double getRevisedProcessingInterval() {
+    return revisedProcessingInterval;
+  }
+
+  public AggregateConfiguration getRevisedAggregateConfiguration() {
+    return revisedAggregateConfiguration;
+  }
+
+  @Override
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AggregateFilterResult");
+
+    // Simple Field (revisedStartTime)
+    writeSimpleField("revisedStartTime", revisedStartTime, writeSignedLong(writeBuffer, 64));
+
+    // Simple Field (revisedProcessingInterval)
+    writeSimpleField(
+        "revisedProcessingInterval", revisedProcessingInterval, writeDouble(writeBuffer, 64));
+
+    // Simple Field (revisedAggregateConfiguration)
+    writeSimpleField(
+        "revisedAggregateConfiguration", revisedAggregateConfiguration, writeComplex(writeBuffer));
+
+    writeBuffer.popContext("AggregateFilterResult");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    AggregateFilterResult _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (revisedStartTime)
+    lengthInBits += 64;
+
+    // Simple field (revisedProcessingInterval)
+    lengthInBits += 64;
+
+    // Simple field (revisedAggregateConfiguration)
+    lengthInBits += revisedAggregateConfiguration.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("AggregateFilterResult");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    long revisedStartTime = readSimpleField("revisedStartTime", readSignedLong(readBuffer, 64));
+
+    double revisedProcessingInterval =
+        readSimpleField("revisedProcessingInterval", readDouble(readBuffer, 64));
+
+    AggregateConfiguration revisedAggregateConfiguration =
+        readSimpleField(
+            "revisedAggregateConfiguration",
+            readComplex(
+                () ->
+                    (AggregateConfiguration)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (950)),
+                readBuffer));
+
+    readBuffer.closeContext("AggregateFilterResult");
+    // Create the instance
+    return new AggregateFilterResultBuilderImpl(
+        revisedStartTime, revisedProcessingInterval, revisedAggregateConfiguration);
+  }
+
+  public static class AggregateFilterResultBuilderImpl
+      implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
+    private final long revisedStartTime;
+    private final double revisedProcessingInterval;
+    private final AggregateConfiguration revisedAggregateConfiguration;
+
+    public AggregateFilterResultBuilderImpl(
+        long revisedStartTime,
+        double revisedProcessingInterval,
+        AggregateConfiguration revisedAggregateConfiguration) {
+      this.revisedStartTime = revisedStartTime;
+      this.revisedProcessingInterval = revisedProcessingInterval;
+      this.revisedAggregateConfiguration = revisedAggregateConfiguration;
+    }
+
+    public AggregateFilterResult build() {
+      AggregateFilterResult aggregateFilterResult =
+          new AggregateFilterResult(
+              revisedStartTime, revisedProcessingInterval, revisedAggregateConfiguration);
+      return aggregateFilterResult;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AggregateFilterResult)) {
+      return false;
+    }
+    AggregateFilterResult that = (AggregateFilterResult) o;
+    return (getRevisedStartTime() == that.getRevisedStartTime())
+        && (getRevisedProcessingInterval() == that.getRevisedProcessingInterval())
+        && (getRevisedAggregateConfiguration() == that.getRevisedAggregateConfiguration())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getRevisedStartTime(),
+        getRevisedProcessingInterval(),
+        getRevisedAggregateConfiguration());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AliasNameDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AliasNameDataType.java
index f573682709..74b2b09b54 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AliasNameDataType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AliasNameDataType.java
@@ -38,20 +38,17 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AliasNameDataType extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "23470";
+  public Integer getExtensionId() {
+    return (int) 23470;
   }
 
   // Properties.
   protected final QualifiedName aliasName;
-  protected final int noOfReferencedNodes;
   protected final List<ExpandedNodeId> referencedNodes;
 
-  public AliasNameDataType(
-      QualifiedName aliasName, int noOfReferencedNodes, List<ExpandedNodeId> referencedNodes) {
+  public AliasNameDataType(QualifiedName aliasName, List<ExpandedNodeId> referencedNodes) {
     super();
     this.aliasName = aliasName;
-    this.noOfReferencedNodes = noOfReferencedNodes;
     this.referencedNodes = referencedNodes;
   }
 
@@ -59,10 +56,6 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
     return aliasName;
   }
 
-  public int getNoOfReferencedNodes() {
-    return noOfReferencedNodes;
-  }
-
   public List<ExpandedNodeId> getReferencedNodes() {
     return referencedNodes;
   }
@@ -77,8 +70,11 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
     // Simple Field (aliasName)
     writeSimpleField("aliasName", aliasName, writeComplex(writeBuffer));
 
-    // Simple Field (noOfReferencedNodes)
-    writeSimpleField("noOfReferencedNodes", noOfReferencedNodes, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfReferencedNodes) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfReferencedNodes =
+        (int) ((((getReferencedNodes()) == (null)) ? -(1) : COUNT(getReferencedNodes())));
+    writeImplicitField("noOfReferencedNodes", noOfReferencedNodes, writeSignedInt(writeBuffer, 32));
 
     // Array Field (referencedNodes)
     writeComplexTypeArrayField("referencedNodes", referencedNodes, writeBuffer);
@@ -100,7 +96,7 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
     // Simple field (aliasName)
     lengthInBits += aliasName.getLengthInBits();
 
-    // Simple field (noOfReferencedNodes)
+    // Implicit Field (noOfReferencedNodes)
     lengthInBits += 32;
 
     // Array field
@@ -116,7 +112,7 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AliasNameDataType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -125,7 +121,8 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
         readSimpleField(
             "aliasName", readComplex(() -> QualifiedName.staticParse(readBuffer), readBuffer));
 
-    int noOfReferencedNodes = readSimpleField("noOfReferencedNodes", readSignedInt(readBuffer, 32));
+    int noOfReferencedNodes =
+        readImplicitField("noOfReferencedNodes", readSignedInt(readBuffer, 32));
 
     List<ExpandedNodeId> referencedNodes =
         readCountArrayField(
@@ -135,25 +132,22 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
 
     readBuffer.closeContext("AliasNameDataType");
     // Create the instance
-    return new AliasNameDataTypeBuilderImpl(aliasName, noOfReferencedNodes, referencedNodes);
+    return new AliasNameDataTypeBuilderImpl(aliasName, referencedNodes);
   }
 
   public static class AliasNameDataTypeBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final QualifiedName aliasName;
-    private final int noOfReferencedNodes;
     private final List<ExpandedNodeId> referencedNodes;
 
     public AliasNameDataTypeBuilderImpl(
-        QualifiedName aliasName, int noOfReferencedNodes, List<ExpandedNodeId> referencedNodes) {
+        QualifiedName aliasName, List<ExpandedNodeId> referencedNodes) {
       this.aliasName = aliasName;
-      this.noOfReferencedNodes = noOfReferencedNodes;
       this.referencedNodes = referencedNodes;
     }
 
     public AliasNameDataType build() {
-      AliasNameDataType aliasNameDataType =
-          new AliasNameDataType(aliasName, noOfReferencedNodes, referencedNodes);
+      AliasNameDataType aliasNameDataType = new AliasNameDataType(aliasName, referencedNodes);
       return aliasNameDataType;
     }
   }
@@ -168,7 +162,6 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
     }
     AliasNameDataType that = (AliasNameDataType) o;
     return (getAliasName() == that.getAliasName())
-        && (getNoOfReferencedNodes() == that.getNoOfReferencedNodes())
         && (getReferencedNodes() == that.getReferencedNodes())
         && super.equals(that)
         && true;
@@ -176,8 +169,7 @@ public class AliasNameDataType extends ExtensionObjectDefinition implements Mess
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(), getAliasName(), getNoOfReferencedNodes(), getReferencedNodes());
+    return Objects.hash(super.hashCode(), getAliasName(), getReferencedNodes());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Annotation.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Annotation.java
index 9639910274..52e71193b5 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Annotation.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Annotation.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class Annotation extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "893";
+  public Integer getExtensionId() {
+    return (int) 893;
   }
 
   // Properties.
@@ -109,7 +109,7 @@ public class Annotation extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("Annotation");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnnotationDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnnotationDataType.java
index c3c7bd7bdb..6edfb83d5d 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnnotationDataType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnnotationDataType.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AnnotationDataType extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "32436";
+  public Integer getExtensionId() {
+    return (int) 32436;
   }
 
   // Properties.
@@ -109,7 +109,7 @@ public class AnnotationDataType extends ExtensionObjectDefinition implements Mes
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AnnotationDataType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnonymousIdentityToken.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnonymousIdentityToken.java
index 688351e192..d16af5e391 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnonymousIdentityToken.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AnonymousIdentityToken.java
@@ -35,24 +35,35 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class AnonymousIdentityToken extends UserIdentityTokenDefinition implements Message {
+public class AnonymousIdentityToken extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "anonymous";
+  public Integer getExtensionId() {
+    return (int) 321;
   }
 
-  public AnonymousIdentityToken() {
+  // Properties.
+  protected final PascalString policyId;
+
+  public AnonymousIdentityToken(PascalString policyId) {
     super();
+    this.policyId = policyId;
+  }
+
+  public PascalString getPolicyId() {
+    return policyId;
   }
 
   @Override
-  protected void serializeUserIdentityTokenDefinitionChild(WriteBuffer writeBuffer)
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     writeBuffer.pushContext("AnonymousIdentityToken");
 
+    // Simple Field (policyId)
+    writeSimpleField("policyId", policyId, writeComplex(writeBuffer));
+
     writeBuffer.popContext("AnonymousIdentityToken");
   }
 
@@ -67,27 +78,37 @@ public class AnonymousIdentityToken extends UserIdentityTokenDefinition implemen
     AnonymousIdentityToken _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
+    // Simple field (policyId)
+    lengthInBits += policyId.getLengthInBits();
+
     return lengthInBits;
   }
 
-  public static UserIdentityTokenDefinitionBuilder staticParseUserIdentityTokenDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AnonymousIdentityToken");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
+    PascalString policyId =
+        readSimpleField(
+            "policyId", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
     readBuffer.closeContext("AnonymousIdentityToken");
     // Create the instance
-    return new AnonymousIdentityTokenBuilderImpl();
+    return new AnonymousIdentityTokenBuilderImpl(policyId);
   }
 
   public static class AnonymousIdentityTokenBuilderImpl
-      implements UserIdentityTokenDefinition.UserIdentityTokenDefinitionBuilder {
+      implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
+    private final PascalString policyId;
 
-    public AnonymousIdentityTokenBuilderImpl() {}
+    public AnonymousIdentityTokenBuilderImpl(PascalString policyId) {
+      this.policyId = policyId;
+    }
 
     public AnonymousIdentityToken build() {
-      AnonymousIdentityToken anonymousIdentityToken = new AnonymousIdentityToken();
+      AnonymousIdentityToken anonymousIdentityToken = new AnonymousIdentityToken(policyId);
       return anonymousIdentityToken;
     }
   }
@@ -101,12 +122,12 @@ public class AnonymousIdentityToken extends UserIdentityTokenDefinition implemen
       return false;
     }
     AnonymousIdentityToken that = (AnonymousIdentityToken) o;
-    return super.equals(that) && true;
+    return (getPolicyId() == that.getPolicyId()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(super.hashCode(), getPolicyId());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ApplicationDescription.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ApplicationDescription.java
index 84f78a103d..8b39898e21 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ApplicationDescription.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ApplicationDescription.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ApplicationDescription extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "310";
+  public Integer getExtensionId() {
+    return (int) 310;
   }
 
   // Properties.
@@ -49,7 +49,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
   protected final ApplicationType applicationType;
   protected final PascalString gatewayServerUri;
   protected final PascalString discoveryProfileUri;
-  protected final int noOfDiscoveryUrls;
   protected final List<PascalString> discoveryUrls;
 
   public ApplicationDescription(
@@ -59,7 +58,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
       ApplicationType applicationType,
       PascalString gatewayServerUri,
       PascalString discoveryProfileUri,
-      int noOfDiscoveryUrls,
       List<PascalString> discoveryUrls) {
     super();
     this.applicationUri = applicationUri;
@@ -68,7 +66,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
     this.applicationType = applicationType;
     this.gatewayServerUri = gatewayServerUri;
     this.discoveryProfileUri = discoveryProfileUri;
-    this.noOfDiscoveryUrls = noOfDiscoveryUrls;
     this.discoveryUrls = discoveryUrls;
   }
 
@@ -96,10 +93,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
     return discoveryProfileUri;
   }
 
-  public int getNoOfDiscoveryUrls() {
-    return noOfDiscoveryUrls;
-  }
-
   public List<PascalString> getDiscoveryUrls() {
     return discoveryUrls;
   }
@@ -134,8 +127,11 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
     // Simple Field (discoveryProfileUri)
     writeSimpleField("discoveryProfileUri", discoveryProfileUri, writeComplex(writeBuffer));
 
-    // Simple Field (noOfDiscoveryUrls)
-    writeSimpleField("noOfDiscoveryUrls", noOfDiscoveryUrls, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiscoveryUrls) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiscoveryUrls =
+        (int) ((((getDiscoveryUrls()) == (null)) ? -(1) : COUNT(getDiscoveryUrls())));
+    writeImplicitField("noOfDiscoveryUrls", noOfDiscoveryUrls, writeSignedInt(writeBuffer, 32));
 
     // Array Field (discoveryUrls)
     writeComplexTypeArrayField("discoveryUrls", discoveryUrls, writeBuffer);
@@ -172,7 +168,7 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
     // Simple field (discoveryProfileUri)
     lengthInBits += discoveryProfileUri.getLengthInBits();
 
-    // Simple field (noOfDiscoveryUrls)
+    // Implicit Field (noOfDiscoveryUrls)
     lengthInBits += 32;
 
     // Array field
@@ -188,7 +184,7 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ApplicationDescription");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -222,7 +218,7 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
             "discoveryProfileUri",
             readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
 
-    int noOfDiscoveryUrls = readSimpleField("noOfDiscoveryUrls", readSignedInt(readBuffer, 32));
+    int noOfDiscoveryUrls = readImplicitField("noOfDiscoveryUrls", readSignedInt(readBuffer, 32));
 
     List<PascalString> discoveryUrls =
         readCountArrayField(
@@ -239,7 +235,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
         applicationType,
         gatewayServerUri,
         discoveryProfileUri,
-        noOfDiscoveryUrls,
         discoveryUrls);
   }
 
@@ -251,7 +246,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
     private final ApplicationType applicationType;
     private final PascalString gatewayServerUri;
     private final PascalString discoveryProfileUri;
-    private final int noOfDiscoveryUrls;
     private final List<PascalString> discoveryUrls;
 
     public ApplicationDescriptionBuilderImpl(
@@ -261,7 +255,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
         ApplicationType applicationType,
         PascalString gatewayServerUri,
         PascalString discoveryProfileUri,
-        int noOfDiscoveryUrls,
         List<PascalString> discoveryUrls) {
       this.applicationUri = applicationUri;
       this.productUri = productUri;
@@ -269,7 +262,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
       this.applicationType = applicationType;
       this.gatewayServerUri = gatewayServerUri;
       this.discoveryProfileUri = discoveryProfileUri;
-      this.noOfDiscoveryUrls = noOfDiscoveryUrls;
       this.discoveryUrls = discoveryUrls;
     }
 
@@ -282,7 +274,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
               applicationType,
               gatewayServerUri,
               discoveryProfileUri,
-              noOfDiscoveryUrls,
               discoveryUrls);
       return applicationDescription;
     }
@@ -303,7 +294,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
         && (getApplicationType() == that.getApplicationType())
         && (getGatewayServerUri() == that.getGatewayServerUri())
         && (getDiscoveryProfileUri() == that.getDiscoveryProfileUri())
-        && (getNoOfDiscoveryUrls() == that.getNoOfDiscoveryUrls())
         && (getDiscoveryUrls() == that.getDiscoveryUrls())
         && super.equals(that)
         && true;
@@ -319,7 +309,6 @@ public class ApplicationDescription extends ExtensionObjectDefinition implements
         getApplicationType(),
         getGatewayServerUri(),
         getDiscoveryProfileUri(),
-        getNoOfDiscoveryUrls(),
         getDiscoveryUrls());
   }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Argument.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Argument.java
index 56209c4d68..0fd6c90069 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Argument.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Argument.java
@@ -38,15 +38,14 @@ import org.apache.plc4x.java.spi.generation.*;
 public class Argument extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "298";
+  public Integer getExtensionId() {
+    return (int) 298;
   }
 
   // Properties.
   protected final PascalString name;
   protected final NodeId dataType;
   protected final int valueRank;
-  protected final int noOfArrayDimensions;
   protected final List<Long> arrayDimensions;
   protected final LocalizedText description;
 
@@ -54,14 +53,12 @@ public class Argument extends ExtensionObjectDefinition implements Message {
       PascalString name,
       NodeId dataType,
       int valueRank,
-      int noOfArrayDimensions,
       List<Long> arrayDimensions,
       LocalizedText description) {
     super();
     this.name = name;
     this.dataType = dataType;
     this.valueRank = valueRank;
-    this.noOfArrayDimensions = noOfArrayDimensions;
     this.arrayDimensions = arrayDimensions;
     this.description = description;
   }
@@ -78,10 +75,6 @@ public class Argument extends ExtensionObjectDefinition implements Message {
     return valueRank;
   }
 
-  public int getNoOfArrayDimensions() {
-    return noOfArrayDimensions;
-  }
-
   public List<Long> getArrayDimensions() {
     return arrayDimensions;
   }
@@ -106,8 +99,11 @@ public class Argument extends ExtensionObjectDefinition implements Message {
     // Simple Field (valueRank)
     writeSimpleField("valueRank", valueRank, writeSignedInt(writeBuffer, 32));
 
-    // Simple Field (noOfArrayDimensions)
-    writeSimpleField("noOfArrayDimensions", noOfArrayDimensions, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfArrayDimensions) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfArrayDimensions =
+        (int) ((((getArrayDimensions()) == (null)) ? -(1) : COUNT(getArrayDimensions())));
+    writeImplicitField("noOfArrayDimensions", noOfArrayDimensions, writeSignedInt(writeBuffer, 32));
 
     // Array Field (arrayDimensions)
     writeSimpleTypeArrayField(
@@ -139,7 +135,7 @@ public class Argument extends ExtensionObjectDefinition implements Message {
     // Simple field (valueRank)
     lengthInBits += 32;
 
-    // Simple field (noOfArrayDimensions)
+    // Implicit Field (noOfArrayDimensions)
     lengthInBits += 32;
 
     // Array field
@@ -154,7 +150,7 @@ public class Argument extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("Argument");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -168,7 +164,8 @@ public class Argument extends ExtensionObjectDefinition implements Message {
 
     int valueRank = readSimpleField("valueRank", readSignedInt(readBuffer, 32));
 
-    int noOfArrayDimensions = readSimpleField("noOfArrayDimensions", readSignedInt(readBuffer, 32));
+    int noOfArrayDimensions =
+        readImplicitField("noOfArrayDimensions", readSignedInt(readBuffer, 32));
 
     List<Long> arrayDimensions =
         readCountArrayField(
@@ -180,8 +177,7 @@ public class Argument extends ExtensionObjectDefinition implements Message {
 
     readBuffer.closeContext("Argument");
     // Create the instance
-    return new ArgumentBuilderImpl(
-        name, dataType, valueRank, noOfArrayDimensions, arrayDimensions, description);
+    return new ArgumentBuilderImpl(name, dataType, valueRank, arrayDimensions, description);
   }
 
   public static class ArgumentBuilderImpl
@@ -189,7 +185,6 @@ public class Argument extends ExtensionObjectDefinition implements Message {
     private final PascalString name;
     private final NodeId dataType;
     private final int valueRank;
-    private final int noOfArrayDimensions;
     private final List<Long> arrayDimensions;
     private final LocalizedText description;
 
@@ -197,21 +192,17 @@ public class Argument extends ExtensionObjectDefinition implements Message {
         PascalString name,
         NodeId dataType,
         int valueRank,
-        int noOfArrayDimensions,
         List<Long> arrayDimensions,
         LocalizedText description) {
       this.name = name;
       this.dataType = dataType;
       this.valueRank = valueRank;
-      this.noOfArrayDimensions = noOfArrayDimensions;
       this.arrayDimensions = arrayDimensions;
       this.description = description;
     }
 
     public Argument build() {
-      Argument argument =
-          new Argument(
-              name, dataType, valueRank, noOfArrayDimensions, arrayDimensions, description);
+      Argument argument = new Argument(name, dataType, valueRank, arrayDimensions, description);
       return argument;
     }
   }
@@ -228,7 +219,6 @@ public class Argument extends ExtensionObjectDefinition implements Message {
     return (getName() == that.getName())
         && (getDataType() == that.getDataType())
         && (getValueRank() == that.getValueRank())
-        && (getNoOfArrayDimensions() == that.getNoOfArrayDimensions())
         && (getArrayDimensions() == that.getArrayDimensions())
         && (getDescription() == that.getDescription())
         && super.equals(that)
@@ -242,7 +232,6 @@ public class Argument extends ExtensionObjectDefinition implements Message {
         getName(),
         getDataType(),
         getValueRank(),
-        getNoOfArrayDimensions(),
         getArrayDimensions(),
         getDescription());
   }
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AttributeId.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AttributeId.java
new file mode 100644
index 0000000000..61d191d982
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AttributeId.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum AttributeId {
+  NodeId((long) 1L),
+  NodeClass((long) 2L),
+  BrowseName((long) 3L),
+  DisplayName((long) 4L),
+  Description((long) 5L),
+  WriteMask((long) 6L),
+  UserWriteMask((long) 7L),
+  IsAbstract((long) 8L),
+  Symmetric((long) 9L),
+  InverseName((long) 10L),
+  ContainsNoLoops((long) 11L),
+  EventNotifier((long) 12L),
+  Value((long) 13L),
+  DataType((long) 14L),
+  ValueRank((long) 15L),
+  ArrayDimensions((long) 16L),
+  AccessLevel((long) 17L),
+  UserAccessLevel((long) 18L),
+  MinimumSamplingInterval((long) 19L),
+  Historizing((long) 20L),
+  Executable((long) 21L),
+  UserExecutable((long) 22L),
+  DataTypeDefinition((long) 23L),
+  RolePermissions((long) 24L),
+  UserRolePermissions((long) 25L),
+  AccessRestrictions((long) 26L),
+  AccessLevelEx((long) 27L);
+  private static final Map<Long, AttributeId> map;
+
+  static {
+    map = new HashMap<>();
+    for (AttributeId value : AttributeId.values()) {
+      map.put((long) value.getValue(), value);
+    }
+  }
+
+  private final long value;
+
+  AttributeId(long value) {
+    this.value = value;
+  }
+
+  public long getValue() {
+    return value;
+  }
+
+  public static AttributeId enumForValue(long value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(long value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ReadValueId.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AttributeOperand.java
similarity index 65%
copy from plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ReadValueId.java
copy to plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AttributeOperand.java
index d33fd688ea..f2c45923ef 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ReadValueId.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AttributeOperand.java
@@ -35,32 +35,46 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class ReadValueId extends ExtensionObjectDefinition implements Message {
+public class AttributeOperand extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "628";
+  public Integer getExtensionId() {
+    return (int) 600;
   }
 
   // Properties.
   protected final NodeId nodeId;
+  protected final PascalString alias;
+  protected final RelativePath browsePath;
   protected final long attributeId;
   protected final PascalString indexRange;
-  protected final QualifiedName dataEncoding;
 
-  public ReadValueId(
-      NodeId nodeId, long attributeId, PascalString indexRange, QualifiedName dataEncoding) {
+  public AttributeOperand(
+      NodeId nodeId,
+      PascalString alias,
+      RelativePath browsePath,
+      long attributeId,
+      PascalString indexRange) {
     super();
     this.nodeId = nodeId;
+    this.alias = alias;
+    this.browsePath = browsePath;
     this.attributeId = attributeId;
     this.indexRange = indexRange;
-    this.dataEncoding = dataEncoding;
   }
 
   public NodeId getNodeId() {
     return nodeId;
   }
 
+  public PascalString getAlias() {
+    return alias;
+  }
+
+  public RelativePath getBrowsePath() {
+    return browsePath;
+  }
+
   public long getAttributeId() {
     return attributeId;
   }
@@ -69,30 +83,29 @@ public class ReadValueId extends ExtensionObjectDefinition implements Message {
     return indexRange;
   }
 
-  public QualifiedName getDataEncoding() {
-    return dataEncoding;
-  }
-
   @Override
   protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
-    writeBuffer.pushContext("ReadValueId");
+    writeBuffer.pushContext("AttributeOperand");
 
     // Simple Field (nodeId)
     writeSimpleField("nodeId", nodeId, writeComplex(writeBuffer));
 
+    // Simple Field (alias)
+    writeSimpleField("alias", alias, writeComplex(writeBuffer));
+
+    // Simple Field (browsePath)
+    writeSimpleField("browsePath", browsePath, writeComplex(writeBuffer));
+
     // Simple Field (attributeId)
     writeSimpleField("attributeId", attributeId, writeUnsignedLong(writeBuffer, 32));
 
     // Simple Field (indexRange)
     writeSimpleField("indexRange", indexRange, writeComplex(writeBuffer));
 
-    // Simple Field (dataEncoding)
-    writeSimpleField("dataEncoding", dataEncoding, writeComplex(writeBuffer));
-
-    writeBuffer.popContext("ReadValueId");
+    writeBuffer.popContext("AttributeOperand");
   }
 
   @Override
@@ -103,66 +116,83 @@ public class ReadValueId extends ExtensionObjectDefinition implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    ReadValueId _value = this;
+    AttributeOperand _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     // Simple field (nodeId)
     lengthInBits += nodeId.getLengthInBits();
 
+    // Simple field (alias)
+    lengthInBits += alias.getLengthInBits();
+
+    // Simple field (browsePath)
+    lengthInBits += browsePath.getLengthInBits();
+
     // Simple field (attributeId)
     lengthInBits += 32;
 
     // Simple field (indexRange)
     lengthInBits += indexRange.getLengthInBits();
 
-    // Simple field (dataEncoding)
-    lengthInBits += dataEncoding.getLengthInBits();
-
     return lengthInBits;
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
-    readBuffer.pullContext("ReadValueId");
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("AttributeOperand");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
     NodeId nodeId =
         readSimpleField("nodeId", readComplex(() -> NodeId.staticParse(readBuffer), readBuffer));
 
+    PascalString alias =
+        readSimpleField(
+            "alias", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    RelativePath browsePath =
+        readSimpleField(
+            "browsePath",
+            readComplex(
+                () -> (RelativePath) ExtensionObjectDefinition.staticParse(readBuffer, (int) (542)),
+                readBuffer));
+
     long attributeId = readSimpleField("attributeId", readUnsignedLong(readBuffer, 32));
 
     PascalString indexRange =
         readSimpleField(
             "indexRange", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
 
-    QualifiedName dataEncoding =
-        readSimpleField(
-            "dataEncoding", readComplex(() -> QualifiedName.staticParse(readBuffer), readBuffer));
-
-    readBuffer.closeContext("ReadValueId");
+    readBuffer.closeContext("AttributeOperand");
     // Create the instance
-    return new ReadValueIdBuilderImpl(nodeId, attributeId, indexRange, dataEncoding);
+    return new AttributeOperandBuilderImpl(nodeId, alias, browsePath, attributeId, indexRange);
   }
 
-  public static class ReadValueIdBuilderImpl
+  public static class AttributeOperandBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final NodeId nodeId;
+    private final PascalString alias;
+    private final RelativePath browsePath;
     private final long attributeId;
     private final PascalString indexRange;
-    private final QualifiedName dataEncoding;
 
-    public ReadValueIdBuilderImpl(
-        NodeId nodeId, long attributeId, PascalString indexRange, QualifiedName dataEncoding) {
+    public AttributeOperandBuilderImpl(
+        NodeId nodeId,
+        PascalString alias,
+        RelativePath browsePath,
+        long attributeId,
+        PascalString indexRange) {
       this.nodeId = nodeId;
+      this.alias = alias;
+      this.browsePath = browsePath;
       this.attributeId = attributeId;
       this.indexRange = indexRange;
-      this.dataEncoding = dataEncoding;
     }
 
-    public ReadValueId build() {
-      ReadValueId readValueId = new ReadValueId(nodeId, attributeId, indexRange, dataEncoding);
-      return readValueId;
+    public AttributeOperand build() {
+      AttributeOperand attributeOperand =
+          new AttributeOperand(nodeId, alias, browsePath, attributeId, indexRange);
+      return attributeOperand;
     }
   }
 
@@ -171,14 +201,15 @@ public class ReadValueId extends ExtensionObjectDefinition implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof ReadValueId)) {
+    if (!(o instanceof AttributeOperand)) {
       return false;
     }
-    ReadValueId that = (ReadValueId) o;
+    AttributeOperand that = (AttributeOperand) o;
     return (getNodeId() == that.getNodeId())
+        && (getAlias() == that.getAlias())
+        && (getBrowsePath() == that.getBrowsePath())
         && (getAttributeId() == that.getAttributeId())
         && (getIndexRange() == that.getIndexRange())
-        && (getDataEncoding() == that.getDataEncoding())
         && super.equals(that)
         && true;
   }
@@ -186,7 +217,12 @@ public class ReadValueId extends ExtensionObjectDefinition implements Message {
   @Override
   public int hashCode() {
     return Objects.hash(
-        super.hashCode(), getNodeId(), getAttributeId(), getIndexRange(), getDataEncoding());
+        super.hashCode(),
+        getNodeId(),
+        getAlias(),
+        getBrowsePath(),
+        getAttributeId(),
+        getIndexRange());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AxisInformation.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AxisInformation.java
index d17570bfc9..54ce946bae 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AxisInformation.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/AxisInformation.java
@@ -38,39 +38,36 @@ import org.apache.plc4x.java.spi.generation.*;
 public class AxisInformation extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "12081";
+  public Integer getExtensionId() {
+    return (int) 12081;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition engineeringUnits;
-  protected final ExtensionObjectDefinition eURange;
+  protected final EUInformation engineeringUnits;
+  protected final Range eURange;
   protected final LocalizedText title;
   protected final AxisScaleEnumeration axisScaleType;
-  protected final int noOfAxisSteps;
   protected final List<Double> axisSteps;
 
   public AxisInformation(
-      ExtensionObjectDefinition engineeringUnits,
-      ExtensionObjectDefinition eURange,
+      EUInformation engineeringUnits,
+      Range eURange,
       LocalizedText title,
       AxisScaleEnumeration axisScaleType,
-      int noOfAxisSteps,
       List<Double> axisSteps) {
     super();
     this.engineeringUnits = engineeringUnits;
     this.eURange = eURange;
     this.title = title;
     this.axisScaleType = axisScaleType;
-    this.noOfAxisSteps = noOfAxisSteps;
     this.axisSteps = axisSteps;
   }
 
-  public ExtensionObjectDefinition getEngineeringUnits() {
+  public EUInformation getEngineeringUnits() {
     return engineeringUnits;
   }
 
-  public ExtensionObjectDefinition getEURange() {
+  public Range getEURange() {
     return eURange;
   }
 
@@ -82,10 +79,6 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
     return axisScaleType;
   }
 
-  public int getNoOfAxisSteps() {
-    return noOfAxisSteps;
-  }
-
   public List<Double> getAxisSteps() {
     return axisSteps;
   }
@@ -116,8 +109,10 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
             AxisScaleEnumeration::name,
             writeUnsignedLong(writeBuffer, 32)));
 
-    // Simple Field (noOfAxisSteps)
-    writeSimpleField("noOfAxisSteps", noOfAxisSteps, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfAxisSteps) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfAxisSteps = (int) ((((getAxisSteps()) == (null)) ? -(1) : COUNT(getAxisSteps())));
+    writeImplicitField("noOfAxisSteps", noOfAxisSteps, writeSignedInt(writeBuffer, 32));
 
     // Array Field (axisSteps)
     writeSimpleTypeArrayField("axisSteps", axisSteps, writeDouble(writeBuffer, 64));
@@ -148,7 +143,7 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
     // Simple field (axisScaleType)
     lengthInBits += 32;
 
-    // Simple field (noOfAxisSteps)
+    // Implicit Field (noOfAxisSteps)
     lengthInBits += 32;
 
     // Array field
@@ -160,23 +155,24 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("AxisInformation");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition engineeringUnits =
+    EUInformation engineeringUnits =
         readSimpleField(
             "engineeringUnits",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("889")),
+                () ->
+                    (EUInformation) ExtensionObjectDefinition.staticParse(readBuffer, (int) (889)),
                 readBuffer));
 
-    ExtensionObjectDefinition eURange =
+    Range eURange =
         readSimpleField(
             "eURange",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("886")),
+                () -> (Range) ExtensionObjectDefinition.staticParse(readBuffer, (int) (886)),
                 readBuffer));
 
     LocalizedText title =
@@ -189,7 +185,7 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
             "AxisScaleEnumeration",
             readEnum(AxisScaleEnumeration::enumForValue, readUnsignedLong(readBuffer, 32)));
 
-    int noOfAxisSteps = readSimpleField("noOfAxisSteps", readSignedInt(readBuffer, 32));
+    int noOfAxisSteps = readImplicitField("noOfAxisSteps", readSignedInt(readBuffer, 32));
 
     List<Double> axisSteps =
         readCountArrayField("axisSteps", readDouble(readBuffer, 64), noOfAxisSteps);
@@ -197,37 +193,33 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
     readBuffer.closeContext("AxisInformation");
     // Create the instance
     return new AxisInformationBuilderImpl(
-        engineeringUnits, eURange, title, axisScaleType, noOfAxisSteps, axisSteps);
+        engineeringUnits, eURange, title, axisScaleType, axisSteps);
   }
 
   public static class AxisInformationBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition engineeringUnits;
-    private final ExtensionObjectDefinition eURange;
+    private final EUInformation engineeringUnits;
+    private final Range eURange;
     private final LocalizedText title;
     private final AxisScaleEnumeration axisScaleType;
-    private final int noOfAxisSteps;
     private final List<Double> axisSteps;
 
     public AxisInformationBuilderImpl(
-        ExtensionObjectDefinition engineeringUnits,
-        ExtensionObjectDefinition eURange,
+        EUInformation engineeringUnits,
+        Range eURange,
         LocalizedText title,
         AxisScaleEnumeration axisScaleType,
-        int noOfAxisSteps,
         List<Double> axisSteps) {
       this.engineeringUnits = engineeringUnits;
       this.eURange = eURange;
       this.title = title;
       this.axisScaleType = axisScaleType;
-      this.noOfAxisSteps = noOfAxisSteps;
       this.axisSteps = axisSteps;
     }
 
     public AxisInformation build() {
       AxisInformation axisInformation =
-          new AxisInformation(
-              engineeringUnits, eURange, title, axisScaleType, noOfAxisSteps, axisSteps);
+          new AxisInformation(engineeringUnits, eURange, title, axisScaleType, axisSteps);
       return axisInformation;
     }
   }
@@ -245,7 +237,6 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
         && (getEURange() == that.getEURange())
         && (getTitle() == that.getTitle())
         && (getAxisScaleType() == that.getAxisScaleType())
-        && (getNoOfAxisSteps() == that.getNoOfAxisSteps())
         && (getAxisSteps() == that.getAxisSteps())
         && super.equals(that)
         && true;
@@ -259,7 +250,6 @@ public class AxisInformation extends ExtensionObjectDefinition implements Messag
         getEURange(),
         getTitle(),
         getAxisScaleType(),
-        getNoOfAxisSteps(),
         getAxisSteps());
   }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ExtensionObject.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BinaryExtensionObjectWithMask.java
similarity index 56%
copy from plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ExtensionObject.java
copy to plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BinaryExtensionObjectWithMask.java
index bc5eb7e321..c1db6b21db 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ExtensionObject.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BinaryExtensionObjectWithMask.java
@@ -35,58 +35,48 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class ExtensionObject implements Message {
+public class BinaryExtensionObjectWithMask extends ExtensionObjectWithMask implements Message {
+
+  // Accessors for discriminator values.
+  public Boolean getEncodingMaskXmlBody() {
+    return (boolean) false;
+  }
+
+  public Boolean getEncodingMaskBinaryBody() {
+    return (boolean) true;
+  }
 
   // Properties.
-  protected final ExpandedNodeId typeId;
-  protected final ExtensionObjectEncodingMask encodingMask;
   protected final ExtensionObjectDefinition body;
 
-  public ExtensionObject(
+  public BinaryExtensionObjectWithMask(
       ExpandedNodeId typeId,
       ExtensionObjectEncodingMask encodingMask,
       ExtensionObjectDefinition body) {
-    super();
-    this.typeId = typeId;
-    this.encodingMask = encodingMask;
+    super(typeId, encodingMask);
     this.body = body;
   }
 
-  public ExpandedNodeId getTypeId() {
-    return typeId;
-  }
-
-  public ExtensionObjectEncodingMask getEncodingMask() {
-    return encodingMask;
-  }
-
   public ExtensionObjectDefinition getBody() {
     return body;
   }
 
-  public String getIdentifier() {
-    return String.valueOf(getTypeId().getIdentifier());
-  }
-
-  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+  @Override
+  protected void serializeExtensionObjectWithMaskChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
-    writeBuffer.pushContext("ExtensionObject");
-
-    // Simple Field (typeId)
-    writeSimpleField("typeId", typeId, writeComplex(writeBuffer));
+    writeBuffer.pushContext("BinaryExtensionObjectWithMask");
 
-    // Optional Field (encodingMask) (Can be skipped, if the value is null)
-    writeOptionalField("encodingMask", encodingMask, writeComplex(writeBuffer));
-
-    // Virtual field (doesn't actually serialize anything, just makes the value available)
-    String identifier = getIdentifier();
-    writeBuffer.writeVirtual("identifier", identifier);
+    // Implicit Field (bodyLength) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    int bodyLength = (int) ((((getBody()) == (null)) ? 0 : getBody().getLengthInBytes()));
+    writeImplicitField("bodyLength", bodyLength, writeSignedInt(writeBuffer, 32));
 
     // Simple Field (body)
     writeSimpleField("body", body, writeComplex(writeBuffer));
 
-    writeBuffer.popContext("ExtensionObject");
+    writeBuffer.popContext("BinaryExtensionObjectWithMask");
   }
 
   @Override
@@ -96,19 +86,12 @@ public class ExtensionObject implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = 0;
-    ExtensionObject _value = this;
+    int lengthInBits = super.getLengthInBits();
+    BinaryExtensionObjectWithMask _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (typeId)
-    lengthInBits += typeId.getLengthInBits();
-
-    // Optional Field (encodingMask)
-    if (encodingMask != null) {
-      lengthInBits += encodingMask.getLengthInBits();
-    }
-
-    // A virtual field doesn't have any in- or output.
+    // Implicit Field (bodyLength)
+    lengthInBits += 32;
 
     // Simple field (body)
     lengthInBits += body.getLengthInBits();
@@ -116,35 +99,41 @@ public class ExtensionObject implements Message {
     return lengthInBits;
   }
 
-  public static ExtensionObject staticParse(ReadBuffer readBuffer, Boolean includeEncodingMask)
+  public static ExtensionObjectWithMaskBuilder staticParseExtensionObjectWithMaskBuilder(
+      ReadBuffer readBuffer, Integer extensionId, Boolean includeEncodingMask)
       throws ParseException {
-    readBuffer.pullContext("ExtensionObject");
+    readBuffer.pullContext("BinaryExtensionObjectWithMask");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExpandedNodeId typeId =
-        readSimpleField(
-            "typeId", readComplex(() -> ExpandedNodeId.staticParse(readBuffer), readBuffer));
-
-    ExtensionObjectEncodingMask encodingMask =
-        readOptionalField(
-            "encodingMask",
-            readComplex(() -> ExtensionObjectEncodingMask.staticParse(readBuffer), readBuffer),
-            includeEncodingMask);
-    String identifier = readVirtualField("identifier", String.class, typeId.getIdentifier());
+    int bodyLength = readImplicitField("bodyLength", readSignedInt(readBuffer, 32));
 
     ExtensionObjectDefinition body =
         readSimpleField(
             "body",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) (identifier)),
+                () -> ExtensionObjectDefinition.staticParse(readBuffer, (int) (extensionId)),
                 readBuffer));
 
-    readBuffer.closeContext("ExtensionObject");
+    readBuffer.closeContext("BinaryExtensionObjectWithMask");
     // Create the instance
-    ExtensionObject _extensionObject;
-    _extensionObject = new ExtensionObject(typeId, encodingMask, body);
-    return _extensionObject;
+    return new BinaryExtensionObjectWithMaskBuilderImpl(body);
+  }
+
+  public static class BinaryExtensionObjectWithMaskBuilderImpl
+      implements ExtensionObjectWithMask.ExtensionObjectWithMaskBuilder {
+    private final ExtensionObjectDefinition body;
+
+    public BinaryExtensionObjectWithMaskBuilderImpl(ExtensionObjectDefinition body) {
+      this.body = body;
+    }
+
+    public BinaryExtensionObjectWithMask build(
+        ExpandedNodeId typeId, ExtensionObjectEncodingMask encodingMask) {
+      BinaryExtensionObjectWithMask binaryExtensionObjectWithMask =
+          new BinaryExtensionObjectWithMask(typeId, encodingMask, body);
+      return binaryExtensionObjectWithMask;
+    }
   }
 
   @Override
@@ -152,19 +141,16 @@ public class ExtensionObject implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof ExtensionObject)) {
+    if (!(o instanceof BinaryExtensionObjectWithMask)) {
       return false;
     }
-    ExtensionObject that = (ExtensionObject) o;
-    return (getTypeId() == that.getTypeId())
-        && (getEncodingMask() == that.getEncodingMask())
-        && (getBody() == that.getBody())
-        && true;
+    BinaryExtensionObjectWithMask that = (BinaryExtensionObjectWithMask) o;
+    return (getBody() == that.getBody()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(getTypeId(), getEncodingMask(), getBody());
+    return Objects.hash(super.hashCode(), getBody());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BinaryPayload.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BinaryPayload.java
index 7f0e9d88dc..34b5b9d168 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BinaryPayload.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BinaryPayload.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BinaryPayload extends Payload implements Message {
 
   // Accessors for discriminator values.
-  public Boolean getExtensible() {
-    return (boolean) false;
+  public Boolean getBinary() {
+    return (boolean) true;
   }
 
   // Properties.
@@ -86,7 +86,7 @@ public class BinaryPayload extends Payload implements Message {
   }
 
   public static PayloadBuilder staticParsePayloadBuilder(
-      ReadBuffer readBuffer, Boolean extensible, Long byteCount) throws ParseException {
+      ReadBuffer readBuffer, Boolean binary, Long byteCount) throws ParseException {
     readBuffer.pullContext("BinaryPayload");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BitFieldDefinition.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BitFieldDefinition.java
index f823b6b0d1..8c7381f5be 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BitFieldDefinition.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BitFieldDefinition.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BitFieldDefinition extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "32423";
+  public Integer getExtensionId() {
+    return (int) 32423;
   }
 
   // Properties.
@@ -138,7 +138,7 @@ public class BitFieldDefinition extends ExtensionObjectDefinition implements Mes
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BitFieldDefinition");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/EnumValueType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerConnectionTransportDataType.java
similarity index 52%
copy from plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/EnumValueType.java
copy to plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerConnectionTransportDataType.java
index 75dc77597e..f89d9431e1 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/EnumValueType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerConnectionTransportDataType.java
@@ -35,35 +35,31 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class EnumValueType extends ExtensionObjectDefinition implements Message {
+public class BrokerConnectionTransportDataType extends ExtensionObjectDefinition
+    implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "7596";
+  public Integer getExtensionId() {
+    return (int) 15009;
   }
 
   // Properties.
-  protected final long value;
-  protected final LocalizedText displayName;
-  protected final LocalizedText description;
+  protected final PascalString resourceUri;
+  protected final PascalString authenticationProfileUri;
 
-  public EnumValueType(long value, LocalizedText displayName, LocalizedText description) {
+  public BrokerConnectionTransportDataType(
+      PascalString resourceUri, PascalString authenticationProfileUri) {
     super();
-    this.value = value;
-    this.displayName = displayName;
-    this.description = description;
+    this.resourceUri = resourceUri;
+    this.authenticationProfileUri = authenticationProfileUri;
   }
 
-  public long getValue() {
-    return value;
+  public PascalString getResourceUri() {
+    return resourceUri;
   }
 
-  public LocalizedText getDisplayName() {
-    return displayName;
-  }
-
-  public LocalizedText getDescription() {
-    return description;
+  public PascalString getAuthenticationProfileUri() {
+    return authenticationProfileUri;
   }
 
   @Override
@@ -71,18 +67,16 @@ public class EnumValueType extends ExtensionObjectDefinition implements Message
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
-    writeBuffer.pushContext("EnumValueType");
-
-    // Simple Field (value)
-    writeSimpleField("value", value, writeSignedLong(writeBuffer, 64));
+    writeBuffer.pushContext("BrokerConnectionTransportDataType");
 
-    // Simple Field (displayName)
-    writeSimpleField("displayName", displayName, writeComplex(writeBuffer));
+    // Simple Field (resourceUri)
+    writeSimpleField("resourceUri", resourceUri, writeComplex(writeBuffer));
 
-    // Simple Field (description)
-    writeSimpleField("description", description, writeComplex(writeBuffer));
+    // Simple Field (authenticationProfileUri)
+    writeSimpleField(
+        "authenticationProfileUri", authenticationProfileUri, writeComplex(writeBuffer));
 
-    writeBuffer.popContext("EnumValueType");
+    writeBuffer.popContext("BrokerConnectionTransportDataType");
   }
 
   @Override
@@ -93,58 +87,53 @@ public class EnumValueType extends ExtensionObjectDefinition implements Message
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    EnumValueType _value = this;
+    BrokerConnectionTransportDataType _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (value)
-    lengthInBits += 64;
+    // Simple field (resourceUri)
+    lengthInBits += resourceUri.getLengthInBits();
 
-    // Simple field (displayName)
-    lengthInBits += displayName.getLengthInBits();
-
-    // Simple field (description)
-    lengthInBits += description.getLengthInBits();
+    // Simple field (authenticationProfileUri)
+    lengthInBits += authenticationProfileUri.getLengthInBits();
 
     return lengthInBits;
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
-    readBuffer.pullContext("EnumValueType");
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("BrokerConnectionTransportDataType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    long value = readSimpleField("value", readSignedLong(readBuffer, 64));
-
-    LocalizedText displayName =
+    PascalString resourceUri =
         readSimpleField(
-            "displayName", readComplex(() -> LocalizedText.staticParse(readBuffer), readBuffer));
+            "resourceUri", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
 
-    LocalizedText description =
+    PascalString authenticationProfileUri =
         readSimpleField(
-            "description", readComplex(() -> LocalizedText.staticParse(readBuffer), readBuffer));
+            "authenticationProfileUri",
+            readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
 
-    readBuffer.closeContext("EnumValueType");
+    readBuffer.closeContext("BrokerConnectionTransportDataType");
     // Create the instance
-    return new EnumValueTypeBuilderImpl(value, displayName, description);
+    return new BrokerConnectionTransportDataTypeBuilderImpl(resourceUri, authenticationProfileUri);
   }
 
-  public static class EnumValueTypeBuilderImpl
+  public static class BrokerConnectionTransportDataTypeBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final long value;
-    private final LocalizedText displayName;
-    private final LocalizedText description;
-
-    public EnumValueTypeBuilderImpl(
-        long value, LocalizedText displayName, LocalizedText description) {
-      this.value = value;
-      this.displayName = displayName;
-      this.description = description;
+    private final PascalString resourceUri;
+    private final PascalString authenticationProfileUri;
+
+    public BrokerConnectionTransportDataTypeBuilderImpl(
+        PascalString resourceUri, PascalString authenticationProfileUri) {
+      this.resourceUri = resourceUri;
+      this.authenticationProfileUri = authenticationProfileUri;
     }
 
-    public EnumValueType build() {
-      EnumValueType enumValueType = new EnumValueType(value, displayName, description);
-      return enumValueType;
+    public BrokerConnectionTransportDataType build() {
+      BrokerConnectionTransportDataType brokerConnectionTransportDataType =
+          new BrokerConnectionTransportDataType(resourceUri, authenticationProfileUri);
+      return brokerConnectionTransportDataType;
     }
   }
 
@@ -153,20 +142,19 @@ public class EnumValueType extends ExtensionObjectDefinition implements Message
     if (this == o) {
       return true;
     }
-    if (!(o instanceof EnumValueType)) {
+    if (!(o instanceof BrokerConnectionTransportDataType)) {
       return false;
     }
-    EnumValueType that = (EnumValueType) o;
-    return (getValue() == that.getValue())
-        && (getDisplayName() == that.getDisplayName())
-        && (getDescription() == that.getDescription())
+    BrokerConnectionTransportDataType that = (BrokerConnectionTransportDataType) o;
+    return (getResourceUri() == that.getResourceUri())
+        && (getAuthenticationProfileUri() == that.getAuthenticationProfileUri())
         && super.equals(that)
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getValue(), getDisplayName(), getDescription());
+    return Objects.hash(super.hashCode(), getResourceUri(), getAuthenticationProfileUri());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerDataSetReaderTransportDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerDataSetReaderTransportDataType.java
new file mode 100644
index 0000000000..884e11cb62
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerDataSetReaderTransportDataType.java
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class BrokerDataSetReaderTransportDataType extends ExtensionObjectDefinition
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getExtensionId() {
+    return (int) 15672;
+  }
+
+  // Properties.
+  protected final PascalString queueName;
+  protected final PascalString resourceUri;
+  protected final PascalString authenticationProfileUri;
+  protected final BrokerTransportQualityOfService requestedDeliveryGuarantee;
+  protected final PascalString metaDataQueueName;
+
+  public BrokerDataSetReaderTransportDataType(
+      PascalString queueName,
+      PascalString resourceUri,
+      PascalString authenticationProfileUri,
+      BrokerTransportQualityOfService requestedDeliveryGuarantee,
+      PascalString metaDataQueueName) {
+    super();
+    this.queueName = queueName;
+    this.resourceUri = resourceUri;
+    this.authenticationProfileUri = authenticationProfileUri;
+    this.requestedDeliveryGuarantee = requestedDeliveryGuarantee;
+    this.metaDataQueueName = metaDataQueueName;
+  }
+
+  public PascalString getQueueName() {
+    return queueName;
+  }
+
+  public PascalString getResourceUri() {
+    return resourceUri;
+  }
+
+  public PascalString getAuthenticationProfileUri() {
+    return authenticationProfileUri;
+  }
+
+  public BrokerTransportQualityOfService getRequestedDeliveryGuarantee() {
+    return requestedDeliveryGuarantee;
+  }
+
+  public PascalString getMetaDataQueueName() {
+    return metaDataQueueName;
+  }
+
+  @Override
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("BrokerDataSetReaderTransportDataType");
+
+    // Simple Field (queueName)
+    writeSimpleField("queueName", queueName, writeComplex(writeBuffer));
+
+    // Simple Field (resourceUri)
+    writeSimpleField("resourceUri", resourceUri, writeComplex(writeBuffer));
+
+    // Simple Field (authenticationProfileUri)
+    writeSimpleField(
+        "authenticationProfileUri", authenticationProfileUri, writeComplex(writeBuffer));
+
+    // Simple Field (requestedDeliveryGuarantee)
+    writeSimpleEnumField(
+        "requestedDeliveryGuarantee",
+        "BrokerTransportQualityOfService",
+        requestedDeliveryGuarantee,
+        writeEnum(
+            BrokerTransportQualityOfService::getValue,
+            BrokerTransportQualityOfService::name,
+            writeUnsignedLong(writeBuffer, 32)));
+
+    // Simple Field (metaDataQueueName)
+    writeSimpleField("metaDataQueueName", metaDataQueueName, writeComplex(writeBuffer));
+
+    writeBuffer.popContext("BrokerDataSetReaderTransportDataType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    BrokerDataSetReaderTransportDataType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (queueName)
+    lengthInBits += queueName.getLengthInBits();
+
+    // Simple field (resourceUri)
+    lengthInBits += resourceUri.getLengthInBits();
+
+    // Simple field (authenticationProfileUri)
+    lengthInBits += authenticationProfileUri.getLengthInBits();
+
+    // Simple field (requestedDeliveryGuarantee)
+    lengthInBits += 32;
+
+    // Simple field (metaDataQueueName)
+    lengthInBits += metaDataQueueName.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("BrokerDataSetReaderTransportDataType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    PascalString queueName =
+        readSimpleField(
+            "queueName", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    PascalString resourceUri =
+        readSimpleField(
+            "resourceUri", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    PascalString authenticationProfileUri =
+        readSimpleField(
+            "authenticationProfileUri",
+            readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    BrokerTransportQualityOfService requestedDeliveryGuarantee =
+        readEnumField(
+            "requestedDeliveryGuarantee",
+            "BrokerTransportQualityOfService",
+            readEnum(
+                BrokerTransportQualityOfService::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    PascalString metaDataQueueName =
+        readSimpleField(
+            "metaDataQueueName",
+            readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    readBuffer.closeContext("BrokerDataSetReaderTransportDataType");
+    // Create the instance
+    return new BrokerDataSetReaderTransportDataTypeBuilderImpl(
+        queueName,
+        resourceUri,
+        authenticationProfileUri,
+        requestedDeliveryGuarantee,
+        metaDataQueueName);
+  }
+
+  public static class BrokerDataSetReaderTransportDataTypeBuilderImpl
+      implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
+    private final PascalString queueName;
+    private final PascalString resourceUri;
+    private final PascalString authenticationProfileUri;
+    private final BrokerTransportQualityOfService requestedDeliveryGuarantee;
+    private final PascalString metaDataQueueName;
+
+    public BrokerDataSetReaderTransportDataTypeBuilderImpl(
+        PascalString queueName,
+        PascalString resourceUri,
+        PascalString authenticationProfileUri,
+        BrokerTransportQualityOfService requestedDeliveryGuarantee,
+        PascalString metaDataQueueName) {
+      this.queueName = queueName;
+      this.resourceUri = resourceUri;
+      this.authenticationProfileUri = authenticationProfileUri;
+      this.requestedDeliveryGuarantee = requestedDeliveryGuarantee;
+      this.metaDataQueueName = metaDataQueueName;
+    }
+
+    public BrokerDataSetReaderTransportDataType build() {
+      BrokerDataSetReaderTransportDataType brokerDataSetReaderTransportDataType =
+          new BrokerDataSetReaderTransportDataType(
+              queueName,
+              resourceUri,
+              authenticationProfileUri,
+              requestedDeliveryGuarantee,
+              metaDataQueueName);
+      return brokerDataSetReaderTransportDataType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof BrokerDataSetReaderTransportDataType)) {
+      return false;
+    }
+    BrokerDataSetReaderTransportDataType that = (BrokerDataSetReaderTransportDataType) o;
+    return (getQueueName() == that.getQueueName())
+        && (getResourceUri() == that.getResourceUri())
+        && (getAuthenticationProfileUri() == that.getAuthenticationProfileUri())
+        && (getRequestedDeliveryGuarantee() == that.getRequestedDeliveryGuarantee())
+        && (getMetaDataQueueName() == that.getMetaDataQueueName())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getQueueName(),
+        getResourceUri(),
+        getAuthenticationProfileUri(),
+        getRequestedDeliveryGuarantee(),
+        getMetaDataQueueName());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerDataSetWriterTransportDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerDataSetWriterTransportDataType.java
new file mode 100644
index 0000000000..b738a3c3d1
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerDataSetWriterTransportDataType.java
@@ -0,0 +1,284 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class BrokerDataSetWriterTransportDataType extends ExtensionObjectDefinition
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getExtensionId() {
+    return (int) 15671;
+  }
+
+  // Properties.
+  protected final PascalString queueName;
+  protected final PascalString resourceUri;
+  protected final PascalString authenticationProfileUri;
+  protected final BrokerTransportQualityOfService requestedDeliveryGuarantee;
+  protected final PascalString metaDataQueueName;
+  protected final double metaDataUpdateTime;
+
+  public BrokerDataSetWriterTransportDataType(
+      PascalString queueName,
+      PascalString resourceUri,
+      PascalString authenticationProfileUri,
+      BrokerTransportQualityOfService requestedDeliveryGuarantee,
+      PascalString metaDataQueueName,
+      double metaDataUpdateTime) {
+    super();
+    this.queueName = queueName;
+    this.resourceUri = resourceUri;
+    this.authenticationProfileUri = authenticationProfileUri;
+    this.requestedDeliveryGuarantee = requestedDeliveryGuarantee;
+    this.metaDataQueueName = metaDataQueueName;
+    this.metaDataUpdateTime = metaDataUpdateTime;
+  }
+
+  public PascalString getQueueName() {
+    return queueName;
+  }
+
+  public PascalString getResourceUri() {
+    return resourceUri;
+  }
+
+  public PascalString getAuthenticationProfileUri() {
+    return authenticationProfileUri;
+  }
+
+  public BrokerTransportQualityOfService getRequestedDeliveryGuarantee() {
+    return requestedDeliveryGuarantee;
+  }
+
+  public PascalString getMetaDataQueueName() {
+    return metaDataQueueName;
+  }
+
+  public double getMetaDataUpdateTime() {
+    return metaDataUpdateTime;
+  }
+
+  @Override
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("BrokerDataSetWriterTransportDataType");
+
+    // Simple Field (queueName)
+    writeSimpleField("queueName", queueName, writeComplex(writeBuffer));
+
+    // Simple Field (resourceUri)
+    writeSimpleField("resourceUri", resourceUri, writeComplex(writeBuffer));
+
+    // Simple Field (authenticationProfileUri)
+    writeSimpleField(
+        "authenticationProfileUri", authenticationProfileUri, writeComplex(writeBuffer));
+
+    // Simple Field (requestedDeliveryGuarantee)
+    writeSimpleEnumField(
+        "requestedDeliveryGuarantee",
+        "BrokerTransportQualityOfService",
+        requestedDeliveryGuarantee,
+        writeEnum(
+            BrokerTransportQualityOfService::getValue,
+            BrokerTransportQualityOfService::name,
+            writeUnsignedLong(writeBuffer, 32)));
+
+    // Simple Field (metaDataQueueName)
+    writeSimpleField("metaDataQueueName", metaDataQueueName, writeComplex(writeBuffer));
+
+    // Simple Field (metaDataUpdateTime)
+    writeSimpleField("metaDataUpdateTime", metaDataUpdateTime, writeDouble(writeBuffer, 64));
+
+    writeBuffer.popContext("BrokerDataSetWriterTransportDataType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    BrokerDataSetWriterTransportDataType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (queueName)
+    lengthInBits += queueName.getLengthInBits();
+
+    // Simple field (resourceUri)
+    lengthInBits += resourceUri.getLengthInBits();
+
+    // Simple field (authenticationProfileUri)
+    lengthInBits += authenticationProfileUri.getLengthInBits();
+
+    // Simple field (requestedDeliveryGuarantee)
+    lengthInBits += 32;
+
+    // Simple field (metaDataQueueName)
+    lengthInBits += metaDataQueueName.getLengthInBits();
+
+    // Simple field (metaDataUpdateTime)
+    lengthInBits += 64;
+
+    return lengthInBits;
+  }
+
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("BrokerDataSetWriterTransportDataType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    PascalString queueName =
+        readSimpleField(
+            "queueName", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    PascalString resourceUri =
+        readSimpleField(
+            "resourceUri", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    PascalString authenticationProfileUri =
+        readSimpleField(
+            "authenticationProfileUri",
+            readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    BrokerTransportQualityOfService requestedDeliveryGuarantee =
+        readEnumField(
+            "requestedDeliveryGuarantee",
+            "BrokerTransportQualityOfService",
+            readEnum(
+                BrokerTransportQualityOfService::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    PascalString metaDataQueueName =
+        readSimpleField(
+            "metaDataQueueName",
+            readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    double metaDataUpdateTime = readSimpleField("metaDataUpdateTime", readDouble(readBuffer, 64));
+
+    readBuffer.closeContext("BrokerDataSetWriterTransportDataType");
+    // Create the instance
+    return new BrokerDataSetWriterTransportDataTypeBuilderImpl(
+        queueName,
+        resourceUri,
+        authenticationProfileUri,
+        requestedDeliveryGuarantee,
+        metaDataQueueName,
+        metaDataUpdateTime);
+  }
+
+  public static class BrokerDataSetWriterTransportDataTypeBuilderImpl
+      implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
+    private final PascalString queueName;
+    private final PascalString resourceUri;
+    private final PascalString authenticationProfileUri;
+    private final BrokerTransportQualityOfService requestedDeliveryGuarantee;
+    private final PascalString metaDataQueueName;
+    private final double metaDataUpdateTime;
+
+    public BrokerDataSetWriterTransportDataTypeBuilderImpl(
+        PascalString queueName,
+        PascalString resourceUri,
+        PascalString authenticationProfileUri,
+        BrokerTransportQualityOfService requestedDeliveryGuarantee,
+        PascalString metaDataQueueName,
+        double metaDataUpdateTime) {
+      this.queueName = queueName;
+      this.resourceUri = resourceUri;
+      this.authenticationProfileUri = authenticationProfileUri;
+      this.requestedDeliveryGuarantee = requestedDeliveryGuarantee;
+      this.metaDataQueueName = metaDataQueueName;
+      this.metaDataUpdateTime = metaDataUpdateTime;
+    }
+
+    public BrokerDataSetWriterTransportDataType build() {
+      BrokerDataSetWriterTransportDataType brokerDataSetWriterTransportDataType =
+          new BrokerDataSetWriterTransportDataType(
+              queueName,
+              resourceUri,
+              authenticationProfileUri,
+              requestedDeliveryGuarantee,
+              metaDataQueueName,
+              metaDataUpdateTime);
+      return brokerDataSetWriterTransportDataType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof BrokerDataSetWriterTransportDataType)) {
+      return false;
+    }
+    BrokerDataSetWriterTransportDataType that = (BrokerDataSetWriterTransportDataType) o;
+    return (getQueueName() == that.getQueueName())
+        && (getResourceUri() == that.getResourceUri())
+        && (getAuthenticationProfileUri() == that.getAuthenticationProfileUri())
+        && (getRequestedDeliveryGuarantee() == that.getRequestedDeliveryGuarantee())
+        && (getMetaDataQueueName() == that.getMetaDataQueueName())
+        && (getMetaDataUpdateTime() == that.getMetaDataUpdateTime())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getQueueName(),
+        getResourceUri(),
+        getAuthenticationProfileUri(),
+        getRequestedDeliveryGuarantee(),
+        getMetaDataQueueName(),
+        getMetaDataUpdateTime());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerWriterGroupTransportDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerWriterGroupTransportDataType.java
new file mode 100644
index 0000000000..d24e622803
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrokerWriterGroupTransportDataType.java
@@ -0,0 +1,231 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class BrokerWriterGroupTransportDataType extends ExtensionObjectDefinition
+    implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getExtensionId() {
+    return (int) 15669;
+  }
+
+  // Properties.
+  protected final PascalString queueName;
+  protected final PascalString resourceUri;
+  protected final PascalString authenticationProfileUri;
+  protected final BrokerTransportQualityOfService requestedDeliveryGuarantee;
+
+  public BrokerWriterGroupTransportDataType(
+      PascalString queueName,
+      PascalString resourceUri,
+      PascalString authenticationProfileUri,
+      BrokerTransportQualityOfService requestedDeliveryGuarantee) {
+    super();
+    this.queueName = queueName;
+    this.resourceUri = resourceUri;
+    this.authenticationProfileUri = authenticationProfileUri;
+    this.requestedDeliveryGuarantee = requestedDeliveryGuarantee;
+  }
+
+  public PascalString getQueueName() {
+    return queueName;
+  }
+
+  public PascalString getResourceUri() {
+    return resourceUri;
+  }
+
+  public PascalString getAuthenticationProfileUri() {
+    return authenticationProfileUri;
+  }
+
+  public BrokerTransportQualityOfService getRequestedDeliveryGuarantee() {
+    return requestedDeliveryGuarantee;
+  }
+
+  @Override
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("BrokerWriterGroupTransportDataType");
+
+    // Simple Field (queueName)
+    writeSimpleField("queueName", queueName, writeComplex(writeBuffer));
+
+    // Simple Field (resourceUri)
+    writeSimpleField("resourceUri", resourceUri, writeComplex(writeBuffer));
+
+    // Simple Field (authenticationProfileUri)
+    writeSimpleField(
+        "authenticationProfileUri", authenticationProfileUri, writeComplex(writeBuffer));
+
+    // Simple Field (requestedDeliveryGuarantee)
+    writeSimpleEnumField(
+        "requestedDeliveryGuarantee",
+        "BrokerTransportQualityOfService",
+        requestedDeliveryGuarantee,
+        writeEnum(
+            BrokerTransportQualityOfService::getValue,
+            BrokerTransportQualityOfService::name,
+            writeUnsignedLong(writeBuffer, 32)));
+
+    writeBuffer.popContext("BrokerWriterGroupTransportDataType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    BrokerWriterGroupTransportDataType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (queueName)
+    lengthInBits += queueName.getLengthInBits();
+
+    // Simple field (resourceUri)
+    lengthInBits += resourceUri.getLengthInBits();
+
+    // Simple field (authenticationProfileUri)
+    lengthInBits += authenticationProfileUri.getLengthInBits();
+
+    // Simple field (requestedDeliveryGuarantee)
+    lengthInBits += 32;
+
+    return lengthInBits;
+  }
+
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("BrokerWriterGroupTransportDataType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    PascalString queueName =
+        readSimpleField(
+            "queueName", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    PascalString resourceUri =
+        readSimpleField(
+            "resourceUri", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    PascalString authenticationProfileUri =
+        readSimpleField(
+            "authenticationProfileUri",
+            readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    BrokerTransportQualityOfService requestedDeliveryGuarantee =
+        readEnumField(
+            "requestedDeliveryGuarantee",
+            "BrokerTransportQualityOfService",
+            readEnum(
+                BrokerTransportQualityOfService::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    readBuffer.closeContext("BrokerWriterGroupTransportDataType");
+    // Create the instance
+    return new BrokerWriterGroupTransportDataTypeBuilderImpl(
+        queueName, resourceUri, authenticationProfileUri, requestedDeliveryGuarantee);
+  }
+
+  public static class BrokerWriterGroupTransportDataTypeBuilderImpl
+      implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
+    private final PascalString queueName;
+    private final PascalString resourceUri;
+    private final PascalString authenticationProfileUri;
+    private final BrokerTransportQualityOfService requestedDeliveryGuarantee;
+
+    public BrokerWriterGroupTransportDataTypeBuilderImpl(
+        PascalString queueName,
+        PascalString resourceUri,
+        PascalString authenticationProfileUri,
+        BrokerTransportQualityOfService requestedDeliveryGuarantee) {
+      this.queueName = queueName;
+      this.resourceUri = resourceUri;
+      this.authenticationProfileUri = authenticationProfileUri;
+      this.requestedDeliveryGuarantee = requestedDeliveryGuarantee;
+    }
+
+    public BrokerWriterGroupTransportDataType build() {
+      BrokerWriterGroupTransportDataType brokerWriterGroupTransportDataType =
+          new BrokerWriterGroupTransportDataType(
+              queueName, resourceUri, authenticationProfileUri, requestedDeliveryGuarantee);
+      return brokerWriterGroupTransportDataType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof BrokerWriterGroupTransportDataType)) {
+      return false;
+    }
+    BrokerWriterGroupTransportDataType that = (BrokerWriterGroupTransportDataType) o;
+    return (getQueueName() == that.getQueueName())
+        && (getResourceUri() == that.getResourceUri())
+        && (getAuthenticationProfileUri() == that.getAuthenticationProfileUri())
+        && (getRequestedDeliveryGuarantee() == that.getRequestedDeliveryGuarantee())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getQueueName(),
+        getResourceUri(),
+        getAuthenticationProfileUri(),
+        getRequestedDeliveryGuarantee());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseDescription.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseDescription.java
index a4042ebd12..5992c6c131 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseDescription.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseDescription.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowseDescription extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "516";
+  public Integer getExtensionId() {
+    return (int) 516;
   }
 
   // Properties.
@@ -162,7 +162,7 @@ public class BrowseDescription extends ExtensionObjectDefinition implements Mess
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowseDescription");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextRequest.java
index 0aaf1bf5e4..4da5bcd2b1 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextRequest.java
@@ -38,29 +38,26 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowseNextRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "533";
+  public Integer getExtensionId() {
+    return (int) 533;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
+  protected final RequestHeader requestHeader;
   protected final boolean releaseContinuationPoints;
-  protected final int noOfContinuationPoints;
   protected final List<PascalByteString> continuationPoints;
 
   public BrowseNextRequest(
-      ExtensionObjectDefinition requestHeader,
+      RequestHeader requestHeader,
       boolean releaseContinuationPoints,
-      int noOfContinuationPoints,
       List<PascalByteString> continuationPoints) {
     super();
     this.requestHeader = requestHeader;
     this.releaseContinuationPoints = releaseContinuationPoints;
-    this.noOfContinuationPoints = noOfContinuationPoints;
     this.continuationPoints = continuationPoints;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
@@ -68,10 +65,6 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
     return releaseContinuationPoints;
   }
 
-  public int getNoOfContinuationPoints() {
-    return noOfContinuationPoints;
-  }
-
   public List<PascalByteString> getContinuationPoints() {
     return continuationPoints;
   }
@@ -93,8 +86,11 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
     writeSimpleField(
         "releaseContinuationPoints", releaseContinuationPoints, writeBoolean(writeBuffer));
 
-    // Simple Field (noOfContinuationPoints)
-    writeSimpleField(
+    // Implicit Field (noOfContinuationPoints) (Used for parsing, but its value is not stored as
+    // it's implicitly given by the objects content)
+    int noOfContinuationPoints =
+        (int) ((((getContinuationPoints()) == (null)) ? -(1) : COUNT(getContinuationPoints())));
+    writeImplicitField(
         "noOfContinuationPoints", noOfContinuationPoints, writeSignedInt(writeBuffer, 32));
 
     // Array Field (continuationPoints)
@@ -123,7 +119,7 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
     // Simple field (releaseContinuationPoints)
     lengthInBits += 1;
 
-    // Simple field (noOfContinuationPoints)
+    // Implicit Field (noOfContinuationPoints)
     lengthInBits += 32;
 
     // Array field
@@ -139,16 +135,17 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowseNextRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
     Byte reservedField0 =
@@ -158,7 +155,7 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
         readSimpleField("releaseContinuationPoints", readBoolean(readBuffer));
 
     int noOfContinuationPoints =
-        readSimpleField("noOfContinuationPoints", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfContinuationPoints", readSignedInt(readBuffer, 32));
 
     List<PascalByteString> continuationPoints =
         readCountArrayField(
@@ -169,31 +166,27 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
     readBuffer.closeContext("BrowseNextRequest");
     // Create the instance
     return new BrowseNextRequestBuilderImpl(
-        requestHeader, releaseContinuationPoints, noOfContinuationPoints, continuationPoints);
+        requestHeader, releaseContinuationPoints, continuationPoints);
   }
 
   public static class BrowseNextRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
+    private final RequestHeader requestHeader;
     private final boolean releaseContinuationPoints;
-    private final int noOfContinuationPoints;
     private final List<PascalByteString> continuationPoints;
 
     public BrowseNextRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
+        RequestHeader requestHeader,
         boolean releaseContinuationPoints,
-        int noOfContinuationPoints,
         List<PascalByteString> continuationPoints) {
       this.requestHeader = requestHeader;
       this.releaseContinuationPoints = releaseContinuationPoints;
-      this.noOfContinuationPoints = noOfContinuationPoints;
       this.continuationPoints = continuationPoints;
     }
 
     public BrowseNextRequest build() {
       BrowseNextRequest browseNextRequest =
-          new BrowseNextRequest(
-              requestHeader, releaseContinuationPoints, noOfContinuationPoints, continuationPoints);
+          new BrowseNextRequest(requestHeader, releaseContinuationPoints, continuationPoints);
       return browseNextRequest;
     }
   }
@@ -209,7 +202,6 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
     BrowseNextRequest that = (BrowseNextRequest) o;
     return (getRequestHeader() == that.getRequestHeader())
         && (getReleaseContinuationPoints() == that.getReleaseContinuationPoints())
-        && (getNoOfContinuationPoints() == that.getNoOfContinuationPoints())
         && (getContinuationPoints() == that.getContinuationPoints())
         && super.equals(that)
         && true;
@@ -221,7 +213,6 @@ public class BrowseNextRequest extends ExtensionObjectDefinition implements Mess
         super.hashCode(),
         getRequestHeader(),
         getReleaseContinuationPoints(),
-        getNoOfContinuationPoints(),
         getContinuationPoints());
   }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextResponse.java
index 8bafe3556c..2ccd7b41e2 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseNextResponse.java
@@ -38,47 +38,33 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowseNextResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "536";
+  public Integer getExtensionId() {
+    return (int) 536;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
-  protected final int noOfResults;
-  protected final List<ExtensionObjectDefinition> results;
-  protected final int noOfDiagnosticInfos;
+  protected final ResponseHeader responseHeader;
+  protected final List<BrowseResult> results;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public BrowseNextResponse(
-      ExtensionObjectDefinition responseHeader,
-      int noOfResults,
-      List<ExtensionObjectDefinition> results,
-      int noOfDiagnosticInfos,
+      ResponseHeader responseHeader,
+      List<BrowseResult> results,
       List<DiagnosticInfo> diagnosticInfos) {
     super();
     this.responseHeader = responseHeader;
-    this.noOfResults = noOfResults;
     this.results = results;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
-  public int getNoOfResults() {
-    return noOfResults;
-  }
-
-  public List<ExtensionObjectDefinition> getResults() {
+  public List<BrowseResult> getResults() {
     return results;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -93,14 +79,19 @@ public class BrowseNextResponse extends ExtensionObjectDefinition implements Mes
     // Simple Field (responseHeader)
     writeSimpleField("responseHeader", responseHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfResults)
-    writeSimpleField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfResults = (int) ((((getResults()) == (null)) ? -(1) : COUNT(getResults())));
+    writeImplicitField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (results)
     writeComplexTypeArrayField("results", results, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -122,19 +113,19 @@ public class BrowseNextResponse extends ExtensionObjectDefinition implements Mes
     // Simple field (responseHeader)
     lengthInBits += responseHeader.getLengthInBits();
 
-    // Simple field (noOfResults)
+    // Implicit Field (noOfResults)
     lengthInBits += 32;
 
     // Array field
     if (results != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : results) {
+      for (BrowseResult element : results) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= results.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -150,29 +141,31 @@ public class BrowseNextResponse extends ExtensionObjectDefinition implements Mes
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowseNextResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
-    int noOfResults = readSimpleField("noOfResults", readSignedInt(readBuffer, 32));
+    int noOfResults = readImplicitField("noOfResults", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> results =
+    List<BrowseResult> results =
         readCountArrayField(
             "results",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("524")),
+                () -> (BrowseResult) ExtensionObjectDefinition.staticParse(readBuffer, (int) (524)),
                 readBuffer),
             noOfResults);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -182,35 +175,27 @@ public class BrowseNextResponse extends ExtensionObjectDefinition implements Mes
 
     readBuffer.closeContext("BrowseNextResponse");
     // Create the instance
-    return new BrowseNextResponseBuilderImpl(
-        responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+    return new BrowseNextResponseBuilderImpl(responseHeader, results, diagnosticInfos);
   }
 
   public static class BrowseNextResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
-    private final int noOfResults;
-    private final List<ExtensionObjectDefinition> results;
-    private final int noOfDiagnosticInfos;
+    private final ResponseHeader responseHeader;
+    private final List<BrowseResult> results;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public BrowseNextResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
-        int noOfResults,
-        List<ExtensionObjectDefinition> results,
-        int noOfDiagnosticInfos,
+        ResponseHeader responseHeader,
+        List<BrowseResult> results,
         List<DiagnosticInfo> diagnosticInfos) {
       this.responseHeader = responseHeader;
-      this.noOfResults = noOfResults;
       this.results = results;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public BrowseNextResponse build() {
       BrowseNextResponse browseNextResponse =
-          new BrowseNextResponse(
-              responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+          new BrowseNextResponse(responseHeader, results, diagnosticInfos);
       return browseNextResponse;
     }
   }
@@ -225,9 +210,7 @@ public class BrowseNextResponse extends ExtensionObjectDefinition implements Mes
     }
     BrowseNextResponse that = (BrowseNextResponse) o;
     return (getResponseHeader() == that.getResponseHeader())
-        && (getNoOfResults() == that.getNoOfResults())
         && (getResults() == that.getResults())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -235,13 +218,7 @@ public class BrowseNextResponse extends ExtensionObjectDefinition implements Mes
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getResponseHeader(),
-        getNoOfResults(),
-        getResults(),
-        getNoOfDiagnosticInfos(),
-        getDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getResponseHeader(), getResults(), getDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePath.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePath.java
index 5e6ccf8e16..2d3df74ea7 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePath.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePath.java
@@ -38,15 +38,15 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowsePath extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "545";
+  public Integer getExtensionId() {
+    return (int) 545;
   }
 
   // Properties.
   protected final NodeId startingNode;
-  protected final ExtensionObjectDefinition relativePath;
+  protected final RelativePath relativePath;
 
-  public BrowsePath(NodeId startingNode, ExtensionObjectDefinition relativePath) {
+  public BrowsePath(NodeId startingNode, RelativePath relativePath) {
     super();
     this.startingNode = startingNode;
     this.relativePath = relativePath;
@@ -56,7 +56,7 @@ public class BrowsePath extends ExtensionObjectDefinition implements Message {
     return startingNode;
   }
 
-  public ExtensionObjectDefinition getRelativePath() {
+  public RelativePath getRelativePath() {
     return relativePath;
   }
 
@@ -97,7 +97,7 @@ public class BrowsePath extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowsePath");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -106,11 +106,11 @@ public class BrowsePath extends ExtensionObjectDefinition implements Message {
         readSimpleField(
             "startingNode", readComplex(() -> NodeId.staticParse(readBuffer), readBuffer));
 
-    ExtensionObjectDefinition relativePath =
+    RelativePath relativePath =
         readSimpleField(
             "relativePath",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("542")),
+                () -> (RelativePath) ExtensionObjectDefinition.staticParse(readBuffer, (int) (542)),
                 readBuffer));
 
     readBuffer.closeContext("BrowsePath");
@@ -121,9 +121,9 @@ public class BrowsePath extends ExtensionObjectDefinition implements Message {
   public static class BrowsePathBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final NodeId startingNode;
-    private final ExtensionObjectDefinition relativePath;
+    private final RelativePath relativePath;
 
-    public BrowsePathBuilderImpl(NodeId startingNode, ExtensionObjectDefinition relativePath) {
+    public BrowsePathBuilderImpl(NodeId startingNode, RelativePath relativePath) {
       this.startingNode = startingNode;
       this.relativePath = relativePath;
     }
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathResult.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathResult.java
index 5c9e0eae0d..983a538d61 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathResult.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathResult.java
@@ -38,20 +38,17 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowsePathResult extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "551";
+  public Integer getExtensionId() {
+    return (int) 551;
   }
 
   // Properties.
   protected final StatusCode statusCode;
-  protected final int noOfTargets;
-  protected final List<ExtensionObjectDefinition> targets;
+  protected final List<BrowsePathTarget> targets;
 
-  public BrowsePathResult(
-      StatusCode statusCode, int noOfTargets, List<ExtensionObjectDefinition> targets) {
+  public BrowsePathResult(StatusCode statusCode, List<BrowsePathTarget> targets) {
     super();
     this.statusCode = statusCode;
-    this.noOfTargets = noOfTargets;
     this.targets = targets;
   }
 
@@ -59,11 +56,7 @@ public class BrowsePathResult extends ExtensionObjectDefinition implements Messa
     return statusCode;
   }
 
-  public int getNoOfTargets() {
-    return noOfTargets;
-  }
-
-  public List<ExtensionObjectDefinition> getTargets() {
+  public List<BrowsePathTarget> getTargets() {
     return targets;
   }
 
@@ -77,8 +70,10 @@ public class BrowsePathResult extends ExtensionObjectDefinition implements Messa
     // Simple Field (statusCode)
     writeSimpleField("statusCode", statusCode, writeComplex(writeBuffer));
 
-    // Simple Field (noOfTargets)
-    writeSimpleField("noOfTargets", noOfTargets, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfTargets) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfTargets = (int) ((((getTargets()) == (null)) ? -(1) : COUNT(getTargets())));
+    writeImplicitField("noOfTargets", noOfTargets, writeSignedInt(writeBuffer, 32));
 
     // Array Field (targets)
     writeComplexTypeArrayField("targets", targets, writeBuffer);
@@ -100,13 +95,13 @@ public class BrowsePathResult extends ExtensionObjectDefinition implements Messa
     // Simple field (statusCode)
     lengthInBits += statusCode.getLengthInBits();
 
-    // Simple field (noOfTargets)
+    // Implicit Field (noOfTargets)
     lengthInBits += 32;
 
     // Array field
     if (targets != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : targets) {
+      for (BrowsePathTarget element : targets) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= targets.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -116,7 +111,7 @@ public class BrowsePathResult extends ExtensionObjectDefinition implements Messa
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowsePathResult");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -125,36 +120,35 @@ public class BrowsePathResult extends ExtensionObjectDefinition implements Messa
         readSimpleField(
             "statusCode", readComplex(() -> StatusCode.staticParse(readBuffer), readBuffer));
 
-    int noOfTargets = readSimpleField("noOfTargets", readSignedInt(readBuffer, 32));
+    int noOfTargets = readImplicitField("noOfTargets", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> targets =
+    List<BrowsePathTarget> targets =
         readCountArrayField(
             "targets",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("548")),
+                () ->
+                    (BrowsePathTarget)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (548)),
                 readBuffer),
             noOfTargets);
 
     readBuffer.closeContext("BrowsePathResult");
     // Create the instance
-    return new BrowsePathResultBuilderImpl(statusCode, noOfTargets, targets);
+    return new BrowsePathResultBuilderImpl(statusCode, targets);
   }
 
   public static class BrowsePathResultBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final StatusCode statusCode;
-    private final int noOfTargets;
-    private final List<ExtensionObjectDefinition> targets;
+    private final List<BrowsePathTarget> targets;
 
-    public BrowsePathResultBuilderImpl(
-        StatusCode statusCode, int noOfTargets, List<ExtensionObjectDefinition> targets) {
+    public BrowsePathResultBuilderImpl(StatusCode statusCode, List<BrowsePathTarget> targets) {
       this.statusCode = statusCode;
-      this.noOfTargets = noOfTargets;
       this.targets = targets;
     }
 
     public BrowsePathResult build() {
-      BrowsePathResult browsePathResult = new BrowsePathResult(statusCode, noOfTargets, targets);
+      BrowsePathResult browsePathResult = new BrowsePathResult(statusCode, targets);
       return browsePathResult;
     }
   }
@@ -169,7 +163,6 @@ public class BrowsePathResult extends ExtensionObjectDefinition implements Messa
     }
     BrowsePathResult that = (BrowsePathResult) o;
     return (getStatusCode() == that.getStatusCode())
-        && (getNoOfTargets() == that.getNoOfTargets())
         && (getTargets() == that.getTargets())
         && super.equals(that)
         && true;
@@ -177,7 +170,7 @@ public class BrowsePathResult extends ExtensionObjectDefinition implements Messa
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getStatusCode(), getNoOfTargets(), getTargets());
+    return Objects.hash(super.hashCode(), getStatusCode(), getTargets());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathTarget.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathTarget.java
index ef040cc2e1..2fba29bc9b 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathTarget.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowsePathTarget.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowsePathTarget extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "548";
+  public Integer getExtensionId() {
+    return (int) 548;
   }
 
   // Properties.
@@ -97,7 +97,7 @@ public class BrowsePathTarget extends ExtensionObjectDefinition implements Messa
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowsePathTarget");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseRequest.java
index d5ca73bc66..cc3adfe290 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseRequest.java
@@ -38,36 +38,33 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowseRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "527";
+  public Integer getExtensionId() {
+    return (int) 527;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
-  protected final ExtensionObjectDefinition view;
+  protected final RequestHeader requestHeader;
+  protected final ViewDescription view;
   protected final long requestedMaxReferencesPerNode;
-  protected final int noOfNodesToBrowse;
-  protected final List<ExtensionObjectDefinition> nodesToBrowse;
+  protected final List<BrowseDescription> nodesToBrowse;
 
   public BrowseRequest(
-      ExtensionObjectDefinition requestHeader,
-      ExtensionObjectDefinition view,
+      RequestHeader requestHeader,
+      ViewDescription view,
       long requestedMaxReferencesPerNode,
-      int noOfNodesToBrowse,
-      List<ExtensionObjectDefinition> nodesToBrowse) {
+      List<BrowseDescription> nodesToBrowse) {
     super();
     this.requestHeader = requestHeader;
     this.view = view;
     this.requestedMaxReferencesPerNode = requestedMaxReferencesPerNode;
-    this.noOfNodesToBrowse = noOfNodesToBrowse;
     this.nodesToBrowse = nodesToBrowse;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
-  public ExtensionObjectDefinition getView() {
+  public ViewDescription getView() {
     return view;
   }
 
@@ -75,11 +72,7 @@ public class BrowseRequest extends ExtensionObjectDefinition implements Message
     return requestedMaxReferencesPerNode;
   }
 
-  public int getNoOfNodesToBrowse() {
-    return noOfNodesToBrowse;
-  }
-
-  public List<ExtensionObjectDefinition> getNodesToBrowse() {
+  public List<BrowseDescription> getNodesToBrowse() {
     return nodesToBrowse;
   }
 
@@ -102,8 +95,11 @@ public class BrowseRequest extends ExtensionObjectDefinition implements Message
         requestedMaxReferencesPerNode,
         writeUnsignedLong(writeBuffer, 32));
 
-    // Simple Field (noOfNodesToBrowse)
-    writeSimpleField("noOfNodesToBrowse", noOfNodesToBrowse, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfNodesToBrowse) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfNodesToBrowse =
+        (int) ((((getNodesToBrowse()) == (null)) ? -(1) : COUNT(getNodesToBrowse())));
+    writeImplicitField("noOfNodesToBrowse", noOfNodesToBrowse, writeSignedInt(writeBuffer, 32));
 
     // Array Field (nodesToBrowse)
     writeComplexTypeArrayField("nodesToBrowse", nodesToBrowse, writeBuffer);
@@ -131,13 +127,13 @@ public class BrowseRequest extends ExtensionObjectDefinition implements Message
     // Simple field (requestedMaxReferencesPerNode)
     lengthInBits += 32;
 
-    // Simple field (noOfNodesToBrowse)
+    // Implicit Field (noOfNodesToBrowse)
     lengthInBits += 32;
 
     // Array field
     if (nodesToBrowse != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : nodesToBrowse) {
+      for (BrowseDescription element : nodesToBrowse) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= nodesToBrowse.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -147,69 +143,70 @@ public class BrowseRequest extends ExtensionObjectDefinition implements Message
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowseRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
-    ExtensionObjectDefinition view =
+    ViewDescription view =
         readSimpleField(
             "view",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("513")),
+                () ->
+                    (ViewDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (513)),
                 readBuffer));
 
     long requestedMaxReferencesPerNode =
         readSimpleField("requestedMaxReferencesPerNode", readUnsignedLong(readBuffer, 32));
 
-    int noOfNodesToBrowse = readSimpleField("noOfNodesToBrowse", readSignedInt(readBuffer, 32));
+    int noOfNodesToBrowse = readImplicitField("noOfNodesToBrowse", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> nodesToBrowse =
+    List<BrowseDescription> nodesToBrowse =
         readCountArrayField(
             "nodesToBrowse",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("516")),
+                () ->
+                    (BrowseDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (516)),
                 readBuffer),
             noOfNodesToBrowse);
 
     readBuffer.closeContext("BrowseRequest");
     // Create the instance
     return new BrowseRequestBuilderImpl(
-        requestHeader, view, requestedMaxReferencesPerNode, noOfNodesToBrowse, nodesToBrowse);
+        requestHeader, view, requestedMaxReferencesPerNode, nodesToBrowse);
   }
 
   public static class BrowseRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
-    private final ExtensionObjectDefinition view;
+    private final RequestHeader requestHeader;
+    private final ViewDescription view;
     private final long requestedMaxReferencesPerNode;
-    private final int noOfNodesToBrowse;
-    private final List<ExtensionObjectDefinition> nodesToBrowse;
+    private final List<BrowseDescription> nodesToBrowse;
 
     public BrowseRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
-        ExtensionObjectDefinition view,
+        RequestHeader requestHeader,
+        ViewDescription view,
         long requestedMaxReferencesPerNode,
-        int noOfNodesToBrowse,
-        List<ExtensionObjectDefinition> nodesToBrowse) {
+        List<BrowseDescription> nodesToBrowse) {
       this.requestHeader = requestHeader;
       this.view = view;
       this.requestedMaxReferencesPerNode = requestedMaxReferencesPerNode;
-      this.noOfNodesToBrowse = noOfNodesToBrowse;
       this.nodesToBrowse = nodesToBrowse;
     }
 
     public BrowseRequest build() {
       BrowseRequest browseRequest =
-          new BrowseRequest(
-              requestHeader, view, requestedMaxReferencesPerNode, noOfNodesToBrowse, nodesToBrowse);
+          new BrowseRequest(requestHeader, view, requestedMaxReferencesPerNode, nodesToBrowse);
       return browseRequest;
     }
   }
@@ -226,7 +223,6 @@ public class BrowseRequest extends ExtensionObjectDefinition implements Message
     return (getRequestHeader() == that.getRequestHeader())
         && (getView() == that.getView())
         && (getRequestedMaxReferencesPerNode() == that.getRequestedMaxReferencesPerNode())
-        && (getNoOfNodesToBrowse() == that.getNoOfNodesToBrowse())
         && (getNodesToBrowse() == that.getNodesToBrowse())
         && super.equals(that)
         && true;
@@ -239,7 +235,6 @@ public class BrowseRequest extends ExtensionObjectDefinition implements Message
         getRequestHeader(),
         getView(),
         getRequestedMaxReferencesPerNode(),
-        getNoOfNodesToBrowse(),
         getNodesToBrowse());
   }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResponse.java
index 41446d0960..a1f346bd25 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResponse.java
@@ -38,47 +38,33 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowseResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "530";
+  public Integer getExtensionId() {
+    return (int) 530;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
-  protected final int noOfResults;
-  protected final List<ExtensionObjectDefinition> results;
-  protected final int noOfDiagnosticInfos;
+  protected final ResponseHeader responseHeader;
+  protected final List<BrowseResult> results;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public BrowseResponse(
-      ExtensionObjectDefinition responseHeader,
-      int noOfResults,
-      List<ExtensionObjectDefinition> results,
-      int noOfDiagnosticInfos,
+      ResponseHeader responseHeader,
+      List<BrowseResult> results,
       List<DiagnosticInfo> diagnosticInfos) {
     super();
     this.responseHeader = responseHeader;
-    this.noOfResults = noOfResults;
     this.results = results;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
-  public int getNoOfResults() {
-    return noOfResults;
-  }
-
-  public List<ExtensionObjectDefinition> getResults() {
+  public List<BrowseResult> getResults() {
     return results;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -93,14 +79,19 @@ public class BrowseResponse extends ExtensionObjectDefinition implements Message
     // Simple Field (responseHeader)
     writeSimpleField("responseHeader", responseHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfResults)
-    writeSimpleField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfResults = (int) ((((getResults()) == (null)) ? -(1) : COUNT(getResults())));
+    writeImplicitField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (results)
     writeComplexTypeArrayField("results", results, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -122,19 +113,19 @@ public class BrowseResponse extends ExtensionObjectDefinition implements Message
     // Simple field (responseHeader)
     lengthInBits += responseHeader.getLengthInBits();
 
-    // Simple field (noOfResults)
+    // Implicit Field (noOfResults)
     lengthInBits += 32;
 
     // Array field
     if (results != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : results) {
+      for (BrowseResult element : results) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= results.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -150,29 +141,31 @@ public class BrowseResponse extends ExtensionObjectDefinition implements Message
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowseResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
-    int noOfResults = readSimpleField("noOfResults", readSignedInt(readBuffer, 32));
+    int noOfResults = readImplicitField("noOfResults", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> results =
+    List<BrowseResult> results =
         readCountArrayField(
             "results",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("524")),
+                () -> (BrowseResult) ExtensionObjectDefinition.staticParse(readBuffer, (int) (524)),
                 readBuffer),
             noOfResults);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -182,35 +175,26 @@ public class BrowseResponse extends ExtensionObjectDefinition implements Message
 
     readBuffer.closeContext("BrowseResponse");
     // Create the instance
-    return new BrowseResponseBuilderImpl(
-        responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+    return new BrowseResponseBuilderImpl(responseHeader, results, diagnosticInfos);
   }
 
   public static class BrowseResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
-    private final int noOfResults;
-    private final List<ExtensionObjectDefinition> results;
-    private final int noOfDiagnosticInfos;
+    private final ResponseHeader responseHeader;
+    private final List<BrowseResult> results;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public BrowseResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
-        int noOfResults,
-        List<ExtensionObjectDefinition> results,
-        int noOfDiagnosticInfos,
+        ResponseHeader responseHeader,
+        List<BrowseResult> results,
         List<DiagnosticInfo> diagnosticInfos) {
       this.responseHeader = responseHeader;
-      this.noOfResults = noOfResults;
       this.results = results;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public BrowseResponse build() {
-      BrowseResponse browseResponse =
-          new BrowseResponse(
-              responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+      BrowseResponse browseResponse = new BrowseResponse(responseHeader, results, diagnosticInfos);
       return browseResponse;
     }
   }
@@ -225,9 +209,7 @@ public class BrowseResponse extends ExtensionObjectDefinition implements Message
     }
     BrowseResponse that = (BrowseResponse) o;
     return (getResponseHeader() == that.getResponseHeader())
-        && (getNoOfResults() == that.getNoOfResults())
         && (getResults() == that.getResults())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -235,13 +217,7 @@ public class BrowseResponse extends ExtensionObjectDefinition implements Message
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getResponseHeader(),
-        getNoOfResults(),
-        getResults(),
-        getNoOfDiagnosticInfos(),
-        getDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getResponseHeader(), getResults(), getDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResult.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResult.java
index ce2153b706..87883a9220 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResult.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BrowseResult.java
@@ -38,25 +38,22 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BrowseResult extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "524";
+  public Integer getExtensionId() {
+    return (int) 524;
   }
 
   // Properties.
   protected final StatusCode statusCode;
   protected final PascalByteString continuationPoint;
-  protected final int noOfReferences;
-  protected final List<ExtensionObjectDefinition> references;
+  protected final List<ReferenceDescription> references;
 
   public BrowseResult(
       StatusCode statusCode,
       PascalByteString continuationPoint,
-      int noOfReferences,
-      List<ExtensionObjectDefinition> references) {
+      List<ReferenceDescription> references) {
     super();
     this.statusCode = statusCode;
     this.continuationPoint = continuationPoint;
-    this.noOfReferences = noOfReferences;
     this.references = references;
   }
 
@@ -68,11 +65,7 @@ public class BrowseResult extends ExtensionObjectDefinition implements Message {
     return continuationPoint;
   }
 
-  public int getNoOfReferences() {
-    return noOfReferences;
-  }
-
-  public List<ExtensionObjectDefinition> getReferences() {
+  public List<ReferenceDescription> getReferences() {
     return references;
   }
 
@@ -89,8 +82,10 @@ public class BrowseResult extends ExtensionObjectDefinition implements Message {
     // Simple Field (continuationPoint)
     writeSimpleField("continuationPoint", continuationPoint, writeComplex(writeBuffer));
 
-    // Simple Field (noOfReferences)
-    writeSimpleField("noOfReferences", noOfReferences, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfReferences) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfReferences = (int) ((((getReferences()) == (null)) ? -(1) : COUNT(getReferences())));
+    writeImplicitField("noOfReferences", noOfReferences, writeSignedInt(writeBuffer, 32));
 
     // Array Field (references)
     writeComplexTypeArrayField("references", references, writeBuffer);
@@ -115,13 +110,13 @@ public class BrowseResult extends ExtensionObjectDefinition implements Message {
     // Simple field (continuationPoint)
     lengthInBits += continuationPoint.getLengthInBits();
 
-    // Simple field (noOfReferences)
+    // Implicit Field (noOfReferences)
     lengthInBits += 32;
 
     // Array field
     if (references != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : references) {
+      for (ReferenceDescription element : references) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= references.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -131,7 +126,7 @@ public class BrowseResult extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BrowseResult");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -145,42 +140,40 @@ public class BrowseResult extends ExtensionObjectDefinition implements Message {
             "continuationPoint",
             readComplex(() -> PascalByteString.staticParse(readBuffer), readBuffer));
 
-    int noOfReferences = readSimpleField("noOfReferences", readSignedInt(readBuffer, 32));
+    int noOfReferences = readImplicitField("noOfReferences", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> references =
+    List<ReferenceDescription> references =
         readCountArrayField(
             "references",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("520")),
+                () ->
+                    (ReferenceDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (520)),
                 readBuffer),
             noOfReferences);
 
     readBuffer.closeContext("BrowseResult");
     // Create the instance
-    return new BrowseResultBuilderImpl(statusCode, continuationPoint, noOfReferences, references);
+    return new BrowseResultBuilderImpl(statusCode, continuationPoint, references);
   }
 
   public static class BrowseResultBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final StatusCode statusCode;
     private final PascalByteString continuationPoint;
-    private final int noOfReferences;
-    private final List<ExtensionObjectDefinition> references;
+    private final List<ReferenceDescription> references;
 
     public BrowseResultBuilderImpl(
         StatusCode statusCode,
         PascalByteString continuationPoint,
-        int noOfReferences,
-        List<ExtensionObjectDefinition> references) {
+        List<ReferenceDescription> references) {
       this.statusCode = statusCode;
       this.continuationPoint = continuationPoint;
-      this.noOfReferences = noOfReferences;
       this.references = references;
     }
 
     public BrowseResult build() {
-      BrowseResult browseResult =
-          new BrowseResult(statusCode, continuationPoint, noOfReferences, references);
+      BrowseResult browseResult = new BrowseResult(statusCode, continuationPoint, references);
       return browseResult;
     }
   }
@@ -196,7 +189,6 @@ public class BrowseResult extends ExtensionObjectDefinition implements Message {
     BrowseResult that = (BrowseResult) o;
     return (getStatusCode() == that.getStatusCode())
         && (getContinuationPoint() == that.getContinuationPoint())
-        && (getNoOfReferences() == that.getNoOfReferences())
         && (getReferences() == that.getReferences())
         && super.equals(that)
         && true;
@@ -204,12 +196,7 @@ public class BrowseResult extends ExtensionObjectDefinition implements Message {
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getStatusCode(),
-        getContinuationPoint(),
-        getNoOfReferences(),
-        getReferences());
+    return Objects.hash(super.hashCode(), getStatusCode(), getContinuationPoint(), getReferences());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BuildInfo.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BuildInfo.java
index 090b9097b5..6924995862 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BuildInfo.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/BuildInfo.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class BuildInfo extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "340";
+  public Integer getExtensionId() {
+    return (int) 340;
   }
 
   // Properties.
@@ -151,7 +151,7 @@ public class BuildInfo extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("BuildInfo");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodRequest.java
index e184122dbe..ad7164f65d 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodRequest.java
@@ -38,22 +38,19 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CallMethodRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "706";
+  public Integer getExtensionId() {
+    return (int) 706;
   }
 
   // Properties.
   protected final NodeId objectId;
   protected final NodeId methodId;
-  protected final int noOfInputArguments;
   protected final List<Variant> inputArguments;
 
-  public CallMethodRequest(
-      NodeId objectId, NodeId methodId, int noOfInputArguments, List<Variant> inputArguments) {
+  public CallMethodRequest(NodeId objectId, NodeId methodId, List<Variant> inputArguments) {
     super();
     this.objectId = objectId;
     this.methodId = methodId;
-    this.noOfInputArguments = noOfInputArguments;
     this.inputArguments = inputArguments;
   }
 
@@ -65,10 +62,6 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
     return methodId;
   }
 
-  public int getNoOfInputArguments() {
-    return noOfInputArguments;
-  }
-
   public List<Variant> getInputArguments() {
     return inputArguments;
   }
@@ -86,8 +79,11 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
     // Simple Field (methodId)
     writeSimpleField("methodId", methodId, writeComplex(writeBuffer));
 
-    // Simple Field (noOfInputArguments)
-    writeSimpleField("noOfInputArguments", noOfInputArguments, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfInputArguments) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfInputArguments =
+        (int) ((((getInputArguments()) == (null)) ? -(1) : COUNT(getInputArguments())));
+    writeImplicitField("noOfInputArguments", noOfInputArguments, writeSignedInt(writeBuffer, 32));
 
     // Array Field (inputArguments)
     writeComplexTypeArrayField("inputArguments", inputArguments, writeBuffer);
@@ -112,7 +108,7 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
     // Simple field (methodId)
     lengthInBits += methodId.getLengthInBits();
 
-    // Simple field (noOfInputArguments)
+    // Implicit Field (noOfInputArguments)
     lengthInBits += 32;
 
     // Array field
@@ -128,7 +124,7 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CallMethodRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -139,7 +135,7 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
     NodeId methodId =
         readSimpleField("methodId", readComplex(() -> NodeId.staticParse(readBuffer), readBuffer));
 
-    int noOfInputArguments = readSimpleField("noOfInputArguments", readSignedInt(readBuffer, 32));
+    int noOfInputArguments = readImplicitField("noOfInputArguments", readSignedInt(readBuffer, 32));
 
     List<Variant> inputArguments =
         readCountArrayField(
@@ -149,27 +145,25 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
 
     readBuffer.closeContext("CallMethodRequest");
     // Create the instance
-    return new CallMethodRequestBuilderImpl(objectId, methodId, noOfInputArguments, inputArguments);
+    return new CallMethodRequestBuilderImpl(objectId, methodId, inputArguments);
   }
 
   public static class CallMethodRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final NodeId objectId;
     private final NodeId methodId;
-    private final int noOfInputArguments;
     private final List<Variant> inputArguments;
 
     public CallMethodRequestBuilderImpl(
-        NodeId objectId, NodeId methodId, int noOfInputArguments, List<Variant> inputArguments) {
+        NodeId objectId, NodeId methodId, List<Variant> inputArguments) {
       this.objectId = objectId;
       this.methodId = methodId;
-      this.noOfInputArguments = noOfInputArguments;
       this.inputArguments = inputArguments;
     }
 
     public CallMethodRequest build() {
       CallMethodRequest callMethodRequest =
-          new CallMethodRequest(objectId, methodId, noOfInputArguments, inputArguments);
+          new CallMethodRequest(objectId, methodId, inputArguments);
       return callMethodRequest;
     }
   }
@@ -185,7 +179,6 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
     CallMethodRequest that = (CallMethodRequest) o;
     return (getObjectId() == that.getObjectId())
         && (getMethodId() == that.getMethodId())
-        && (getNoOfInputArguments() == that.getNoOfInputArguments())
         && (getInputArguments() == that.getInputArguments())
         && super.equals(that)
         && true;
@@ -193,12 +186,7 @@ public class CallMethodRequest extends ExtensionObjectDefinition implements Mess
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getObjectId(),
-        getMethodId(),
-        getNoOfInputArguments(),
-        getInputArguments());
+    return Objects.hash(super.hashCode(), getObjectId(), getMethodId(), getInputArguments());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodResult.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodResult.java
index 7fec8b0801..d37c8d081c 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodResult.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallMethodResult.java
@@ -38,34 +38,25 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CallMethodResult extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "709";
+  public Integer getExtensionId() {
+    return (int) 709;
   }
 
   // Properties.
   protected final StatusCode statusCode;
-  protected final int noOfInputArgumentResults;
   protected final List<StatusCode> inputArgumentResults;
-  protected final int noOfInputArgumentDiagnosticInfos;
   protected final List<DiagnosticInfo> inputArgumentDiagnosticInfos;
-  protected final int noOfOutputArguments;
   protected final List<Variant> outputArguments;
 
   public CallMethodResult(
       StatusCode statusCode,
-      int noOfInputArgumentResults,
       List<StatusCode> inputArgumentResults,
-      int noOfInputArgumentDiagnosticInfos,
       List<DiagnosticInfo> inputArgumentDiagnosticInfos,
-      int noOfOutputArguments,
       List<Variant> outputArguments) {
     super();
     this.statusCode = statusCode;
-    this.noOfInputArgumentResults = noOfInputArgumentResults;
     this.inputArgumentResults = inputArgumentResults;
-    this.noOfInputArgumentDiagnosticInfos = noOfInputArgumentDiagnosticInfos;
     this.inputArgumentDiagnosticInfos = inputArgumentDiagnosticInfos;
-    this.noOfOutputArguments = noOfOutputArguments;
     this.outputArguments = outputArguments;
   }
 
@@ -73,26 +64,14 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
     return statusCode;
   }
 
-  public int getNoOfInputArgumentResults() {
-    return noOfInputArgumentResults;
-  }
-
   public List<StatusCode> getInputArgumentResults() {
     return inputArgumentResults;
   }
 
-  public int getNoOfInputArgumentDiagnosticInfos() {
-    return noOfInputArgumentDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getInputArgumentDiagnosticInfos() {
     return inputArgumentDiagnosticInfos;
   }
 
-  public int getNoOfOutputArguments() {
-    return noOfOutputArguments;
-  }
-
   public List<Variant> getOutputArguments() {
     return outputArguments;
   }
@@ -107,15 +86,24 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
     // Simple Field (statusCode)
     writeSimpleField("statusCode", statusCode, writeComplex(writeBuffer));
 
-    // Simple Field (noOfInputArgumentResults)
-    writeSimpleField(
+    // Implicit Field (noOfInputArgumentResults) (Used for parsing, but its value is not stored as
+    // it's implicitly given by the objects content)
+    int noOfInputArgumentResults =
+        (int) ((((getInputArgumentResults()) == (null)) ? -(1) : COUNT(getInputArgumentResults())));
+    writeImplicitField(
         "noOfInputArgumentResults", noOfInputArgumentResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (inputArgumentResults)
     writeComplexTypeArrayField("inputArgumentResults", inputArgumentResults, writeBuffer);
 
-    // Simple Field (noOfInputArgumentDiagnosticInfos)
-    writeSimpleField(
+    // Implicit Field (noOfInputArgumentDiagnosticInfos) (Used for parsing, but its value is not
+    // stored as it's implicitly given by the objects content)
+    int noOfInputArgumentDiagnosticInfos =
+        (int)
+            ((((getInputArgumentDiagnosticInfos()) == (null))
+                ? -(1)
+                : COUNT(getInputArgumentDiagnosticInfos())));
+    writeImplicitField(
         "noOfInputArgumentDiagnosticInfos",
         noOfInputArgumentDiagnosticInfos,
         writeSignedInt(writeBuffer, 32));
@@ -124,8 +112,11 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
     writeComplexTypeArrayField(
         "inputArgumentDiagnosticInfos", inputArgumentDiagnosticInfos, writeBuffer);
 
-    // Simple Field (noOfOutputArguments)
-    writeSimpleField("noOfOutputArguments", noOfOutputArguments, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfOutputArguments) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfOutputArguments =
+        (int) ((((getOutputArguments()) == (null)) ? -(1) : COUNT(getOutputArguments())));
+    writeImplicitField("noOfOutputArguments", noOfOutputArguments, writeSignedInt(writeBuffer, 32));
 
     // Array Field (outputArguments)
     writeComplexTypeArrayField("outputArguments", outputArguments, writeBuffer);
@@ -147,7 +138,7 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
     // Simple field (statusCode)
     lengthInBits += statusCode.getLengthInBits();
 
-    // Simple field (noOfInputArgumentResults)
+    // Implicit Field (noOfInputArgumentResults)
     lengthInBits += 32;
 
     // Array field
@@ -159,7 +150,7 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
       }
     }
 
-    // Simple field (noOfInputArgumentDiagnosticInfos)
+    // Implicit Field (noOfInputArgumentDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -171,7 +162,7 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
       }
     }
 
-    // Simple field (noOfOutputArguments)
+    // Implicit Field (noOfOutputArguments)
     lengthInBits += 32;
 
     // Array field
@@ -187,7 +178,7 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CallMethodResult");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -197,7 +188,7 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
             "statusCode", readComplex(() -> StatusCode.staticParse(readBuffer), readBuffer));
 
     int noOfInputArgumentResults =
-        readSimpleField("noOfInputArgumentResults", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfInputArgumentResults", readSignedInt(readBuffer, 32));
 
     List<StatusCode> inputArgumentResults =
         readCountArrayField(
@@ -206,7 +197,7 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
             noOfInputArgumentResults);
 
     int noOfInputArgumentDiagnosticInfos =
-        readSimpleField("noOfInputArgumentDiagnosticInfos", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfInputArgumentDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> inputArgumentDiagnosticInfos =
         readCountArrayField(
@@ -214,7 +205,8 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
             readComplex(() -> DiagnosticInfo.staticParse(readBuffer), readBuffer),
             noOfInputArgumentDiagnosticInfos);
 
-    int noOfOutputArguments = readSimpleField("noOfOutputArguments", readSignedInt(readBuffer, 32));
+    int noOfOutputArguments =
+        readImplicitField("noOfOutputArguments", readSignedInt(readBuffer, 32));
 
     List<Variant> outputArguments =
         readCountArrayField(
@@ -225,52 +217,31 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
     readBuffer.closeContext("CallMethodResult");
     // Create the instance
     return new CallMethodResultBuilderImpl(
-        statusCode,
-        noOfInputArgumentResults,
-        inputArgumentResults,
-        noOfInputArgumentDiagnosticInfos,
-        inputArgumentDiagnosticInfos,
-        noOfOutputArguments,
-        outputArguments);
+        statusCode, inputArgumentResults, inputArgumentDiagnosticInfos, outputArguments);
   }
 
   public static class CallMethodResultBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final StatusCode statusCode;
-    private final int noOfInputArgumentResults;
     private final List<StatusCode> inputArgumentResults;
-    private final int noOfInputArgumentDiagnosticInfos;
     private final List<DiagnosticInfo> inputArgumentDiagnosticInfos;
-    private final int noOfOutputArguments;
     private final List<Variant> outputArguments;
 
     public CallMethodResultBuilderImpl(
         StatusCode statusCode,
-        int noOfInputArgumentResults,
         List<StatusCode> inputArgumentResults,
-        int noOfInputArgumentDiagnosticInfos,
         List<DiagnosticInfo> inputArgumentDiagnosticInfos,
-        int noOfOutputArguments,
         List<Variant> outputArguments) {
       this.statusCode = statusCode;
-      this.noOfInputArgumentResults = noOfInputArgumentResults;
       this.inputArgumentResults = inputArgumentResults;
-      this.noOfInputArgumentDiagnosticInfos = noOfInputArgumentDiagnosticInfos;
       this.inputArgumentDiagnosticInfos = inputArgumentDiagnosticInfos;
-      this.noOfOutputArguments = noOfOutputArguments;
       this.outputArguments = outputArguments;
     }
 
     public CallMethodResult build() {
       CallMethodResult callMethodResult =
           new CallMethodResult(
-              statusCode,
-              noOfInputArgumentResults,
-              inputArgumentResults,
-              noOfInputArgumentDiagnosticInfos,
-              inputArgumentDiagnosticInfos,
-              noOfOutputArguments,
-              outputArguments);
+              statusCode, inputArgumentResults, inputArgumentDiagnosticInfos, outputArguments);
       return callMethodResult;
     }
   }
@@ -285,11 +256,8 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
     }
     CallMethodResult that = (CallMethodResult) o;
     return (getStatusCode() == that.getStatusCode())
-        && (getNoOfInputArgumentResults() == that.getNoOfInputArgumentResults())
         && (getInputArgumentResults() == that.getInputArgumentResults())
-        && (getNoOfInputArgumentDiagnosticInfos() == that.getNoOfInputArgumentDiagnosticInfos())
         && (getInputArgumentDiagnosticInfos() == that.getInputArgumentDiagnosticInfos())
-        && (getNoOfOutputArguments() == that.getNoOfOutputArguments())
         && (getOutputArguments() == that.getOutputArguments())
         && super.equals(that)
         && true;
@@ -300,11 +268,8 @@ public class CallMethodResult extends ExtensionObjectDefinition implements Messa
     return Objects.hash(
         super.hashCode(),
         getStatusCode(),
-        getNoOfInputArgumentResults(),
         getInputArgumentResults(),
-        getNoOfInputArgumentDiagnosticInfos(),
         getInputArgumentDiagnosticInfos(),
-        getNoOfOutputArguments(),
         getOutputArguments());
   }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallRequest.java
index 30b5f975df..591029b902 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallRequest.java
@@ -38,34 +38,25 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CallRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "712";
+  public Integer getExtensionId() {
+    return (int) 712;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
-  protected final int noOfMethodsToCall;
-  protected final List<ExtensionObjectDefinition> methodsToCall;
-
-  public CallRequest(
-      ExtensionObjectDefinition requestHeader,
-      int noOfMethodsToCall,
-      List<ExtensionObjectDefinition> methodsToCall) {
+  protected final RequestHeader requestHeader;
+  protected final List<CallMethodRequest> methodsToCall;
+
+  public CallRequest(RequestHeader requestHeader, List<CallMethodRequest> methodsToCall) {
     super();
     this.requestHeader = requestHeader;
-    this.noOfMethodsToCall = noOfMethodsToCall;
     this.methodsToCall = methodsToCall;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
-  public int getNoOfMethodsToCall() {
-    return noOfMethodsToCall;
-  }
-
-  public List<ExtensionObjectDefinition> getMethodsToCall() {
+  public List<CallMethodRequest> getMethodsToCall() {
     return methodsToCall;
   }
 
@@ -79,8 +70,11 @@ public class CallRequest extends ExtensionObjectDefinition implements Message {
     // Simple Field (requestHeader)
     writeSimpleField("requestHeader", requestHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfMethodsToCall)
-    writeSimpleField("noOfMethodsToCall", noOfMethodsToCall, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfMethodsToCall) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfMethodsToCall =
+        (int) ((((getMethodsToCall()) == (null)) ? -(1) : COUNT(getMethodsToCall())));
+    writeImplicitField("noOfMethodsToCall", noOfMethodsToCall, writeSignedInt(writeBuffer, 32));
 
     // Array Field (methodsToCall)
     writeComplexTypeArrayField("methodsToCall", methodsToCall, writeBuffer);
@@ -102,13 +96,13 @@ public class CallRequest extends ExtensionObjectDefinition implements Message {
     // Simple field (requestHeader)
     lengthInBits += requestHeader.getLengthInBits();
 
-    // Simple field (noOfMethodsToCall)
+    // Implicit Field (noOfMethodsToCall)
     lengthInBits += 32;
 
     // Array field
     if (methodsToCall != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : methodsToCall) {
+      for (CallMethodRequest element : methodsToCall) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= methodsToCall.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -118,50 +112,49 @@ public class CallRequest extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CallRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
-    int noOfMethodsToCall = readSimpleField("noOfMethodsToCall", readSignedInt(readBuffer, 32));
+    int noOfMethodsToCall = readImplicitField("noOfMethodsToCall", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> methodsToCall =
+    List<CallMethodRequest> methodsToCall =
         readCountArrayField(
             "methodsToCall",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("706")),
+                () ->
+                    (CallMethodRequest)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (706)),
                 readBuffer),
             noOfMethodsToCall);
 
     readBuffer.closeContext("CallRequest");
     // Create the instance
-    return new CallRequestBuilderImpl(requestHeader, noOfMethodsToCall, methodsToCall);
+    return new CallRequestBuilderImpl(requestHeader, methodsToCall);
   }
 
   public static class CallRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
-    private final int noOfMethodsToCall;
-    private final List<ExtensionObjectDefinition> methodsToCall;
+    private final RequestHeader requestHeader;
+    private final List<CallMethodRequest> methodsToCall;
 
     public CallRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
-        int noOfMethodsToCall,
-        List<ExtensionObjectDefinition> methodsToCall) {
+        RequestHeader requestHeader, List<CallMethodRequest> methodsToCall) {
       this.requestHeader = requestHeader;
-      this.noOfMethodsToCall = noOfMethodsToCall;
       this.methodsToCall = methodsToCall;
     }
 
     public CallRequest build() {
-      CallRequest callRequest = new CallRequest(requestHeader, noOfMethodsToCall, methodsToCall);
+      CallRequest callRequest = new CallRequest(requestHeader, methodsToCall);
       return callRequest;
     }
   }
@@ -176,7 +169,6 @@ public class CallRequest extends ExtensionObjectDefinition implements Message {
     }
     CallRequest that = (CallRequest) o;
     return (getRequestHeader() == that.getRequestHeader())
-        && (getNoOfMethodsToCall() == that.getNoOfMethodsToCall())
         && (getMethodsToCall() == that.getMethodsToCall())
         && super.equals(that)
         && true;
@@ -184,8 +176,7 @@ public class CallRequest extends ExtensionObjectDefinition implements Message {
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(), getRequestHeader(), getNoOfMethodsToCall(), getMethodsToCall());
+    return Objects.hash(super.hashCode(), getRequestHeader(), getMethodsToCall());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallResponse.java
index 5ceb04ac06..895b6050a3 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CallResponse.java
@@ -38,47 +38,33 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CallResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "715";
+  public Integer getExtensionId() {
+    return (int) 715;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
-  protected final int noOfResults;
-  protected final List<ExtensionObjectDefinition> results;
-  protected final int noOfDiagnosticInfos;
+  protected final ResponseHeader responseHeader;
+  protected final List<CallMethodResult> results;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public CallResponse(
-      ExtensionObjectDefinition responseHeader,
-      int noOfResults,
-      List<ExtensionObjectDefinition> results,
-      int noOfDiagnosticInfos,
+      ResponseHeader responseHeader,
+      List<CallMethodResult> results,
       List<DiagnosticInfo> diagnosticInfos) {
     super();
     this.responseHeader = responseHeader;
-    this.noOfResults = noOfResults;
     this.results = results;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
-  public int getNoOfResults() {
-    return noOfResults;
-  }
-
-  public List<ExtensionObjectDefinition> getResults() {
+  public List<CallMethodResult> getResults() {
     return results;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -93,14 +79,19 @@ public class CallResponse extends ExtensionObjectDefinition implements Message {
     // Simple Field (responseHeader)
     writeSimpleField("responseHeader", responseHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfResults)
-    writeSimpleField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfResults = (int) ((((getResults()) == (null)) ? -(1) : COUNT(getResults())));
+    writeImplicitField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (results)
     writeComplexTypeArrayField("results", results, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -122,19 +113,19 @@ public class CallResponse extends ExtensionObjectDefinition implements Message {
     // Simple field (responseHeader)
     lengthInBits += responseHeader.getLengthInBits();
 
-    // Simple field (noOfResults)
+    // Implicit Field (noOfResults)
     lengthInBits += 32;
 
     // Array field
     if (results != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : results) {
+      for (CallMethodResult element : results) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= results.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -150,29 +141,33 @@ public class CallResponse extends ExtensionObjectDefinition implements Message {
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CallResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
-    int noOfResults = readSimpleField("noOfResults", readSignedInt(readBuffer, 32));
+    int noOfResults = readImplicitField("noOfResults", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> results =
+    List<CallMethodResult> results =
         readCountArrayField(
             "results",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("709")),
+                () ->
+                    (CallMethodResult)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (709)),
                 readBuffer),
             noOfResults);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -182,35 +177,26 @@ public class CallResponse extends ExtensionObjectDefinition implements Message {
 
     readBuffer.closeContext("CallResponse");
     // Create the instance
-    return new CallResponseBuilderImpl(
-        responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+    return new CallResponseBuilderImpl(responseHeader, results, diagnosticInfos);
   }
 
   public static class CallResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
-    private final int noOfResults;
-    private final List<ExtensionObjectDefinition> results;
-    private final int noOfDiagnosticInfos;
+    private final ResponseHeader responseHeader;
+    private final List<CallMethodResult> results;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public CallResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
-        int noOfResults,
-        List<ExtensionObjectDefinition> results,
-        int noOfDiagnosticInfos,
+        ResponseHeader responseHeader,
+        List<CallMethodResult> results,
         List<DiagnosticInfo> diagnosticInfos) {
       this.responseHeader = responseHeader;
-      this.noOfResults = noOfResults;
       this.results = results;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public CallResponse build() {
-      CallResponse callResponse =
-          new CallResponse(
-              responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+      CallResponse callResponse = new CallResponse(responseHeader, results, diagnosticInfos);
       return callResponse;
     }
   }
@@ -225,9 +211,7 @@ public class CallResponse extends ExtensionObjectDefinition implements Message {
     }
     CallResponse that = (CallResponse) o;
     return (getResponseHeader() == that.getResponseHeader())
-        && (getNoOfResults() == that.getNoOfResults())
         && (getResults() == that.getResults())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -235,13 +219,7 @@ public class CallResponse extends ExtensionObjectDefinition implements Message {
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getResponseHeader(),
-        getNoOfResults(),
-        getResults(),
-        getNoOfDiagnosticInfos(),
-        getDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getResponseHeader(), getResults(), getDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelRequest.java
index 8ac2d4365f..55822642a0 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelRequest.java
@@ -38,21 +38,21 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CancelRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "479";
+  public Integer getExtensionId() {
+    return (int) 479;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
+  protected final RequestHeader requestHeader;
   protected final long requestHandle;
 
-  public CancelRequest(ExtensionObjectDefinition requestHeader, long requestHandle) {
+  public CancelRequest(RequestHeader requestHeader, long requestHandle) {
     super();
     this.requestHeader = requestHeader;
     this.requestHandle = requestHandle;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
@@ -97,16 +97,17 @@ public class CancelRequest extends ExtensionObjectDefinition implements Message
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CancelRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
     long requestHandle = readSimpleField("requestHandle", readUnsignedLong(readBuffer, 32));
@@ -118,10 +119,10 @@ public class CancelRequest extends ExtensionObjectDefinition implements Message
 
   public static class CancelRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
+    private final RequestHeader requestHeader;
     private final long requestHandle;
 
-    public CancelRequestBuilderImpl(ExtensionObjectDefinition requestHeader, long requestHandle) {
+    public CancelRequestBuilderImpl(RequestHeader requestHeader, long requestHandle) {
       this.requestHeader = requestHeader;
       this.requestHandle = requestHandle;
     }
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelResponse.java
index 5a3e26e281..14454db4f0 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CancelResponse.java
@@ -38,21 +38,21 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CancelResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "482";
+  public Integer getExtensionId() {
+    return (int) 482;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
+  protected final ResponseHeader responseHeader;
   protected final long cancelCount;
 
-  public CancelResponse(ExtensionObjectDefinition responseHeader, long cancelCount) {
+  public CancelResponse(ResponseHeader responseHeader, long cancelCount) {
     super();
     this.responseHeader = responseHeader;
     this.cancelCount = cancelCount;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
@@ -97,16 +97,17 @@ public class CancelResponse extends ExtensionObjectDefinition implements Message
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CancelResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
     long cancelCount = readSimpleField("cancelCount", readUnsignedLong(readBuffer, 32));
@@ -118,10 +119,10 @@ public class CancelResponse extends ExtensionObjectDefinition implements Message
 
   public static class CancelResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
+    private final ResponseHeader responseHeader;
     private final long cancelCount;
 
-    public CancelResponseBuilderImpl(ExtensionObjectDefinition responseHeader, long cancelCount) {
+    public CancelResponseBuilderImpl(ResponseHeader responseHeader, long cancelCount) {
       this.responseHeader = responseHeader;
       this.cancelCount = cancelCount;
     }
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CartesianCoordinates.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CartesianCoordinates.java
index a3891321ef..cdce08b132 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CartesianCoordinates.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CartesianCoordinates.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CartesianCoordinates extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "18811";
+  public Integer getExtensionId() {
+    return (int) 18811;
   }
 
   public CartesianCoordinates() {
@@ -71,7 +71,7 @@ public class CartesianCoordinates extends ExtensionObjectDefinition implements M
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CartesianCoordinates");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ChannelSecurityToken.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ChannelSecurityToken.java
index d7b09b297e..aa84f8d64e 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ChannelSecurityToken.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ChannelSecurityToken.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ChannelSecurityToken extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "443";
+  public Integer getExtensionId() {
+    return (int) 443;
   }
 
   // Properties.
@@ -121,7 +121,7 @@ public class ChannelSecurityToken extends ExtensionObjectDefinition implements M
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ChannelSecurityToken");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelRequest.java
index 06f8ecb0b7..e58d37f29b 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelRequest.java
@@ -38,19 +38,19 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CloseSecureChannelRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "452";
+  public Integer getExtensionId() {
+    return (int) 452;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
+  protected final RequestHeader requestHeader;
 
-  public CloseSecureChannelRequest(ExtensionObjectDefinition requestHeader) {
+  public CloseSecureChannelRequest(RequestHeader requestHeader) {
     super();
     this.requestHeader = requestHeader;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
@@ -85,16 +85,17 @@ public class CloseSecureChannelRequest extends ExtensionObjectDefinition impleme
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CloseSecureChannelRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
     readBuffer.closeContext("CloseSecureChannelRequest");
@@ -104,9 +105,9 @@ public class CloseSecureChannelRequest extends ExtensionObjectDefinition impleme
 
   public static class CloseSecureChannelRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
+    private final RequestHeader requestHeader;
 
-    public CloseSecureChannelRequestBuilderImpl(ExtensionObjectDefinition requestHeader) {
+    public CloseSecureChannelRequestBuilderImpl(RequestHeader requestHeader) {
       this.requestHeader = requestHeader;
     }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelResponse.java
index 655be1a434..9de37d2bf6 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSecureChannelResponse.java
@@ -38,19 +38,19 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CloseSecureChannelResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "455";
+  public Integer getExtensionId() {
+    return (int) 455;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
+  protected final ResponseHeader responseHeader;
 
-  public CloseSecureChannelResponse(ExtensionObjectDefinition responseHeader) {
+  public CloseSecureChannelResponse(ResponseHeader responseHeader) {
     super();
     this.responseHeader = responseHeader;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
@@ -85,16 +85,17 @@ public class CloseSecureChannelResponse extends ExtensionObjectDefinition implem
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CloseSecureChannelResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
     readBuffer.closeContext("CloseSecureChannelResponse");
@@ -104,9 +105,9 @@ public class CloseSecureChannelResponse extends ExtensionObjectDefinition implem
 
   public static class CloseSecureChannelResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
+    private final ResponseHeader responseHeader;
 
-    public CloseSecureChannelResponseBuilderImpl(ExtensionObjectDefinition responseHeader) {
+    public CloseSecureChannelResponseBuilderImpl(ResponseHeader responseHeader) {
       this.responseHeader = responseHeader;
     }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionRequest.java
index 60f5184e5d..f226690d5e 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionRequest.java
@@ -38,21 +38,21 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CloseSessionRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "473";
+  public Integer getExtensionId() {
+    return (int) 473;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
+  protected final RequestHeader requestHeader;
   protected final boolean deleteSubscriptions;
 
-  public CloseSessionRequest(ExtensionObjectDefinition requestHeader, boolean deleteSubscriptions) {
+  public CloseSessionRequest(RequestHeader requestHeader, boolean deleteSubscriptions) {
     super();
     this.requestHeader = requestHeader;
     this.deleteSubscriptions = deleteSubscriptions;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
@@ -103,16 +103,17 @@ public class CloseSessionRequest extends ExtensionObjectDefinition implements Me
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CloseSessionRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
     Byte reservedField0 =
@@ -127,11 +128,11 @@ public class CloseSessionRequest extends ExtensionObjectDefinition implements Me
 
   public static class CloseSessionRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
+    private final RequestHeader requestHeader;
     private final boolean deleteSubscriptions;
 
     public CloseSessionRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader, boolean deleteSubscriptions) {
+        RequestHeader requestHeader, boolean deleteSubscriptions) {
       this.requestHeader = requestHeader;
       this.deleteSubscriptions = deleteSubscriptions;
     }
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionResponse.java
index af8774b51d..99d52c5572 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CloseSessionResponse.java
@@ -38,19 +38,19 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CloseSessionResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "476";
+  public Integer getExtensionId() {
+    return (int) 476;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
+  protected final ResponseHeader responseHeader;
 
-  public CloseSessionResponse(ExtensionObjectDefinition responseHeader) {
+  public CloseSessionResponse(ResponseHeader responseHeader) {
     super();
     this.responseHeader = responseHeader;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
@@ -85,16 +85,17 @@ public class CloseSessionResponse extends ExtensionObjectDefinition implements M
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CloseSessionResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
     readBuffer.closeContext("CloseSessionResponse");
@@ -104,9 +105,9 @@ public class CloseSessionResponse extends ExtensionObjectDefinition implements M
 
   public static class CloseSessionResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
+    private final ResponseHeader responseHeader;
 
-    public CloseSessionResponseBuilderImpl(ExtensionObjectDefinition responseHeader) {
+    public CloseSessionResponseBuilderImpl(ResponseHeader responseHeader) {
       this.responseHeader = responseHeader;
     }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ComplexNumberType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ComplexNumberType.java
index efa5055714..2d97a7b824 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ComplexNumberType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ComplexNumberType.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ComplexNumberType extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "12173";
+  public Integer getExtensionId() {
+    return (int) 12173;
   }
 
   // Properties.
@@ -97,7 +97,7 @@ public class ComplexNumberType extends ExtensionObjectDefinition implements Mess
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ComplexNumberType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConfigurationVersionDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConfigurationVersionDataType.java
index f4421b28be..e545d4f93f 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConfigurationVersionDataType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConfigurationVersionDataType.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ConfigurationVersionDataType extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "14595";
+  public Integer getExtensionId() {
+    return (int) 14595;
   }
 
   // Properties.
@@ -97,7 +97,7 @@ public class ConfigurationVersionDataType extends ExtensionObjectDefinition impl
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ConfigurationVersionDataType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConnectionTransportDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConnectionTransportDataType.java
index 772e866833..717ca23971 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConnectionTransportDataType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ConnectionTransportDataType.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ConnectionTransportDataType extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "15620";
+  public Integer getExtensionId() {
+    return (int) 15620;
   }
 
   public ConnectionTransportDataType() {
@@ -71,7 +71,7 @@ public class ConnectionTransportDataType extends ExtensionObjectDefinition imple
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ConnectionTransportDataType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilter.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilter.java
index 0d737481b0..89ef5f78be 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilter.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilter.java
@@ -38,25 +38,19 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ContentFilter extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "588";
+  public Integer getExtensionId() {
+    return (int) 588;
   }
 
   // Properties.
-  protected final int noOfElements;
-  protected final List<ExtensionObjectDefinition> elements;
+  protected final List<ContentFilterElement> elements;
 
-  public ContentFilter(int noOfElements, List<ExtensionObjectDefinition> elements) {
+  public ContentFilter(List<ContentFilterElement> elements) {
     super();
-    this.noOfElements = noOfElements;
     this.elements = elements;
   }
 
-  public int getNoOfElements() {
-    return noOfElements;
-  }
-
-  public List<ExtensionObjectDefinition> getElements() {
+  public List<ContentFilterElement> getElements() {
     return elements;
   }
 
@@ -67,8 +61,10 @@ public class ContentFilter extends ExtensionObjectDefinition implements Message
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     writeBuffer.pushContext("ContentFilter");
 
-    // Simple Field (noOfElements)
-    writeSimpleField("noOfElements", noOfElements, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfElements) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfElements = (int) ((((getElements()) == (null)) ? -(1) : COUNT(getElements())));
+    writeImplicitField("noOfElements", noOfElements, writeSignedInt(writeBuffer, 32));
 
     // Array Field (elements)
     writeComplexTypeArrayField("elements", elements, writeBuffer);
@@ -87,13 +83,13 @@ public class ContentFilter extends ExtensionObjectDefinition implements Message
     ContentFilter _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (noOfElements)
+    // Implicit Field (noOfElements)
     lengthInBits += 32;
 
     // Array field
     if (elements != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : elements) {
+      for (ContentFilterElement element : elements) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= elements.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -103,38 +99,38 @@ public class ContentFilter extends ExtensionObjectDefinition implements Message
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ContentFilter");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int noOfElements = readSimpleField("noOfElements", readSignedInt(readBuffer, 32));
+    int noOfElements = readImplicitField("noOfElements", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> elements =
+    List<ContentFilterElement> elements =
         readCountArrayField(
             "elements",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("585")),
+                () ->
+                    (ContentFilterElement)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (585)),
                 readBuffer),
             noOfElements);
 
     readBuffer.closeContext("ContentFilter");
     // Create the instance
-    return new ContentFilterBuilderImpl(noOfElements, elements);
+    return new ContentFilterBuilderImpl(elements);
   }
 
   public static class ContentFilterBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final int noOfElements;
-    private final List<ExtensionObjectDefinition> elements;
+    private final List<ContentFilterElement> elements;
 
-    public ContentFilterBuilderImpl(int noOfElements, List<ExtensionObjectDefinition> elements) {
-      this.noOfElements = noOfElements;
+    public ContentFilterBuilderImpl(List<ContentFilterElement> elements) {
       this.elements = elements;
     }
 
     public ContentFilter build() {
-      ContentFilter contentFilter = new ContentFilter(noOfElements, elements);
+      ContentFilter contentFilter = new ContentFilter(elements);
       return contentFilter;
     }
   }
@@ -148,15 +144,12 @@ public class ContentFilter extends ExtensionObjectDefinition implements Message
       return false;
     }
     ContentFilter that = (ContentFilter) o;
-    return (getNoOfElements() == that.getNoOfElements())
-        && (getElements() == that.getElements())
-        && super.equals(that)
-        && true;
+    return (getElements() == that.getElements()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getNoOfElements(), getElements());
+    return Objects.hash(super.hashCode(), getElements());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElement.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElement.java
index dbf3a2da87..e41a19322b 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElement.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElement.java
@@ -38,20 +38,17 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ContentFilterElement extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "585";
+  public Integer getExtensionId() {
+    return (int) 585;
   }
 
   // Properties.
   protected final FilterOperator filterOperator;
-  protected final int noOfFilterOperands;
   protected final List<ExtensionObject> filterOperands;
 
-  public ContentFilterElement(
-      FilterOperator filterOperator, int noOfFilterOperands, List<ExtensionObject> filterOperands) {
+  public ContentFilterElement(FilterOperator filterOperator, List<ExtensionObject> filterOperands) {
     super();
     this.filterOperator = filterOperator;
-    this.noOfFilterOperands = noOfFilterOperands;
     this.filterOperands = filterOperands;
   }
 
@@ -59,10 +56,6 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
     return filterOperator;
   }
 
-  public int getNoOfFilterOperands() {
-    return noOfFilterOperands;
-  }
-
   public List<ExtensionObject> getFilterOperands() {
     return filterOperands;
   }
@@ -82,8 +75,11 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
         writeEnum(
             FilterOperator::getValue, FilterOperator::name, writeUnsignedLong(writeBuffer, 32)));
 
-    // Simple Field (noOfFilterOperands)
-    writeSimpleField("noOfFilterOperands", noOfFilterOperands, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfFilterOperands) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfFilterOperands =
+        (int) ((((getFilterOperands()) == (null)) ? -(1) : COUNT(getFilterOperands())));
+    writeImplicitField("noOfFilterOperands", noOfFilterOperands, writeSignedInt(writeBuffer, 32));
 
     // Array Field (filterOperands)
     writeComplexTypeArrayField("filterOperands", filterOperands, writeBuffer);
@@ -105,7 +101,7 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
     // Simple field (filterOperator)
     lengthInBits += 32;
 
-    // Simple field (noOfFilterOperands)
+    // Implicit Field (noOfFilterOperands)
     lengthInBits += 32;
 
     // Array field
@@ -121,7 +117,7 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ContentFilterElement");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -132,7 +128,7 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
             "FilterOperator",
             readEnum(FilterOperator::enumForValue, readUnsignedLong(readBuffer, 32)));
 
-    int noOfFilterOperands = readSimpleField("noOfFilterOperands", readSignedInt(readBuffer, 32));
+    int noOfFilterOperands = readImplicitField("noOfFilterOperands", readSignedInt(readBuffer, 32));
 
     List<ExtensionObject> filterOperands =
         readCountArrayField(
@@ -143,27 +139,23 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
 
     readBuffer.closeContext("ContentFilterElement");
     // Create the instance
-    return new ContentFilterElementBuilderImpl(filterOperator, noOfFilterOperands, filterOperands);
+    return new ContentFilterElementBuilderImpl(filterOperator, filterOperands);
   }
 
   public static class ContentFilterElementBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final FilterOperator filterOperator;
-    private final int noOfFilterOperands;
     private final List<ExtensionObject> filterOperands;
 
     public ContentFilterElementBuilderImpl(
-        FilterOperator filterOperator,
-        int noOfFilterOperands,
-        List<ExtensionObject> filterOperands) {
+        FilterOperator filterOperator, List<ExtensionObject> filterOperands) {
       this.filterOperator = filterOperator;
-      this.noOfFilterOperands = noOfFilterOperands;
       this.filterOperands = filterOperands;
     }
 
     public ContentFilterElement build() {
       ContentFilterElement contentFilterElement =
-          new ContentFilterElement(filterOperator, noOfFilterOperands, filterOperands);
+          new ContentFilterElement(filterOperator, filterOperands);
       return contentFilterElement;
     }
   }
@@ -178,7 +170,6 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
     }
     ContentFilterElement that = (ContentFilterElement) o;
     return (getFilterOperator() == that.getFilterOperator())
-        && (getNoOfFilterOperands() == that.getNoOfFilterOperands())
         && (getFilterOperands() == that.getFilterOperands())
         && super.equals(that)
         && true;
@@ -186,8 +177,7 @@ public class ContentFilterElement extends ExtensionObjectDefinition implements M
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(), getFilterOperator(), getNoOfFilterOperands(), getFilterOperands());
+    return Objects.hash(super.hashCode(), getFilterOperator(), getFilterOperands());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElementResult.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElementResult.java
index 8e1fa70a67..03c1d313e5 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElementResult.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterElementResult.java
@@ -38,28 +38,22 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ContentFilterElementResult extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "606";
+  public Integer getExtensionId() {
+    return (int) 606;
   }
 
   // Properties.
   protected final StatusCode statusCode;
-  protected final int noOfOperandStatusCodes;
   protected final List<StatusCode> operandStatusCodes;
-  protected final int noOfOperandDiagnosticInfos;
   protected final List<DiagnosticInfo> operandDiagnosticInfos;
 
   public ContentFilterElementResult(
       StatusCode statusCode,
-      int noOfOperandStatusCodes,
       List<StatusCode> operandStatusCodes,
-      int noOfOperandDiagnosticInfos,
       List<DiagnosticInfo> operandDiagnosticInfos) {
     super();
     this.statusCode = statusCode;
-    this.noOfOperandStatusCodes = noOfOperandStatusCodes;
     this.operandStatusCodes = operandStatusCodes;
-    this.noOfOperandDiagnosticInfos = noOfOperandDiagnosticInfos;
     this.operandDiagnosticInfos = operandDiagnosticInfos;
   }
 
@@ -67,18 +61,10 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
     return statusCode;
   }
 
-  public int getNoOfOperandStatusCodes() {
-    return noOfOperandStatusCodes;
-  }
-
   public List<StatusCode> getOperandStatusCodes() {
     return operandStatusCodes;
   }
 
-  public int getNoOfOperandDiagnosticInfos() {
-    return noOfOperandDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getOperandDiagnosticInfos() {
     return operandDiagnosticInfos;
   }
@@ -93,15 +79,24 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
     // Simple Field (statusCode)
     writeSimpleField("statusCode", statusCode, writeComplex(writeBuffer));
 
-    // Simple Field (noOfOperandStatusCodes)
-    writeSimpleField(
+    // Implicit Field (noOfOperandStatusCodes) (Used for parsing, but its value is not stored as
+    // it's implicitly given by the objects content)
+    int noOfOperandStatusCodes =
+        (int) ((((getOperandStatusCodes()) == (null)) ? -(1) : COUNT(getOperandStatusCodes())));
+    writeImplicitField(
         "noOfOperandStatusCodes", noOfOperandStatusCodes, writeSignedInt(writeBuffer, 32));
 
     // Array Field (operandStatusCodes)
     writeComplexTypeArrayField("operandStatusCodes", operandStatusCodes, writeBuffer);
 
-    // Simple Field (noOfOperandDiagnosticInfos)
-    writeSimpleField(
+    // Implicit Field (noOfOperandDiagnosticInfos) (Used for parsing, but its value is not stored as
+    // it's implicitly given by the objects content)
+    int noOfOperandDiagnosticInfos =
+        (int)
+            ((((getOperandDiagnosticInfos()) == (null))
+                ? -(1)
+                : COUNT(getOperandDiagnosticInfos())));
+    writeImplicitField(
         "noOfOperandDiagnosticInfos", noOfOperandDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (operandDiagnosticInfos)
@@ -124,7 +119,7 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
     // Simple field (statusCode)
     lengthInBits += statusCode.getLengthInBits();
 
-    // Simple field (noOfOperandStatusCodes)
+    // Implicit Field (noOfOperandStatusCodes)
     lengthInBits += 32;
 
     // Array field
@@ -136,7 +131,7 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
       }
     }
 
-    // Simple field (noOfOperandDiagnosticInfos)
+    // Implicit Field (noOfOperandDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -152,7 +147,7 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ContentFilterElementResult");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
@@ -162,7 +157,7 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
             "statusCode", readComplex(() -> StatusCode.staticParse(readBuffer), readBuffer));
 
     int noOfOperandStatusCodes =
-        readSimpleField("noOfOperandStatusCodes", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfOperandStatusCodes", readSignedInt(readBuffer, 32));
 
     List<StatusCode> operandStatusCodes =
         readCountArrayField(
@@ -171,7 +166,7 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
             noOfOperandStatusCodes);
 
     int noOfOperandDiagnosticInfos =
-        readSimpleField("noOfOperandDiagnosticInfos", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfOperandDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> operandDiagnosticInfos =
         readCountArrayField(
@@ -182,42 +177,27 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
     readBuffer.closeContext("ContentFilterElementResult");
     // Create the instance
     return new ContentFilterElementResultBuilderImpl(
-        statusCode,
-        noOfOperandStatusCodes,
-        operandStatusCodes,
-        noOfOperandDiagnosticInfos,
-        operandDiagnosticInfos);
+        statusCode, operandStatusCodes, operandDiagnosticInfos);
   }
 
   public static class ContentFilterElementResultBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
     private final StatusCode statusCode;
-    private final int noOfOperandStatusCodes;
     private final List<StatusCode> operandStatusCodes;
-    private final int noOfOperandDiagnosticInfos;
     private final List<DiagnosticInfo> operandDiagnosticInfos;
 
     public ContentFilterElementResultBuilderImpl(
         StatusCode statusCode,
-        int noOfOperandStatusCodes,
         List<StatusCode> operandStatusCodes,
-        int noOfOperandDiagnosticInfos,
         List<DiagnosticInfo> operandDiagnosticInfos) {
       this.statusCode = statusCode;
-      this.noOfOperandStatusCodes = noOfOperandStatusCodes;
       this.operandStatusCodes = operandStatusCodes;
-      this.noOfOperandDiagnosticInfos = noOfOperandDiagnosticInfos;
       this.operandDiagnosticInfos = operandDiagnosticInfos;
     }
 
     public ContentFilterElementResult build() {
       ContentFilterElementResult contentFilterElementResult =
-          new ContentFilterElementResult(
-              statusCode,
-              noOfOperandStatusCodes,
-              operandStatusCodes,
-              noOfOperandDiagnosticInfos,
-              operandDiagnosticInfos);
+          new ContentFilterElementResult(statusCode, operandStatusCodes, operandDiagnosticInfos);
       return contentFilterElementResult;
     }
   }
@@ -232,9 +212,7 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
     }
     ContentFilterElementResult that = (ContentFilterElementResult) o;
     return (getStatusCode() == that.getStatusCode())
-        && (getNoOfOperandStatusCodes() == that.getNoOfOperandStatusCodes())
         && (getOperandStatusCodes() == that.getOperandStatusCodes())
-        && (getNoOfOperandDiagnosticInfos() == that.getNoOfOperandDiagnosticInfos())
         && (getOperandDiagnosticInfos() == that.getOperandDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -243,12 +221,7 @@ public class ContentFilterElementResult extends ExtensionObjectDefinition implem
   @Override
   public int hashCode() {
     return Objects.hash(
-        super.hashCode(),
-        getStatusCode(),
-        getNoOfOperandStatusCodes(),
-        getOperandStatusCodes(),
-        getNoOfOperandDiagnosticInfos(),
-        getOperandDiagnosticInfos());
+        super.hashCode(), getStatusCode(), getOperandStatusCodes(), getOperandDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterResult.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterResult.java
index 3551c7845b..d447f59974 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterResult.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ContentFilterResult.java
@@ -38,40 +38,26 @@ import org.apache.plc4x.java.spi.generation.*;
 public class ContentFilterResult extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "609";
+  public Integer getExtensionId() {
+    return (int) 609;
   }
 
   // Properties.
-  protected final int noOfElementResults;
-  protected final List<ExtensionObjectDefinition> elementResults;
-  protected final int noOfElementDiagnosticInfos;
+  protected final List<ContentFilterElementResult> elementResults;
   protected final List<DiagnosticInfo> elementDiagnosticInfos;
 
   public ContentFilterResult(
-      int noOfElementResults,
-      List<ExtensionObjectDefinition> elementResults,
-      int noOfElementDiagnosticInfos,
+      List<ContentFilterElementResult> elementResults,
       List<DiagnosticInfo> elementDiagnosticInfos) {
     super();
-    this.noOfElementResults = noOfElementResults;
     this.elementResults = elementResults;
-    this.noOfElementDiagnosticInfos = noOfElementDiagnosticInfos;
     this.elementDiagnosticInfos = elementDiagnosticInfos;
   }
 
-  public int getNoOfElementResults() {
-    return noOfElementResults;
-  }
-
-  public List<ExtensionObjectDefinition> getElementResults() {
+  public List<ContentFilterElementResult> getElementResults() {
     return elementResults;
   }
 
-  public int getNoOfElementDiagnosticInfos() {
-    return noOfElementDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getElementDiagnosticInfos() {
     return elementDiagnosticInfos;
   }
@@ -83,14 +69,23 @@ public class ContentFilterResult extends ExtensionObjectDefinition implements Me
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     writeBuffer.pushContext("ContentFilterResult");
 
-    // Simple Field (noOfElementResults)
-    writeSimpleField("noOfElementResults", noOfElementResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfElementResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfElementResults =
+        (int) ((((getElementResults()) == (null)) ? -(1) : COUNT(getElementResults())));
+    writeImplicitField("noOfElementResults", noOfElementResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (elementResults)
     writeComplexTypeArrayField("elementResults", elementResults, writeBuffer);
 
-    // Simple Field (noOfElementDiagnosticInfos)
-    writeSimpleField(
+    // Implicit Field (noOfElementDiagnosticInfos) (Used for parsing, but its value is not stored as
+    // it's implicitly given by the objects content)
+    int noOfElementDiagnosticInfos =
+        (int)
+            ((((getElementDiagnosticInfos()) == (null))
+                ? -(1)
+                : COUNT(getElementDiagnosticInfos())));
+    writeImplicitField(
         "noOfElementDiagnosticInfos", noOfElementDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (elementDiagnosticInfos)
@@ -110,19 +105,19 @@ public class ContentFilterResult extends ExtensionObjectDefinition implements Me
     ContentFilterResult _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (noOfElementResults)
+    // Implicit Field (noOfElementResults)
     lengthInBits += 32;
 
     // Array field
     if (elementResults != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : elementResults) {
+      for (ContentFilterElementResult element : elementResults) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= elementResults.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfElementDiagnosticInfos)
+    // Implicit Field (noOfElementDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -138,23 +133,25 @@ public class ContentFilterResult extends ExtensionObjectDefinition implements Me
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("ContentFilterResult");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int noOfElementResults = readSimpleField("noOfElementResults", readSignedInt(readBuffer, 32));
+    int noOfElementResults = readImplicitField("noOfElementResults", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> elementResults =
+    List<ContentFilterElementResult> elementResults =
         readCountArrayField(
             "elementResults",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("606")),
+                () ->
+                    (ContentFilterElementResult)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (606)),
                 readBuffer),
             noOfElementResults);
 
     int noOfElementDiagnosticInfos =
-        readSimpleField("noOfElementDiagnosticInfos", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfElementDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> elementDiagnosticInfos =
         readCountArrayField(
@@ -164,35 +161,24 @@ public class ContentFilterResult extends ExtensionObjectDefinition implements Me
 
     readBuffer.closeContext("ContentFilterResult");
     // Create the instance
-    return new ContentFilterResultBuilderImpl(
-        noOfElementResults, elementResults, noOfElementDiagnosticInfos, elementDiagnosticInfos);
+    return new ContentFilterResultBuilderImpl(elementResults, elementDiagnosticInfos);
   }
 
   public static class ContentFilterResultBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final int noOfElementResults;
-    private final List<ExtensionObjectDefinition> elementResults;
-    private final int noOfElementDiagnosticInfos;
+    private final List<ContentFilterElementResult> elementResults;
     private final List<DiagnosticInfo> elementDiagnosticInfos;
 
     public ContentFilterResultBuilderImpl(
-        int noOfElementResults,
-        List<ExtensionObjectDefinition> elementResults,
-        int noOfElementDiagnosticInfos,
+        List<ContentFilterElementResult> elementResults,
         List<DiagnosticInfo> elementDiagnosticInfos) {
-      this.noOfElementResults = noOfElementResults;
       this.elementResults = elementResults;
-      this.noOfElementDiagnosticInfos = noOfElementDiagnosticInfos;
       this.elementDiagnosticInfos = elementDiagnosticInfos;
     }
 
     public ContentFilterResult build() {
       ContentFilterResult contentFilterResult =
-          new ContentFilterResult(
-              noOfElementResults,
-              elementResults,
-              noOfElementDiagnosticInfos,
-              elementDiagnosticInfos);
+          new ContentFilterResult(elementResults, elementDiagnosticInfos);
       return contentFilterResult;
     }
   }
@@ -206,9 +192,7 @@ public class ContentFilterResult extends ExtensionObjectDefinition implements Me
       return false;
     }
     ContentFilterResult that = (ContentFilterResult) o;
-    return (getNoOfElementResults() == that.getNoOfElementResults())
-        && (getElementResults() == that.getElementResults())
-        && (getNoOfElementDiagnosticInfos() == that.getNoOfElementDiagnosticInfos())
+    return (getElementResults() == that.getElementResults())
         && (getElementDiagnosticInfos() == that.getElementDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -216,12 +200,7 @@ public class ContentFilterResult extends ExtensionObjectDefinition implements Me
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getNoOfElementResults(),
-        getElementResults(),
-        getNoOfElementDiagnosticInfos(),
-        getElementDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getElementResults(), getElementDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsRequest.java
index 9a0065d7bb..bb6a9fec22 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsRequest.java
@@ -38,32 +38,29 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "751";
+  public Integer getExtensionId() {
+    return (int) 751;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
+  protected final RequestHeader requestHeader;
   protected final long subscriptionId;
   protected final TimestampsToReturn timestampsToReturn;
-  protected final int noOfItemsToCreate;
-  protected final List<ExtensionObjectDefinition> itemsToCreate;
+  protected final List<MonitoredItemCreateRequest> itemsToCreate;
 
   public CreateMonitoredItemsRequest(
-      ExtensionObjectDefinition requestHeader,
+      RequestHeader requestHeader,
       long subscriptionId,
       TimestampsToReturn timestampsToReturn,
-      int noOfItemsToCreate,
-      List<ExtensionObjectDefinition> itemsToCreate) {
+      List<MonitoredItemCreateRequest> itemsToCreate) {
     super();
     this.requestHeader = requestHeader;
     this.subscriptionId = subscriptionId;
     this.timestampsToReturn = timestampsToReturn;
-    this.noOfItemsToCreate = noOfItemsToCreate;
     this.itemsToCreate = itemsToCreate;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
@@ -75,11 +72,7 @@ public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition imple
     return timestampsToReturn;
   }
 
-  public int getNoOfItemsToCreate() {
-    return noOfItemsToCreate;
-  }
-
-  public List<ExtensionObjectDefinition> getItemsToCreate() {
+  public List<MonitoredItemCreateRequest> getItemsToCreate() {
     return itemsToCreate;
   }
 
@@ -106,8 +99,11 @@ public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition imple
             TimestampsToReturn::name,
             writeUnsignedLong(writeBuffer, 32)));
 
-    // Simple Field (noOfItemsToCreate)
-    writeSimpleField("noOfItemsToCreate", noOfItemsToCreate, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfItemsToCreate) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfItemsToCreate =
+        (int) ((((getItemsToCreate()) == (null)) ? -(1) : COUNT(getItemsToCreate())));
+    writeImplicitField("noOfItemsToCreate", noOfItemsToCreate, writeSignedInt(writeBuffer, 32));
 
     // Array Field (itemsToCreate)
     writeComplexTypeArrayField("itemsToCreate", itemsToCreate, writeBuffer);
@@ -135,13 +131,13 @@ public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition imple
     // Simple field (timestampsToReturn)
     lengthInBits += 32;
 
-    // Simple field (noOfItemsToCreate)
+    // Implicit Field (noOfItemsToCreate)
     lengthInBits += 32;
 
     // Array field
     if (itemsToCreate != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : itemsToCreate) {
+      for (MonitoredItemCreateRequest element : itemsToCreate) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= itemsToCreate.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -151,16 +147,17 @@ public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition imple
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CreateMonitoredItemsRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
     long subscriptionId = readSimpleField("subscriptionId", readUnsignedLong(readBuffer, 32));
@@ -171,47 +168,46 @@ public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition imple
             "TimestampsToReturn",
             readEnum(TimestampsToReturn::enumForValue, readUnsignedLong(readBuffer, 32)));
 
-    int noOfItemsToCreate = readSimpleField("noOfItemsToCreate", readSignedInt(readBuffer, 32));
+    int noOfItemsToCreate = readImplicitField("noOfItemsToCreate", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> itemsToCreate =
+    List<MonitoredItemCreateRequest> itemsToCreate =
         readCountArrayField(
             "itemsToCreate",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("745")),
+                () ->
+                    (MonitoredItemCreateRequest)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (745)),
                 readBuffer),
             noOfItemsToCreate);
 
     readBuffer.closeContext("CreateMonitoredItemsRequest");
     // Create the instance
     return new CreateMonitoredItemsRequestBuilderImpl(
-        requestHeader, subscriptionId, timestampsToReturn, noOfItemsToCreate, itemsToCreate);
+        requestHeader, subscriptionId, timestampsToReturn, itemsToCreate);
   }
 
   public static class CreateMonitoredItemsRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
+    private final RequestHeader requestHeader;
     private final long subscriptionId;
     private final TimestampsToReturn timestampsToReturn;
-    private final int noOfItemsToCreate;
-    private final List<ExtensionObjectDefinition> itemsToCreate;
+    private final List<MonitoredItemCreateRequest> itemsToCreate;
 
     public CreateMonitoredItemsRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
+        RequestHeader requestHeader,
         long subscriptionId,
         TimestampsToReturn timestampsToReturn,
-        int noOfItemsToCreate,
-        List<ExtensionObjectDefinition> itemsToCreate) {
+        List<MonitoredItemCreateRequest> itemsToCreate) {
       this.requestHeader = requestHeader;
       this.subscriptionId = subscriptionId;
       this.timestampsToReturn = timestampsToReturn;
-      this.noOfItemsToCreate = noOfItemsToCreate;
       this.itemsToCreate = itemsToCreate;
     }
 
     public CreateMonitoredItemsRequest build() {
       CreateMonitoredItemsRequest createMonitoredItemsRequest =
           new CreateMonitoredItemsRequest(
-              requestHeader, subscriptionId, timestampsToReturn, noOfItemsToCreate, itemsToCreate);
+              requestHeader, subscriptionId, timestampsToReturn, itemsToCreate);
       return createMonitoredItemsRequest;
     }
   }
@@ -228,7 +224,6 @@ public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition imple
     return (getRequestHeader() == that.getRequestHeader())
         && (getSubscriptionId() == that.getSubscriptionId())
         && (getTimestampsToReturn() == that.getTimestampsToReturn())
-        && (getNoOfItemsToCreate() == that.getNoOfItemsToCreate())
         && (getItemsToCreate() == that.getItemsToCreate())
         && super.equals(that)
         && true;
@@ -241,7 +236,6 @@ public class CreateMonitoredItemsRequest extends ExtensionObjectDefinition imple
         getRequestHeader(),
         getSubscriptionId(),
         getTimestampsToReturn(),
-        getNoOfItemsToCreate(),
         getItemsToCreate());
   }
 
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsResponse.java
index 964a43f4d3..85e970be19 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateMonitoredItemsResponse.java
@@ -38,47 +38,33 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CreateMonitoredItemsResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "754";
+  public Integer getExtensionId() {
+    return (int) 754;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
-  protected final int noOfResults;
-  protected final List<ExtensionObjectDefinition> results;
-  protected final int noOfDiagnosticInfos;
+  protected final ResponseHeader responseHeader;
+  protected final List<MonitoredItemCreateResult> results;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public CreateMonitoredItemsResponse(
-      ExtensionObjectDefinition responseHeader,
-      int noOfResults,
-      List<ExtensionObjectDefinition> results,
-      int noOfDiagnosticInfos,
+      ResponseHeader responseHeader,
+      List<MonitoredItemCreateResult> results,
       List<DiagnosticInfo> diagnosticInfos) {
     super();
     this.responseHeader = responseHeader;
-    this.noOfResults = noOfResults;
     this.results = results;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
-  public int getNoOfResults() {
-    return noOfResults;
-  }
-
-  public List<ExtensionObjectDefinition> getResults() {
+  public List<MonitoredItemCreateResult> getResults() {
     return results;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -93,14 +79,19 @@ public class CreateMonitoredItemsResponse extends ExtensionObjectDefinition impl
     // Simple Field (responseHeader)
     writeSimpleField("responseHeader", responseHeader, writeComplex(writeBuffer));
 
-    // Simple Field (noOfResults)
-    writeSimpleField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfResults) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfResults = (int) ((((getResults()) == (null)) ? -(1) : COUNT(getResults())));
+    writeImplicitField("noOfResults", noOfResults, writeSignedInt(writeBuffer, 32));
 
     // Array Field (results)
     writeComplexTypeArrayField("results", results, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -122,19 +113,19 @@ public class CreateMonitoredItemsResponse extends ExtensionObjectDefinition impl
     // Simple field (responseHeader)
     lengthInBits += responseHeader.getLengthInBits();
 
-    // Simple field (noOfResults)
+    // Implicit Field (noOfResults)
     lengthInBits += 32;
 
     // Array field
     if (results != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : results) {
+      for (MonitoredItemCreateResult element : results) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= results.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -150,29 +141,33 @@ public class CreateMonitoredItemsResponse extends ExtensionObjectDefinition impl
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CreateMonitoredItemsResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
-    int noOfResults = readSimpleField("noOfResults", readSignedInt(readBuffer, 32));
+    int noOfResults = readImplicitField("noOfResults", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> results =
+    List<MonitoredItemCreateResult> results =
         readCountArrayField(
             "results",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("748")),
+                () ->
+                    (MonitoredItemCreateResult)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (748)),
                 readBuffer),
             noOfResults);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -182,35 +177,27 @@ public class CreateMonitoredItemsResponse extends ExtensionObjectDefinition impl
 
     readBuffer.closeContext("CreateMonitoredItemsResponse");
     // Create the instance
-    return new CreateMonitoredItemsResponseBuilderImpl(
-        responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+    return new CreateMonitoredItemsResponseBuilderImpl(responseHeader, results, diagnosticInfos);
   }
 
   public static class CreateMonitoredItemsResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
-    private final int noOfResults;
-    private final List<ExtensionObjectDefinition> results;
-    private final int noOfDiagnosticInfos;
+    private final ResponseHeader responseHeader;
+    private final List<MonitoredItemCreateResult> results;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public CreateMonitoredItemsResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
-        int noOfResults,
-        List<ExtensionObjectDefinition> results,
-        int noOfDiagnosticInfos,
+        ResponseHeader responseHeader,
+        List<MonitoredItemCreateResult> results,
         List<DiagnosticInfo> diagnosticInfos) {
       this.responseHeader = responseHeader;
-      this.noOfResults = noOfResults;
       this.results = results;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public CreateMonitoredItemsResponse build() {
       CreateMonitoredItemsResponse createMonitoredItemsResponse =
-          new CreateMonitoredItemsResponse(
-              responseHeader, noOfResults, results, noOfDiagnosticInfos, diagnosticInfos);
+          new CreateMonitoredItemsResponse(responseHeader, results, diagnosticInfos);
       return createMonitoredItemsResponse;
     }
   }
@@ -225,9 +212,7 @@ public class CreateMonitoredItemsResponse extends ExtensionObjectDefinition impl
     }
     CreateMonitoredItemsResponse that = (CreateMonitoredItemsResponse) o;
     return (getResponseHeader() == that.getResponseHeader())
-        && (getNoOfResults() == that.getNoOfResults())
         && (getResults() == that.getResults())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -235,13 +220,7 @@ public class CreateMonitoredItemsResponse extends ExtensionObjectDefinition impl
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getResponseHeader(),
-        getNoOfResults(),
-        getResults(),
-        getNoOfDiagnosticInfos(),
-        getDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getResponseHeader(), getResults(), getDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionRequest.java
index 818b57f6e9..f18022ff3b 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionRequest.java
@@ -38,13 +38,13 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CreateSessionRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "461";
+  public Integer getExtensionId() {
+    return (int) 461;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
-  protected final ExtensionObjectDefinition clientDescription;
+  protected final RequestHeader requestHeader;
+  protected final ApplicationDescription clientDescription;
   protected final PascalString serverUri;
   protected final PascalString endpointUrl;
   protected final PascalString sessionName;
@@ -54,8 +54,8 @@ public class CreateSessionRequest extends ExtensionObjectDefinition implements M
   protected final long maxResponseMessageSize;
 
   public CreateSessionRequest(
-      ExtensionObjectDefinition requestHeader,
-      ExtensionObjectDefinition clientDescription,
+      RequestHeader requestHeader,
+      ApplicationDescription clientDescription,
       PascalString serverUri,
       PascalString endpointUrl,
       PascalString sessionName,
@@ -75,11 +75,11 @@ public class CreateSessionRequest extends ExtensionObjectDefinition implements M
     this.maxResponseMessageSize = maxResponseMessageSize;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
-  public ExtensionObjectDefinition getClientDescription() {
+  public ApplicationDescription getClientDescription() {
     return clientDescription;
   }
 
@@ -192,23 +192,26 @@ public class CreateSessionRequest extends ExtensionObjectDefinition implements M
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CreateSessionRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
-    ExtensionObjectDefinition clientDescription =
+    ApplicationDescription clientDescription =
         readSimpleField(
             "clientDescription",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("310")),
+                () ->
+                    (ApplicationDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (310)),
                 readBuffer));
 
     PascalString serverUri =
@@ -254,8 +257,8 @@ public class CreateSessionRequest extends ExtensionObjectDefinition implements M
 
   public static class CreateSessionRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
-    private final ExtensionObjectDefinition clientDescription;
+    private final RequestHeader requestHeader;
+    private final ApplicationDescription clientDescription;
     private final PascalString serverUri;
     private final PascalString endpointUrl;
     private final PascalString sessionName;
@@ -265,8 +268,8 @@ public class CreateSessionRequest extends ExtensionObjectDefinition implements M
     private final long maxResponseMessageSize;
 
     public CreateSessionRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
-        ExtensionObjectDefinition clientDescription,
+        RequestHeader requestHeader,
+        ApplicationDescription clientDescription,
         PascalString serverUri,
         PascalString endpointUrl,
         PascalString sessionName,
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionResponse.java
index 8f61a0581b..d6c2592478 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSessionResponse.java
@@ -38,36 +38,32 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CreateSessionResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "464";
+  public Integer getExtensionId() {
+    return (int) 464;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
+  protected final ResponseHeader responseHeader;
   protected final NodeId sessionId;
   protected final NodeId authenticationToken;
   protected final double revisedSessionTimeout;
   protected final PascalByteString serverNonce;
   protected final PascalByteString serverCertificate;
-  protected final int noOfServerEndpoints;
-  protected final List<ExtensionObjectDefinition> serverEndpoints;
-  protected final int noOfServerSoftwareCertificates;
-  protected final List<ExtensionObjectDefinition> serverSoftwareCertificates;
-  protected final ExtensionObjectDefinition serverSignature;
+  protected final List<EndpointDescription> serverEndpoints;
+  protected final List<SignedSoftwareCertificate> serverSoftwareCertificates;
+  protected final SignatureData serverSignature;
   protected final long maxRequestMessageSize;
 
   public CreateSessionResponse(
-      ExtensionObjectDefinition responseHeader,
+      ResponseHeader responseHeader,
       NodeId sessionId,
       NodeId authenticationToken,
       double revisedSessionTimeout,
       PascalByteString serverNonce,
       PascalByteString serverCertificate,
-      int noOfServerEndpoints,
-      List<ExtensionObjectDefinition> serverEndpoints,
-      int noOfServerSoftwareCertificates,
-      List<ExtensionObjectDefinition> serverSoftwareCertificates,
-      ExtensionObjectDefinition serverSignature,
+      List<EndpointDescription> serverEndpoints,
+      List<SignedSoftwareCertificate> serverSoftwareCertificates,
+      SignatureData serverSignature,
       long maxRequestMessageSize) {
     super();
     this.responseHeader = responseHeader;
@@ -76,15 +72,13 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
     this.revisedSessionTimeout = revisedSessionTimeout;
     this.serverNonce = serverNonce;
     this.serverCertificate = serverCertificate;
-    this.noOfServerEndpoints = noOfServerEndpoints;
     this.serverEndpoints = serverEndpoints;
-    this.noOfServerSoftwareCertificates = noOfServerSoftwareCertificates;
     this.serverSoftwareCertificates = serverSoftwareCertificates;
     this.serverSignature = serverSignature;
     this.maxRequestMessageSize = maxRequestMessageSize;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
@@ -108,23 +102,15 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
     return serverCertificate;
   }
 
-  public int getNoOfServerEndpoints() {
-    return noOfServerEndpoints;
-  }
-
-  public List<ExtensionObjectDefinition> getServerEndpoints() {
+  public List<EndpointDescription> getServerEndpoints() {
     return serverEndpoints;
   }
 
-  public int getNoOfServerSoftwareCertificates() {
-    return noOfServerSoftwareCertificates;
-  }
-
-  public List<ExtensionObjectDefinition> getServerSoftwareCertificates() {
+  public List<SignedSoftwareCertificate> getServerSoftwareCertificates() {
     return serverSoftwareCertificates;
   }
 
-  public ExtensionObjectDefinition getServerSignature() {
+  public SignatureData getServerSignature() {
     return serverSignature;
   }
 
@@ -157,14 +143,23 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
     // Simple Field (serverCertificate)
     writeSimpleField("serverCertificate", serverCertificate, writeComplex(writeBuffer));
 
-    // Simple Field (noOfServerEndpoints)
-    writeSimpleField("noOfServerEndpoints", noOfServerEndpoints, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfServerEndpoints) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfServerEndpoints =
+        (int) ((((getServerEndpoints()) == (null)) ? -(1) : COUNT(getServerEndpoints())));
+    writeImplicitField("noOfServerEndpoints", noOfServerEndpoints, writeSignedInt(writeBuffer, 32));
 
     // Array Field (serverEndpoints)
     writeComplexTypeArrayField("serverEndpoints", serverEndpoints, writeBuffer);
 
-    // Simple Field (noOfServerSoftwareCertificates)
-    writeSimpleField(
+    // Implicit Field (noOfServerSoftwareCertificates) (Used for parsing, but its value is not
+    // stored as it's implicitly given by the objects content)
+    int noOfServerSoftwareCertificates =
+        (int)
+            ((((getServerSoftwareCertificates()) == (null))
+                ? -(1)
+                : COUNT(getServerSoftwareCertificates())));
+    writeImplicitField(
         "noOfServerSoftwareCertificates",
         noOfServerSoftwareCertificates,
         writeSignedInt(writeBuffer, 32));
@@ -212,25 +207,25 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
     // Simple field (serverCertificate)
     lengthInBits += serverCertificate.getLengthInBits();
 
-    // Simple field (noOfServerEndpoints)
+    // Implicit Field (noOfServerEndpoints)
     lengthInBits += 32;
 
     // Array field
     if (serverEndpoints != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : serverEndpoints) {
+      for (EndpointDescription element : serverEndpoints) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= serverEndpoints.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfServerSoftwareCertificates)
+    // Implicit Field (noOfServerSoftwareCertificates)
     lengthInBits += 32;
 
     // Array field
     if (serverSoftwareCertificates != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : serverSoftwareCertificates) {
+      for (SignedSoftwareCertificate element : serverSoftwareCertificates) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= serverSoftwareCertificates.size());
         lengthInBits += element.getLengthInBits();
       }
@@ -246,16 +241,17 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CreateSessionResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
     NodeId sessionId =
@@ -277,32 +273,38 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
             "serverCertificate",
             readComplex(() -> PascalByteString.staticParse(readBuffer), readBuffer));
 
-    int noOfServerEndpoints = readSimpleField("noOfServerEndpoints", readSignedInt(readBuffer, 32));
+    int noOfServerEndpoints =
+        readImplicitField("noOfServerEndpoints", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> serverEndpoints =
+    List<EndpointDescription> serverEndpoints =
         readCountArrayField(
             "serverEndpoints",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("314")),
+                () ->
+                    (EndpointDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (314)),
                 readBuffer),
             noOfServerEndpoints);
 
     int noOfServerSoftwareCertificates =
-        readSimpleField("noOfServerSoftwareCertificates", readSignedInt(readBuffer, 32));
+        readImplicitField("noOfServerSoftwareCertificates", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> serverSoftwareCertificates =
+    List<SignedSoftwareCertificate> serverSoftwareCertificates =
         readCountArrayField(
             "serverSoftwareCertificates",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("346")),
+                () ->
+                    (SignedSoftwareCertificate)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (346)),
                 readBuffer),
             noOfServerSoftwareCertificates);
 
-    ExtensionObjectDefinition serverSignature =
+    SignatureData serverSignature =
         readSimpleField(
             "serverSignature",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("458")),
+                () ->
+                    (SignatureData) ExtensionObjectDefinition.staticParse(readBuffer, (int) (458)),
                 readBuffer));
 
     long maxRequestMessageSize =
@@ -317,9 +319,7 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
         revisedSessionTimeout,
         serverNonce,
         serverCertificate,
-        noOfServerEndpoints,
         serverEndpoints,
-        noOfServerSoftwareCertificates,
         serverSoftwareCertificates,
         serverSignature,
         maxRequestMessageSize);
@@ -327,31 +327,27 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
 
   public static class CreateSessionResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
+    private final ResponseHeader responseHeader;
     private final NodeId sessionId;
     private final NodeId authenticationToken;
     private final double revisedSessionTimeout;
     private final PascalByteString serverNonce;
     private final PascalByteString serverCertificate;
-    private final int noOfServerEndpoints;
-    private final List<ExtensionObjectDefinition> serverEndpoints;
-    private final int noOfServerSoftwareCertificates;
-    private final List<ExtensionObjectDefinition> serverSoftwareCertificates;
-    private final ExtensionObjectDefinition serverSignature;
+    private final List<EndpointDescription> serverEndpoints;
+    private final List<SignedSoftwareCertificate> serverSoftwareCertificates;
+    private final SignatureData serverSignature;
     private final long maxRequestMessageSize;
 
     public CreateSessionResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
+        ResponseHeader responseHeader,
         NodeId sessionId,
         NodeId authenticationToken,
         double revisedSessionTimeout,
         PascalByteString serverNonce,
         PascalByteString serverCertificate,
-        int noOfServerEndpoints,
-        List<ExtensionObjectDefinition> serverEndpoints,
-        int noOfServerSoftwareCertificates,
-        List<ExtensionObjectDefinition> serverSoftwareCertificates,
-        ExtensionObjectDefinition serverSignature,
+        List<EndpointDescription> serverEndpoints,
+        List<SignedSoftwareCertificate> serverSoftwareCertificates,
+        SignatureData serverSignature,
         long maxRequestMessageSize) {
       this.responseHeader = responseHeader;
       this.sessionId = sessionId;
@@ -359,9 +355,7 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
       this.revisedSessionTimeout = revisedSessionTimeout;
       this.serverNonce = serverNonce;
       this.serverCertificate = serverCertificate;
-      this.noOfServerEndpoints = noOfServerEndpoints;
       this.serverEndpoints = serverEndpoints;
-      this.noOfServerSoftwareCertificates = noOfServerSoftwareCertificates;
       this.serverSoftwareCertificates = serverSoftwareCertificates;
       this.serverSignature = serverSignature;
       this.maxRequestMessageSize = maxRequestMessageSize;
@@ -376,9 +370,7 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
               revisedSessionTimeout,
               serverNonce,
               serverCertificate,
-              noOfServerEndpoints,
               serverEndpoints,
-              noOfServerSoftwareCertificates,
               serverSoftwareCertificates,
               serverSignature,
               maxRequestMessageSize);
@@ -401,9 +393,7 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
         && (getRevisedSessionTimeout() == that.getRevisedSessionTimeout())
         && (getServerNonce() == that.getServerNonce())
         && (getServerCertificate() == that.getServerCertificate())
-        && (getNoOfServerEndpoints() == that.getNoOfServerEndpoints())
         && (getServerEndpoints() == that.getServerEndpoints())
-        && (getNoOfServerSoftwareCertificates() == that.getNoOfServerSoftwareCertificates())
         && (getServerSoftwareCertificates() == that.getServerSoftwareCertificates())
         && (getServerSignature() == that.getServerSignature())
         && (getMaxRequestMessageSize() == that.getMaxRequestMessageSize())
@@ -421,9 +411,7 @@ public class CreateSessionResponse extends ExtensionObjectDefinition implements
         getRevisedSessionTimeout(),
         getServerNonce(),
         getServerCertificate(),
-        getNoOfServerEndpoints(),
         getServerEndpoints(),
-        getNoOfServerSoftwareCertificates(),
         getServerSoftwareCertificates(),
         getServerSignature(),
         getMaxRequestMessageSize());
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionRequest.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionRequest.java
index ca7ecac877..0e3de8c04b 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionRequest.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionRequest.java
@@ -38,12 +38,12 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CreateSubscriptionRequest extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "787";
+  public Integer getExtensionId() {
+    return (int) 787;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition requestHeader;
+  protected final RequestHeader requestHeader;
   protected final double requestedPublishingInterval;
   protected final long requestedLifetimeCount;
   protected final long requestedMaxKeepAliveCount;
@@ -52,7 +52,7 @@ public class CreateSubscriptionRequest extends ExtensionObjectDefinition impleme
   protected final short priority;
 
   public CreateSubscriptionRequest(
-      ExtensionObjectDefinition requestHeader,
+      RequestHeader requestHeader,
       double requestedPublishingInterval,
       long requestedLifetimeCount,
       long requestedMaxKeepAliveCount,
@@ -69,7 +69,7 @@ public class CreateSubscriptionRequest extends ExtensionObjectDefinition impleme
     this.priority = priority;
   }
 
-  public ExtensionObjectDefinition getRequestHeader() {
+  public RequestHeader getRequestHeader() {
     return requestHeader;
   }
 
@@ -178,16 +178,17 @@ public class CreateSubscriptionRequest extends ExtensionObjectDefinition impleme
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CreateSubscriptionRequest");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition requestHeader =
+    RequestHeader requestHeader =
         readSimpleField(
             "requestHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("391")),
+                () ->
+                    (RequestHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (391)),
                 readBuffer));
 
     double requestedPublishingInterval =
@@ -223,7 +224,7 @@ public class CreateSubscriptionRequest extends ExtensionObjectDefinition impleme
 
   public static class CreateSubscriptionRequestBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition requestHeader;
+    private final RequestHeader requestHeader;
     private final double requestedPublishingInterval;
     private final long requestedLifetimeCount;
     private final long requestedMaxKeepAliveCount;
@@ -232,7 +233,7 @@ public class CreateSubscriptionRequest extends ExtensionObjectDefinition impleme
     private final short priority;
 
     public CreateSubscriptionRequestBuilderImpl(
-        ExtensionObjectDefinition requestHeader,
+        RequestHeader requestHeader,
         double requestedPublishingInterval,
         long requestedLifetimeCount,
         long requestedMaxKeepAliveCount,
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionResponse.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionResponse.java
index 551971b8e0..f9b43e4eab 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionResponse.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CreateSubscriptionResponse.java
@@ -38,19 +38,19 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CreateSubscriptionResponse extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "790";
+  public Integer getExtensionId() {
+    return (int) 790;
   }
 
   // Properties.
-  protected final ExtensionObjectDefinition responseHeader;
+  protected final ResponseHeader responseHeader;
   protected final long subscriptionId;
   protected final double revisedPublishingInterval;
   protected final long revisedLifetimeCount;
   protected final long revisedMaxKeepAliveCount;
 
   public CreateSubscriptionResponse(
-      ExtensionObjectDefinition responseHeader,
+      ResponseHeader responseHeader,
       long subscriptionId,
       double revisedPublishingInterval,
       long revisedLifetimeCount,
@@ -63,7 +63,7 @@ public class CreateSubscriptionResponse extends ExtensionObjectDefinition implem
     this.revisedMaxKeepAliveCount = revisedMaxKeepAliveCount;
   }
 
-  public ExtensionObjectDefinition getResponseHeader() {
+  public ResponseHeader getResponseHeader() {
     return responseHeader;
   }
 
@@ -141,16 +141,17 @@ public class CreateSubscriptionResponse extends ExtensionObjectDefinition implem
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CreateSubscriptionResponse");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    ExtensionObjectDefinition responseHeader =
+    ResponseHeader responseHeader =
         readSimpleField(
             "responseHeader",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("394")),
+                () ->
+                    (ResponseHeader) ExtensionObjectDefinition.staticParse(readBuffer, (int) (394)),
                 readBuffer));
 
     long subscriptionId = readSimpleField("subscriptionId", readUnsignedLong(readBuffer, 32));
@@ -176,14 +177,14 @@ public class CreateSubscriptionResponse extends ExtensionObjectDefinition implem
 
   public static class CreateSubscriptionResponseBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final ExtensionObjectDefinition responseHeader;
+    private final ResponseHeader responseHeader;
     private final long subscriptionId;
     private final double revisedPublishingInterval;
     private final long revisedLifetimeCount;
     private final long revisedMaxKeepAliveCount;
 
     public CreateSubscriptionResponseBuilderImpl(
-        ExtensionObjectDefinition responseHeader,
+        ResponseHeader responseHeader,
         long subscriptionId,
         double revisedPublishingInterval,
         long revisedLifetimeCount,
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CurrencyUnitType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CurrencyUnitType.java
index b24026af1d..22c9f81fa1 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CurrencyUnitType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/CurrencyUnitType.java
@@ -38,8 +38,8 @@ import org.apache.plc4x.java.spi.generation.*;
 public class CurrencyUnitType extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "23500";
+  public Integer getExtensionId() {
+    return (int) 23500;
   }
 
   // Properties.
@@ -122,7 +122,7 @@ public class CurrencyUnitType extends ExtensionObjectDefinition implements Messa
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("CurrencyUnitType");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/IdentityMappingRuleType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataChangeFilter.java
similarity index 53%
copy from plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/IdentityMappingRuleType.java
copy to plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataChangeFilter.java
index 7eee500640..37d9320367 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/IdentityMappingRuleType.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataChangeFilter.java
@@ -35,29 +35,35 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class IdentityMappingRuleType extends ExtensionObjectDefinition implements Message {
+public class DataChangeFilter extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "15636";
+  public Integer getExtensionId() {
+    return (int) 724;
   }
 
   // Properties.
-  protected final IdentityCriteriaType criteriaType;
-  protected final PascalString criteria;
+  protected final DataChangeTrigger trigger;
+  protected final long deadbandType;
+  protected final double deadbandValue;
 
-  public IdentityMappingRuleType(IdentityCriteriaType criteriaType, PascalString criteria) {
+  public DataChangeFilter(DataChangeTrigger trigger, long deadbandType, double deadbandValue) {
     super();
-    this.criteriaType = criteriaType;
-    this.criteria = criteria;
+    this.trigger = trigger;
+    this.deadbandType = deadbandType;
+    this.deadbandValue = deadbandValue;
   }
 
-  public IdentityCriteriaType getCriteriaType() {
-    return criteriaType;
+  public DataChangeTrigger getTrigger() {
+    return trigger;
   }
 
-  public PascalString getCriteria() {
-    return criteria;
+  public long getDeadbandType() {
+    return deadbandType;
+  }
+
+  public double getDeadbandValue() {
+    return deadbandValue;
   }
 
   @Override
@@ -65,22 +71,25 @@ public class IdentityMappingRuleType extends ExtensionObjectDefinition implement
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
-    writeBuffer.pushContext("IdentityMappingRuleType");
+    writeBuffer.pushContext("DataChangeFilter");
 
-    // Simple Field (criteriaType)
+    // Simple Field (trigger)
     writeSimpleEnumField(
-        "criteriaType",
-        "IdentityCriteriaType",
-        criteriaType,
+        "trigger",
+        "DataChangeTrigger",
+        trigger,
         writeEnum(
-            IdentityCriteriaType::getValue,
-            IdentityCriteriaType::name,
+            DataChangeTrigger::getValue,
+            DataChangeTrigger::name,
             writeUnsignedLong(writeBuffer, 32)));
 
-    // Simple Field (criteria)
-    writeSimpleField("criteria", criteria, writeComplex(writeBuffer));
+    // Simple Field (deadbandType)
+    writeSimpleField("deadbandType", deadbandType, writeUnsignedLong(writeBuffer, 32));
 
-    writeBuffer.popContext("IdentityMappingRuleType");
+    // Simple Field (deadbandValue)
+    writeSimpleField("deadbandValue", deadbandValue, writeDouble(writeBuffer, 64));
+
+    writeBuffer.popContext("DataChangeFilter");
   }
 
   @Override
@@ -91,54 +100,59 @@ public class IdentityMappingRuleType extends ExtensionObjectDefinition implement
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    IdentityMappingRuleType _value = this;
+    DataChangeFilter _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Simple field (criteriaType)
+    // Simple field (trigger)
     lengthInBits += 32;
 
-    // Simple field (criteria)
-    lengthInBits += criteria.getLengthInBits();
+    // Simple field (deadbandType)
+    lengthInBits += 32;
+
+    // Simple field (deadbandValue)
+    lengthInBits += 64;
 
     return lengthInBits;
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
-    readBuffer.pullContext("IdentityMappingRuleType");
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("DataChangeFilter");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    IdentityCriteriaType criteriaType =
+    DataChangeTrigger trigger =
         readEnumField(
-            "criteriaType",
-            "IdentityCriteriaType",
-            readEnum(IdentityCriteriaType::enumForValue, readUnsignedLong(readBuffer, 32)));
+            "trigger",
+            "DataChangeTrigger",
+            readEnum(DataChangeTrigger::enumForValue, readUnsignedLong(readBuffer, 32)));
+
+    long deadbandType = readSimpleField("deadbandType", readUnsignedLong(readBuffer, 32));
 
-    PascalString criteria =
-        readSimpleField(
-            "criteria", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+    double deadbandValue = readSimpleField("deadbandValue", readDouble(readBuffer, 64));
 
-    readBuffer.closeContext("IdentityMappingRuleType");
+    readBuffer.closeContext("DataChangeFilter");
     // Create the instance
-    return new IdentityMappingRuleTypeBuilderImpl(criteriaType, criteria);
+    return new DataChangeFilterBuilderImpl(trigger, deadbandType, deadbandValue);
   }
 
-  public static class IdentityMappingRuleTypeBuilderImpl
+  public static class DataChangeFilterBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final IdentityCriteriaType criteriaType;
-    private final PascalString criteria;
-
-    public IdentityMappingRuleTypeBuilderImpl(
-        IdentityCriteriaType criteriaType, PascalString criteria) {
-      this.criteriaType = criteriaType;
-      this.criteria = criteria;
+    private final DataChangeTrigger trigger;
+    private final long deadbandType;
+    private final double deadbandValue;
+
+    public DataChangeFilterBuilderImpl(
+        DataChangeTrigger trigger, long deadbandType, double deadbandValue) {
+      this.trigger = trigger;
+      this.deadbandType = deadbandType;
+      this.deadbandValue = deadbandValue;
     }
 
-    public IdentityMappingRuleType build() {
-      IdentityMappingRuleType identityMappingRuleType =
-          new IdentityMappingRuleType(criteriaType, criteria);
-      return identityMappingRuleType;
+    public DataChangeFilter build() {
+      DataChangeFilter dataChangeFilter =
+          new DataChangeFilter(trigger, deadbandType, deadbandValue);
+      return dataChangeFilter;
     }
   }
 
@@ -147,19 +161,20 @@ public class IdentityMappingRuleType extends ExtensionObjectDefinition implement
     if (this == o) {
       return true;
     }
-    if (!(o instanceof IdentityMappingRuleType)) {
+    if (!(o instanceof DataChangeFilter)) {
       return false;
     }
-    IdentityMappingRuleType that = (IdentityMappingRuleType) o;
-    return (getCriteriaType() == that.getCriteriaType())
-        && (getCriteria() == that.getCriteria())
+    DataChangeFilter that = (DataChangeFilter) o;
+    return (getTrigger() == that.getTrigger())
+        && (getDeadbandType() == that.getDeadbandType())
+        && (getDeadbandValue() == that.getDeadbandValue())
         && super.equals(that)
         && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getCriteriaType(), getCriteria());
+    return Objects.hash(super.hashCode(), getTrigger(), getDeadbandType(), getDeadbandValue());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataChangeNotification.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataChangeNotification.java
index e3923bb984..c8779f62d9 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataChangeNotification.java
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataChangeNotification.java
@@ -38,40 +38,25 @@ import org.apache.plc4x.java.spi.generation.*;
 public class DataChangeNotification extends ExtensionObjectDefinition implements Message {
 
   // Accessors for discriminator values.
-  public String getIdentifier() {
-    return (String) "811";
+  public Integer getExtensionId() {
+    return (int) 811;
   }
 
   // Properties.
-  protected final int noOfMonitoredItems;
-  protected final List<ExtensionObjectDefinition> monitoredItems;
-  protected final int noOfDiagnosticInfos;
+  protected final List<MonitoredItemNotification> monitoredItems;
   protected final List<DiagnosticInfo> diagnosticInfos;
 
   public DataChangeNotification(
-      int noOfMonitoredItems,
-      List<ExtensionObjectDefinition> monitoredItems,
-      int noOfDiagnosticInfos,
-      List<DiagnosticInfo> diagnosticInfos) {
+      List<MonitoredItemNotification> monitoredItems, List<DiagnosticInfo> diagnosticInfos) {
     super();
-    this.noOfMonitoredItems = noOfMonitoredItems;
     this.monitoredItems = monitoredItems;
-    this.noOfDiagnosticInfos = noOfDiagnosticInfos;
     this.diagnosticInfos = diagnosticInfos;
   }
 
-  public int getNoOfMonitoredItems() {
-    return noOfMonitoredItems;
-  }
-
-  public List<ExtensionObjectDefinition> getMonitoredItems() {
+  public List<MonitoredItemNotification> getMonitoredItems() {
     return monitoredItems;
   }
 
-  public int getNoOfDiagnosticInfos() {
-    return noOfDiagnosticInfos;
-  }
-
   public List<DiagnosticInfo> getDiagnosticInfos() {
     return diagnosticInfos;
   }
@@ -83,19 +68,20 @@ public class DataChangeNotification extends ExtensionObjectDefinition implements
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
     writeBuffer.pushContext("DataChangeNotification");
 
-    // Implicit Field (notificationLength) (Used for parsing, but its value is not stored as it's
+    // Implicit Field (noOfMonitoredItems) (Used for parsing, but its value is not stored as it's
     // implicitly given by the objects content)
-    int notificationLength = (int) (getLengthInBytes());
-    writeImplicitField("notificationLength", notificationLength, writeSignedInt(writeBuffer, 32));
-
-    // Simple Field (noOfMonitoredItems)
-    writeSimpleField("noOfMonitoredItems", noOfMonitoredItems, writeSignedInt(writeBuffer, 32));
+    int noOfMonitoredItems =
+        (int) ((((getMonitoredItems()) == (null)) ? -(1) : COUNT(getMonitoredItems())));
+    writeImplicitField("noOfMonitoredItems", noOfMonitoredItems, writeSignedInt(writeBuffer, 32));
 
     // Array Field (monitoredItems)
     writeComplexTypeArrayField("monitoredItems", monitoredItems, writeBuffer);
 
-    // Simple Field (noOfDiagnosticInfos)
-    writeSimpleField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
+    // Implicit Field (noOfDiagnosticInfos) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfDiagnosticInfos =
+        (int) ((((getDiagnosticInfos()) == (null)) ? -(1) : COUNT(getDiagnosticInfos())));
+    writeImplicitField("noOfDiagnosticInfos", noOfDiagnosticInfos, writeSignedInt(writeBuffer, 32));
 
     // Array Field (diagnosticInfos)
     writeComplexTypeArrayField("diagnosticInfos", diagnosticInfos, writeBuffer);
@@ -114,22 +100,19 @@ public class DataChangeNotification extends ExtensionObjectDefinition implements
     DataChangeNotification _value = this;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    // Implicit Field (notificationLength)
-    lengthInBits += 32;
-
-    // Simple field (noOfMonitoredItems)
+    // Implicit Field (noOfMonitoredItems)
     lengthInBits += 32;
 
     // Array field
     if (monitoredItems != null) {
       int i = 0;
-      for (ExtensionObjectDefinition element : monitoredItems) {
+      for (MonitoredItemNotification element : monitoredItems) {
         ThreadLocalHelper.lastItemThreadLocal.set(++i >= monitoredItems.size());
         lengthInBits += element.getLengthInBits();
       }
     }
 
-    // Simple field (noOfDiagnosticInfos)
+    // Implicit Field (noOfDiagnosticInfos)
     lengthInBits += 32;
 
     // Array field
@@ -145,24 +128,25 @@ public class DataChangeNotification extends ExtensionObjectDefinition implements
   }
 
   public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
-      ReadBuffer readBuffer, String identifier) throws ParseException {
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
     readBuffer.pullContext("DataChangeNotification");
     PositionAware positionAware = readBuffer;
     boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
 
-    int notificationLength = readImplicitField("notificationLength", readSignedInt(readBuffer, 32));
-
-    int noOfMonitoredItems = readSimpleField("noOfMonitoredItems", readSignedInt(readBuffer, 32));
+    int noOfMonitoredItems = readImplicitField("noOfMonitoredItems", readSignedInt(readBuffer, 32));
 
-    List<ExtensionObjectDefinition> monitoredItems =
+    List<MonitoredItemNotification> monitoredItems =
         readCountArrayField(
             "monitoredItems",
             readComplex(
-                () -> ExtensionObjectDefinition.staticParse(readBuffer, (String) ("808")),
+                () ->
+                    (MonitoredItemNotification)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (808)),
                 readBuffer),
             noOfMonitoredItems);
 
-    int noOfDiagnosticInfos = readSimpleField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
+    int noOfDiagnosticInfos =
+        readImplicitField("noOfDiagnosticInfos", readSignedInt(readBuffer, 32));
 
     List<DiagnosticInfo> diagnosticInfos =
         readCountArrayField(
@@ -172,32 +156,23 @@ public class DataChangeNotification extends ExtensionObjectDefinition implements
 
     readBuffer.closeContext("DataChangeNotification");
     // Create the instance
-    return new DataChangeNotificationBuilderImpl(
-        noOfMonitoredItems, monitoredItems, noOfDiagnosticInfos, diagnosticInfos);
+    return new DataChangeNotificationBuilderImpl(monitoredItems, diagnosticInfos);
   }
 
   public static class DataChangeNotificationBuilderImpl
       implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
-    private final int noOfMonitoredItems;
-    private final List<ExtensionObjectDefinition> monitoredItems;
-    private final int noOfDiagnosticInfos;
+    private final List<MonitoredItemNotification> monitoredItems;
     private final List<DiagnosticInfo> diagnosticInfos;
 
     public DataChangeNotificationBuilderImpl(
-        int noOfMonitoredItems,
-        List<ExtensionObjectDefinition> monitoredItems,
-        int noOfDiagnosticInfos,
-        List<DiagnosticInfo> diagnosticInfos) {
-      this.noOfMonitoredItems = noOfMonitoredItems;
+        List<MonitoredItemNotification> monitoredItems, List<DiagnosticInfo> diagnosticInfos) {
       this.monitoredItems = monitoredItems;
-      this.noOfDiagnosticInfos = noOfDiagnosticInfos;
       this.diagnosticInfos = diagnosticInfos;
     }
 
     public DataChangeNotification build() {
       DataChangeNotification dataChangeNotification =
-          new DataChangeNotification(
-              noOfMonitoredItems, monitoredItems, noOfDiagnosticInfos, diagnosticInfos);
+          new DataChangeNotification(monitoredItems, diagnosticInfos);
       return dataChangeNotification;
     }
   }
@@ -211,9 +186,7 @@ public class DataChangeNotification extends ExtensionObjectDefinition implements
       return false;
     }
     DataChangeNotification that = (DataChangeNotification) o;
-    return (getNoOfMonitoredItems() == that.getNoOfMonitoredItems())
-        && (getMonitoredItems() == that.getMonitoredItems())
-        && (getNoOfDiagnosticInfos() == that.getNoOfDiagnosticInfos())
+    return (getMonitoredItems() == that.getMonitoredItems())
         && (getDiagnosticInfos() == that.getDiagnosticInfos())
         && super.equals(that)
         && true;
@@ -221,12 +194,7 @@ public class DataChangeNotification extends ExtensionObjectDefinition implements
 
   @Override
   public int hashCode() {
-    return Objects.hash(
-        super.hashCode(),
-        getNoOfMonitoredItems(),
-        getMonitoredItems(),
-        getNoOfDiagnosticInfos(),
-        getDiagnosticInfos());
+    return Objects.hash(super.hashCode(), getMonitoredItems(), getDiagnosticInfos());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataSetMetaDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataSetMetaDataType.java
new file mode 100644
index 0000000000..7fefc39482
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataSetMetaDataType.java
@@ -0,0 +1,461 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class DataSetMetaDataType extends ExtensionObjectDefinition implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getExtensionId() {
+    return (int) 14525;
+  }
+
+  // Properties.
+  protected final List<PascalString> namespaces;
+  protected final List<StructureDescription> structureDataTypes;
+  protected final List<EnumDescription> enumDataTypes;
+  protected final List<SimpleTypeDescription> simpleDataTypes;
+  protected final PascalString name;
+  protected final LocalizedText description;
+  protected final List<FieldMetaData> fields;
+  protected final GuidValue dataSetClassId;
+  protected final ConfigurationVersionDataType configurationVersion;
+
+  public DataSetMetaDataType(
+      List<PascalString> namespaces,
+      List<StructureDescription> structureDataTypes,
+      List<EnumDescription> enumDataTypes,
+      List<SimpleTypeDescription> simpleDataTypes,
+      PascalString name,
+      LocalizedText description,
+      List<FieldMetaData> fields,
+      GuidValue dataSetClassId,
+      ConfigurationVersionDataType configurationVersion) {
+    super();
+    this.namespaces = namespaces;
+    this.structureDataTypes = structureDataTypes;
+    this.enumDataTypes = enumDataTypes;
+    this.simpleDataTypes = simpleDataTypes;
+    this.name = name;
+    this.description = description;
+    this.fields = fields;
+    this.dataSetClassId = dataSetClassId;
+    this.configurationVersion = configurationVersion;
+  }
+
+  public List<PascalString> getNamespaces() {
+    return namespaces;
+  }
+
+  public List<StructureDescription> getStructureDataTypes() {
+    return structureDataTypes;
+  }
+
+  public List<EnumDescription> getEnumDataTypes() {
+    return enumDataTypes;
+  }
+
+  public List<SimpleTypeDescription> getSimpleDataTypes() {
+    return simpleDataTypes;
+  }
+
+  public PascalString getName() {
+    return name;
+  }
+
+  public LocalizedText getDescription() {
+    return description;
+  }
+
+  public List<FieldMetaData> getFields() {
+    return fields;
+  }
+
+  public GuidValue getDataSetClassId() {
+    return dataSetClassId;
+  }
+
+  public ConfigurationVersionDataType getConfigurationVersion() {
+    return configurationVersion;
+  }
+
+  @Override
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DataSetMetaDataType");
+
+    // Implicit Field (noOfNamespaces) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfNamespaces = (int) ((((getNamespaces()) == (null)) ? -(1) : COUNT(getNamespaces())));
+    writeImplicitField("noOfNamespaces", noOfNamespaces, writeSignedInt(writeBuffer, 32));
+
+    // Array Field (namespaces)
+    writeComplexTypeArrayField("namespaces", namespaces, writeBuffer);
+
+    // Implicit Field (noOfStructureDataTypes) (Used for parsing, but its value is not stored as
+    // it's implicitly given by the objects content)
+    int noOfStructureDataTypes =
+        (int) ((((getStructureDataTypes()) == (null)) ? -(1) : COUNT(getStructureDataTypes())));
+    writeImplicitField(
+        "noOfStructureDataTypes", noOfStructureDataTypes, writeSignedInt(writeBuffer, 32));
+
+    // Array Field (structureDataTypes)
+    writeComplexTypeArrayField("structureDataTypes", structureDataTypes, writeBuffer);
+
+    // Implicit Field (noOfEnumDataTypes) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfEnumDataTypes =
+        (int) ((((getEnumDataTypes()) == (null)) ? -(1) : COUNT(getEnumDataTypes())));
+    writeImplicitField("noOfEnumDataTypes", noOfEnumDataTypes, writeSignedInt(writeBuffer, 32));
+
+    // Array Field (enumDataTypes)
+    writeComplexTypeArrayField("enumDataTypes", enumDataTypes, writeBuffer);
+
+    // Implicit Field (noOfSimpleDataTypes) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    int noOfSimpleDataTypes =
+        (int) ((((getSimpleDataTypes()) == (null)) ? -(1) : COUNT(getSimpleDataTypes())));
+    writeImplicitField("noOfSimpleDataTypes", noOfSimpleDataTypes, writeSignedInt(writeBuffer, 32));
+
+    // Array Field (simpleDataTypes)
+    writeComplexTypeArrayField("simpleDataTypes", simpleDataTypes, writeBuffer);
+
+    // Simple Field (name)
+    writeSimpleField("name", name, writeComplex(writeBuffer));
+
+    // Simple Field (description)
+    writeSimpleField("description", description, writeComplex(writeBuffer));
+
+    // Implicit Field (noOfFields) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    int noOfFields = (int) ((((getFields()) == (null)) ? -(1) : COUNT(getFields())));
+    writeImplicitField("noOfFields", noOfFields, writeSignedInt(writeBuffer, 32));
+
+    // Array Field (fields)
+    writeComplexTypeArrayField("fields", fields, writeBuffer);
+
+    // Simple Field (dataSetClassId)
+    writeSimpleField("dataSetClassId", dataSetClassId, writeComplex(writeBuffer));
+
+    // Simple Field (configurationVersion)
+    writeSimpleField("configurationVersion", configurationVersion, writeComplex(writeBuffer));
+
+    writeBuffer.popContext("DataSetMetaDataType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    DataSetMetaDataType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Implicit Field (noOfNamespaces)
+    lengthInBits += 32;
+
+    // Array field
+    if (namespaces != null) {
+      int i = 0;
+      for (PascalString element : namespaces) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= namespaces.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Implicit Field (noOfStructureDataTypes)
+    lengthInBits += 32;
+
+    // Array field
+    if (structureDataTypes != null) {
+      int i = 0;
+      for (StructureDescription element : structureDataTypes) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= structureDataTypes.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Implicit Field (noOfEnumDataTypes)
+    lengthInBits += 32;
+
+    // Array field
+    if (enumDataTypes != null) {
+      int i = 0;
+      for (EnumDescription element : enumDataTypes) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= enumDataTypes.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Implicit Field (noOfSimpleDataTypes)
+    lengthInBits += 32;
+
+    // Array field
+    if (simpleDataTypes != null) {
+      int i = 0;
+      for (SimpleTypeDescription element : simpleDataTypes) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= simpleDataTypes.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Simple field (name)
+    lengthInBits += name.getLengthInBits();
+
+    // Simple field (description)
+    lengthInBits += description.getLengthInBits();
+
+    // Implicit Field (noOfFields)
+    lengthInBits += 32;
+
+    // Array field
+    if (fields != null) {
+      int i = 0;
+      for (FieldMetaData element : fields) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= fields.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Simple field (dataSetClassId)
+    lengthInBits += dataSetClassId.getLengthInBits();
+
+    // Simple field (configurationVersion)
+    lengthInBits += configurationVersion.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("DataSetMetaDataType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int noOfNamespaces = readImplicitField("noOfNamespaces", readSignedInt(readBuffer, 32));
+
+    List<PascalString> namespaces =
+        readCountArrayField(
+            "namespaces",
+            readComplex(() -> PascalString.staticParse(readBuffer), readBuffer),
+            noOfNamespaces);
+
+    int noOfStructureDataTypes =
+        readImplicitField("noOfStructureDataTypes", readSignedInt(readBuffer, 32));
+
+    List<StructureDescription> structureDataTypes =
+        readCountArrayField(
+            "structureDataTypes",
+            readComplex(
+                () ->
+                    (StructureDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (15489)),
+                readBuffer),
+            noOfStructureDataTypes);
+
+    int noOfEnumDataTypes = readImplicitField("noOfEnumDataTypes", readSignedInt(readBuffer, 32));
+
+    List<EnumDescription> enumDataTypes =
+        readCountArrayField(
+            "enumDataTypes",
+            readComplex(
+                () ->
+                    (EnumDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (15490)),
+                readBuffer),
+            noOfEnumDataTypes);
+
+    int noOfSimpleDataTypes =
+        readImplicitField("noOfSimpleDataTypes", readSignedInt(readBuffer, 32));
+
+    List<SimpleTypeDescription> simpleDataTypes =
+        readCountArrayField(
+            "simpleDataTypes",
+            readComplex(
+                () ->
+                    (SimpleTypeDescription)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (15007)),
+                readBuffer),
+            noOfSimpleDataTypes);
+
+    PascalString name =
+        readSimpleField(
+            "name", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    LocalizedText description =
+        readSimpleField(
+            "description", readComplex(() -> LocalizedText.staticParse(readBuffer), readBuffer));
+
+    int noOfFields = readImplicitField("noOfFields", readSignedInt(readBuffer, 32));
+
+    List<FieldMetaData> fields =
+        readCountArrayField(
+            "fields",
+            readComplex(
+                () ->
+                    (FieldMetaData)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (14526)),
+                readBuffer),
+            noOfFields);
+
+    GuidValue dataSetClassId =
+        readSimpleField(
+            "dataSetClassId", readComplex(() -> GuidValue.staticParse(readBuffer), readBuffer));
+
+    ConfigurationVersionDataType configurationVersion =
+        readSimpleField(
+            "configurationVersion",
+            readComplex(
+                () ->
+                    (ConfigurationVersionDataType)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (14595)),
+                readBuffer));
+
+    readBuffer.closeContext("DataSetMetaDataType");
+    // Create the instance
+    return new DataSetMetaDataTypeBuilderImpl(
+        namespaces,
+        structureDataTypes,
+        enumDataTypes,
+        simpleDataTypes,
+        name,
+        description,
+        fields,
+        dataSetClassId,
+        configurationVersion);
+  }
+
+  public static class DataSetMetaDataTypeBuilderImpl
+      implements ExtensionObjectDefinition.ExtensionObjectDefinitionBuilder {
+    private final List<PascalString> namespaces;
+    private final List<StructureDescription> structureDataTypes;
+    private final List<EnumDescription> enumDataTypes;
+    private final List<SimpleTypeDescription> simpleDataTypes;
+    private final PascalString name;
+    private final LocalizedText description;
+    private final List<FieldMetaData> fields;
+    private final GuidValue dataSetClassId;
+    private final ConfigurationVersionDataType configurationVersion;
+
+    public DataSetMetaDataTypeBuilderImpl(
+        List<PascalString> namespaces,
+        List<StructureDescription> structureDataTypes,
+        List<EnumDescription> enumDataTypes,
+        List<SimpleTypeDescription> simpleDataTypes,
+        PascalString name,
+        LocalizedText description,
+        List<FieldMetaData> fields,
+        GuidValue dataSetClassId,
+        ConfigurationVersionDataType configurationVersion) {
+      this.namespaces = namespaces;
+      this.structureDataTypes = structureDataTypes;
+      this.enumDataTypes = enumDataTypes;
+      this.simpleDataTypes = simpleDataTypes;
+      this.name = name;
+      this.description = description;
+      this.fields = fields;
+      this.dataSetClassId = dataSetClassId;
+      this.configurationVersion = configurationVersion;
+    }
+
+    public DataSetMetaDataType build() {
+      DataSetMetaDataType dataSetMetaDataType =
+          new DataSetMetaDataType(
+              namespaces,
+              structureDataTypes,
+              enumDataTypes,
+              simpleDataTypes,
+              name,
+              description,
+              fields,
+              dataSetClassId,
+              configurationVersion);
+      return dataSetMetaDataType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DataSetMetaDataType)) {
+      return false;
+    }
+    DataSetMetaDataType that = (DataSetMetaDataType) o;
+    return (getNamespaces() == that.getNamespaces())
+        && (getStructureDataTypes() == that.getStructureDataTypes())
+        && (getEnumDataTypes() == that.getEnumDataTypes())
+        && (getSimpleDataTypes() == that.getSimpleDataTypes())
+        && (getName() == that.getName())
+        && (getDescription() == that.getDescription())
+        && (getFields() == that.getFields())
+        && (getDataSetClassId() == that.getDataSetClassId())
+        && (getConfigurationVersion() == that.getConfigurationVersion())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getNamespaces(),
+        getStructureDataTypes(),
+        getEnumDataTypes(),
+        getSimpleDataTypes(),
+        getName(),
+        getDescription(),
+        getFields(),
+        getDataSetClassId(),
+        getConfigurationVersion());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataSetReaderDataType.java b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataSetReaderDataType.java
new file mode 100644
index 0000000000..4ee3f74a49
--- /dev/null
+++ b/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DataSetReaderDataType.java
@@ -0,0 +1,619 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.opcua.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class DataSetReaderDataType extends ExtensionObjectDefinition implements Message {
+
+  // Accessors for discriminator values.
+  public Integer getExtensionId() {
+    return (int) 15625;
+  }
+
+  // Properties.
+  protected final PascalString name;
+  protected final boolean enabled;
+  protected final Variant publisherId;
+  protected final int writerGroupId;
+  protected final int dataSetWriterId;
+  protected final DataSetMetaDataType dataSetMetaData;
+  protected final DataSetFieldContentMask dataSetFieldContentMask;
+  protected final double messageReceiveTimeout;
+  protected final long keyFrameCount;
+  protected final PascalString headerLayoutUri;
+  protected final MessageSecurityMode securityMode;
+  protected final PascalString securityGroupId;
+  protected final List<EndpointDescription> securityKeyServices;
+  protected final List<KeyValuePair> dataSetReaderProperties;
+  protected final ExtensionObject transportSettings;
+  protected final ExtensionObject messageSettings;
+  protected final ExtensionObject subscribedDataSet;
+
+  public DataSetReaderDataType(
+      PascalString name,
+      boolean enabled,
+      Variant publisherId,
+      int writerGroupId,
+      int dataSetWriterId,
+      DataSetMetaDataType dataSetMetaData,
+      DataSetFieldContentMask dataSetFieldContentMask,
+      double messageReceiveTimeout,
+      long keyFrameCount,
+      PascalString headerLayoutUri,
+      MessageSecurityMode securityMode,
+      PascalString securityGroupId,
+      List<EndpointDescription> securityKeyServices,
+      List<KeyValuePair> dataSetReaderProperties,
+      ExtensionObject transportSettings,
+      ExtensionObject messageSettings,
+      ExtensionObject subscribedDataSet) {
+    super();
+    this.name = name;
+    this.enabled = enabled;
+    this.publisherId = publisherId;
+    this.writerGroupId = writerGroupId;
+    this.dataSetWriterId = dataSetWriterId;
+    this.dataSetMetaData = dataSetMetaData;
+    this.dataSetFieldContentMask = dataSetFieldContentMask;
+    this.messageReceiveTimeout = messageReceiveTimeout;
+    this.keyFrameCount = keyFrameCount;
+    this.headerLayoutUri = headerLayoutUri;
+    this.securityMode = securityMode;
+    this.securityGroupId = securityGroupId;
+    this.securityKeyServices = securityKeyServices;
+    this.dataSetReaderProperties = dataSetReaderProperties;
+    this.transportSettings = transportSettings;
+    this.messageSettings = messageSettings;
+    this.subscribedDataSet = subscribedDataSet;
+  }
+
+  public PascalString getName() {
+    return name;
+  }
+
+  public boolean getEnabled() {
+    return enabled;
+  }
+
+  public Variant getPublisherId() {
+    return publisherId;
+  }
+
+  public int getWriterGroupId() {
+    return writerGroupId;
+  }
+
+  public int getDataSetWriterId() {
+    return dataSetWriterId;
+  }
+
+  public DataSetMetaDataType getDataSetMetaData() {
+    return dataSetMetaData;
+  }
+
+  public DataSetFieldContentMask getDataSetFieldContentMask() {
+    return dataSetFieldContentMask;
+  }
+
+  public double getMessageReceiveTimeout() {
+    return messageReceiveTimeout;
+  }
+
+  public long getKeyFrameCount() {
+    return keyFrameCount;
+  }
+
+  public PascalString getHeaderLayoutUri() {
+    return headerLayoutUri;
+  }
+
+  public MessageSecurityMode getSecurityMode() {
+    return securityMode;
+  }
+
+  public PascalString getSecurityGroupId() {
+    return securityGroupId;
+  }
+
+  public List<EndpointDescription> getSecurityKeyServices() {
+    return securityKeyServices;
+  }
+
+  public List<KeyValuePair> getDataSetReaderProperties() {
+    return dataSetReaderProperties;
+  }
+
+  public ExtensionObject getTransportSettings() {
+    return transportSettings;
+  }
+
+  public ExtensionObject getMessageSettings() {
+    return messageSettings;
+  }
+
+  public ExtensionObject getSubscribedDataSet() {
+    return subscribedDataSet;
+  }
+
+  @Override
+  protected void serializeExtensionObjectDefinitionChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DataSetReaderDataType");
+
+    // Simple Field (name)
+    writeSimpleField("name", name, writeComplex(writeBuffer));
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (byte) 0x00, writeUnsignedByte(writeBuffer, 7));
+
+    // Simple Field (enabled)
+    writeSimpleField("enabled", enabled, writeBoolean(writeBuffer));
+
+    // Simple Field (publisherId)
+    writeSimpleField("publisherId", publisherId, writeComplex(writeBuffer));
+
+    // Simple Field (writerGroupId)
+    writeSimpleField("writerGroupId", writerGroupId, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (dataSetWriterId)
+    writeSimpleField("dataSetWriterId", dataSetWriterId, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (dataSetMetaData)
+    writeSimpleField("dataSetMetaData", dataSetMetaData, writeComplex(writeBuffer));
+
+    // Simple Field (dataSetFieldContentMask)
+    writeSimpleEnumField(
+        "dataSetFieldContentMask",
+        "DataSetFieldContentMask",
+        dataSetFieldContentMask,
+        writeEnum(
+            DataSetFieldContentMask::getValue,
+            DataSetFieldContentMask::name,
+            writeUnsignedLong(writeBuffer, 32)));
+
+    // Simple Field (messageReceiveTimeout)
+    writeSimpleField("messageReceiveTimeout", messageReceiveTimeout, writeDouble(writeBuffer, 64));
+
+    // Simple Field (keyFrameCount)
+    writeSimpleField("keyFrameCount", keyFrameCount, writeUnsignedLong(writeBuffer, 32));
+
+    // Simple Field (headerLayoutUri)
+    writeSimpleField("headerLayoutUri", headerLayoutUri, writeComplex(writeBuffer));
+
+    // Simple Field (securityMode)
+    writeSimpleEnumField(
+        "securityMode",
+        "MessageSecurityMode",
+        securityMode,
+        writeEnum(
+            MessageSecurityMode::getValue,
+            MessageSecurityMode::name,
+            writeUnsignedLong(writeBuffer, 32)));
+
+    // Simple Field (securityGroupId)
+    writeSimpleField("securityGroupId", securityGroupId, writeComplex(writeBuffer));
+
+    // Implicit Field (noOfSecurityKeyServices) (Used for parsing, but its value is not stored as
+    // it's implicitly given by the objects content)
+    int noOfSecurityKeyServices =
+        (int) ((((getSecurityKeyServices()) == (null)) ? -(1) : COUNT(getSecurityKeyServices())));
+    writeImplicitField(
+        "noOfSecurityKeyServices", noOfSecurityKeyServices, writeSignedInt(writeBuffer, 32));
+
+    // Array Field (securityKeyServices)
+    writeComplexTypeArrayField("securityKeyServices", securityKeyServices, writeBuffer);
+
+    // Implicit Field (noOfDataSetReaderProperties) (Used for parsing, but its value is not stored
+    // as it's implicitly given by the objects content)
+    int noOfDataSetReaderProperties =
+        (int)
+            ((((getDataSetReaderProperties()) == (null))
+                ? -(1)
+                : COUNT(getDataSetReaderProperties())));
+    writeImplicitField(
+        "noOfDataSetReaderProperties",
+        noOfDataSetReaderProperties,
+        writeSignedInt(writeBuffer, 32));
+
+    // Array Field (dataSetReaderProperties)
+    writeComplexTypeArrayField("dataSetReaderProperties", dataSetReaderProperties, writeBuffer);
+
+    // Simple Field (transportSettings)
+    writeSimpleField("transportSettings", transportSettings, writeComplex(writeBuffer));
+
+    // Simple Field (messageSettings)
+    writeSimpleField("messageSettings", messageSettings, writeComplex(writeBuffer));
+
+    // Simple Field (subscribedDataSet)
+    writeSimpleField("subscribedDataSet", subscribedDataSet, writeComplex(writeBuffer));
+
+    writeBuffer.popContext("DataSetReaderDataType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    DataSetReaderDataType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (name)
+    lengthInBits += name.getLengthInBits();
+
+    // Reserved Field (reserved)
+    lengthInBits += 7;
+
+    // Simple field (enabled)
+    lengthInBits += 1;
+
+    // Simple field (publisherId)
+    lengthInBits += publisherId.getLengthInBits();
+
+    // Simple field (writerGroupId)
+    lengthInBits += 16;
+
+    // Simple field (dataSetWriterId)
+    lengthInBits += 16;
+
+    // Simple field (dataSetMetaData)
+    lengthInBits += dataSetMetaData.getLengthInBits();
+
+    // Simple field (dataSetFieldContentMask)
+    lengthInBits += 32;
+
+    // Simple field (messageReceiveTimeout)
+    lengthInBits += 64;
+
+    // Simple field (keyFrameCount)
+    lengthInBits += 32;
+
+    // Simple field (headerLayoutUri)
+    lengthInBits += headerLayoutUri.getLengthInBits();
+
+    // Simple field (securityMode)
+    lengthInBits += 32;
+
+    // Simple field (securityGroupId)
+    lengthInBits += securityGroupId.getLengthInBits();
+
+    // Implicit Field (noOfSecurityKeyServices)
+    lengthInBits += 32;
+
+    // Array field
+    if (securityKeyServices != null) {
+      int i = 0;
+      for (EndpointDescription element : securityKeyServices) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= securityKeyServices.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Implicit Field (noOfDataSetReaderProperties)
+    lengthInBits += 32;
+
+    // Array field
+    if (dataSetReaderProperties != null) {
+      int i = 0;
+      for (KeyValuePair element : dataSetReaderProperties) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= dataSetReaderProperties.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    // Simple field (transportSettings)
+    lengthInBits += transportSettings.getLengthInBits();
+
+    // Simple field (messageSettings)
+    lengthInBits += messageSettings.getLengthInBits();
+
+    // Simple field (subscribedDataSet)
+    lengthInBits += subscribedDataSet.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static ExtensionObjectDefinitionBuilder staticParseExtensionObjectDefinitionBuilder(
+      ReadBuffer readBuffer, Integer extensionId) throws ParseException {
+    readBuffer.pullContext("DataSetReaderDataType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    PascalString name =
+        readSimpleField(
+            "name", readComplex(() -> PascalString.staticParse(readBuffer), readBuffer));
+
+    Byte reservedField0 =
+        readReservedField("reserved", readUnsignedByte(readBuffer, 7), (byte) 0x00);
+
+    boolean enabled = readSimpleField("enabled", readBoolean(readBuffer));
+
+    Variant publisherId =
+        readSimpleField(
+            "publisherId", readComplex(() -> Variant.staticParse(readBuffer), readBuffer));
+
+    int writerGroupId = readSimpleField("writerGroupId", readUnsignedInt(readBuffer, 16));
+
+    int dataSetWriterId = readSimpleField("dataSetWriterId", readUnsignedInt(readBuffer, 16));
+
+    DataSetMetaDataType dataSetMetaData =
+        readSimpleField(
+            "dataSetMetaData",
+            readComplex(
+                () ->
+                    (DataSetMetaDataType)
+                        ExtensionObjectDefinition.staticParse(readBuffer, (int) (14525)),
... 48424 lines suppressed ...